Intereting Posts
Повторно сортировать результаты запроса get_posts Многоузловая установка на субдомен с субдоменами изменяет сайтURL WP Query-Связь между двумя настраиваемыми типами сообщений и их полями Какой метод лучше всего запускать в сценарии Почему cron не работает для меня? ACF sdd настраиваемые поля для категорий и отображения Изменение WP_CONTENT_DIR и WP_CONTENT_URL в wp-config.php не регистрируется? Почему это важно проверить на isset и is_array перед проверкой in_array в этом примере? Где я могу изменить значок на моем сайте WordPress? Как сохранить изменения имени или слова Slug при использовании wp_update_term при сохранении? Есть ли способ разместить социальные плагины facebook в php-файлы шаблонов страниц? Почтовая форма WordPress и электронная почта после Создание лучшего опыта поиска нескольких сайтов Есть ли способ нажимать javascript или css на странице в шаблоне через функции.php Сервер зависает, когда я выбираю меню плагинов из admin

Параметры строки запроса из настраиваемых полей, несогласованные результаты

У меня есть пользовательский тип сообщения, называемый course . В поле курса у меня есть несколько настраиваемых полей, в частности (все выпадающие course_or_project AFC): course_or_project , time_to_complete_project , time_to_complete_course и difficulty . У меня также есть таксономия, называемая course_project_category .

Моя цель – создать несколько выпадающих / слайдеров, создать URL-адрес, прочитав значения указанных выпадающих списков / слайдеров и нажав кнопку поиска, используйте строку запроса, которую я собрал (jQuery), чтобы фильтровать только правильные должности. Эта функциональность работает. Ну … иногда результаты немного смущены, т.е. только фильтрация по некоторым параметрам.

На код.

Я добавил функцию для отображения моих настраиваемых полей:

 function my_pre_get_posts( $query ) { // do not modify queries in the admin if( is_admin() ) { return $query; } // only modify queries for 'course' post type if( isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'course' ) { // allow the url to alter the query if( isset($_GET['course_or_project']) ) { $query->set('meta_key', 'course_or_project'); $query->set('meta_value', $_GET['course_or_project']); } if( isset($_GET['time_to_complete_project']) ) { $query->set('meta_key', 'time_to_complete_project'); $query->set('meta_value', $_GET['time_to_complete_project']); } if( isset($_GET['time_to_complete_course']) ) { $query->set('meta_key', 'time_to_complete_course'); $query->set('meta_value', $_GET['time_to_complete_course']); } if( isset($_GET['difficulty']) ) { $query->set('meta_key', 'difficulty'); $query->set('meta_value', $_GET['difficulty']); } } // return return $query; } add_action('pre_get_posts', 'my_pre_get_posts'); 

Запрос таксономии, похоже, работает из коробки.

Таким образом, пример моего завершенного URL-адреса может быть:

 http://localhost:3000/courses/?course_project_category=jokes&course_or_project=project&difficulty=easy&time_to_complete_project=15 

На данный момент мои результаты – смешанная сумка.

Из вышеприведенного запроса я вернул 2 сообщения, которые в основном соответствуют моим критериям, но, как конкретный пример, одно сообщение имеет значение time_to_complete_project как 30 хотя указанный запрос 15 .

Я не могу понять это. Я вижу, что все параметры доступны с помощью инструментов Chrome dev:

введите описание изображения здесь

Есть идеи?!

Обновить

Вот новый подход, который у меня есть, который работает (но не хватает валидации и санитарии):

 // array of filters (field key => field name) $GLOBALS['my_query_filters'] = array( 'field_1' => 'course_or_project', 'field_2' => 'difficulty', 'field_3' => 'time_to_complete_project', 'field_4' => 'time_to_complete_course' ); // action add_action('pre_get_posts', 'my_pre_get_posts', 10, 1); function my_pre_get_posts( $query ) { // bail early if is in admin if( is_admin() ) { return; } if( isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'course' ) { // get meta query $meta_query = $query->get('meta_query'); // loop over filters foreach( $GLOBALS['my_query_filters'] as $key => $name ) { // continue if not found in url if( empty($_GET[ $name ]) ) { continue; } // get the value for this filter // eg: http://www.website.com/events?city=melbourne,sydney $value = explode(',', $_GET[ $name ]); // append meta query $meta_query[] = array( 'key' => $name, 'value' => $value, 'compare' => 'IN', ); } // update meta query $query->set('meta_query', $meta_query); } } 

Solutions Collecting From Web of "Параметры строки запроса из настраиваемых полей, несогласованные результаты"

Вам нужно создать надлежащий meta_query . Ваш код будет работать только в том случае, если у вас есть один набор meta_key , если у вас больше 1, все будет зависеть.

Также обратите внимание: вы никогда не должны использовать какие-либо неатифицированные, не проверенные значения из переменной $_GET ( и, в любом случае, любые значения, поступающие откуда угодно ). Очень просто вводить вредоносный код на свой сайт, добавляя в свой URL скрипт. Валидация и санитария оказывают очень незначительное влияние на производительность, но определенно стоит того.

Чтобы решить вашу проблему, попробуйте перекодировать ваше действие. Я прокомментировал, где это необходимо.

 add_action( 'pre_get_posts', function ( $q ) { if ( !is_admin() // Do this only on the front end && $q->is_main_query() // Targets the main query only ) { if( isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'course' ) { // Not sure about this, can be $q->is_post_type_archive( 'course' ) // Get all our $_GET variables and sanitize and validate them $course_or_project = filter_input( INPUT_GET, 'course_or_project', FILTER_SANITIZE_STRING ); $time_to_complete_project = filter_input( INPUT_GET, 'time_to_complete_project', FILTER_SANITIZE_STRING ); $time_to_complete_course = filter_input( INPUT_GET, 'time_to_complete_course', FILTER_SANITIZE_STRING ); $difficulty = filter_input( INPUT_GET, 'difficulty', FILTER_VALIDATE_INT ); // Set our variable to hold the meta_query $meta_query = []; // Now we build our meta_query if( $course_or_project ) { $meta_query[] = [ 'key' => 'course_or_project', 'value' => $course_or_project ]; } if( $time_to_complete_project ) { $meta_query[] = [ 'key' => 'time_to_complete_project', 'value' => $time_to_complete_project ]; } if( $time_to_complete_course ) { $meta_query[] = [ 'key' => 'time_to_complete_course', 'value' => $time_to_complete_course ]; } if( $difficulty ) { $meta_query[] = [ 'key' => 'difficulty', 'value' => $difficulty ]; } // Make sure we have something in $meta_query before setting it if ( $meta_query ) $q->set( 'meta_query', $meta_query ); } } }); 

Вы можете уточнить запрос по мере необходимости, но это должно быть очень простым

Хорошо, вот что я получил в итоге. Я честно не уверен, правильно ли я дезинформировал параметры, поэтому приветствую их! Помимо этого, все работает по назначению. Большое спасибо Pieter Goosen!

 // action add_action('pre_get_posts', 'my_pre_get_posts', 10, 1); function my_pre_get_posts( $query ) { // bail early if is in admin if( is_admin() ) { return; } if( isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'course' ) { // array of filters (field key => field name) $GLOBALS['my_query_filters'] = array( 'field_1' => 'course_or_project', 'field_2' => 'difficulty', 'field_3' => 'time_to_complete_project', 'field_4' => 'time_to_complete_course' ); // get meta query $meta_query = $query->get('meta_query'); // loop over filters foreach( $GLOBALS['my_query_filters'] as $key => $name ) { // sanitize parameter $name = filter_input( INPUT_GET, $name, FILTER_SANITIZE_STRING ); // continue if not found in url if( empty($_GET[ $name ]) ) { continue; } // get the value for this filter // eg: http://www.website.com/events?city=melbourne,sydney $value = explode(',', $_GET[ $name ]); // append meta query $meta_query[] = array( 'key' => $name, 'value' => $value, ); } // update meta query $query->set('meta_query', $meta_query); } }