Intereting Posts
как сохранить многозначные значения флажков в wordpress динамически Поиск: как расширить существующий поиск, включив пользовательскую таблицу Убедитесь, что пользователь явно установил выдержку Как прикрепить нижний колонтитул к нижней части страницы? Установка тегов сообщений с использованием идентификатора тега Как включить поддомены в WordPress без использования плагина? Удалить запятую из последнего выхода элемента из цикла Изменение порядка результатов db при кодировании JSON WP_Editor – настройка расположения рендеринга на странице Возможность установки почты для обращения к контактной форме 7 через дополнительные пользовательские поля Как я могу разрешить ошибку внутреннего сервера .htaccess, устанавливая многопользовательский WordPress? Нужно ли регистрировать мои собственные файлы .js и .css? Разрешить гостям комментарии по одному сообщению Авто вход после регистрации Условное перенаправление с выходом

Выберите Все, не работающие в поисковом фильтре WordPress.

Я пытаюсь создать фильтр поиска в WordPress, чтобы фильтровать все пользовательские таксономии в пользовательском типе сообщений.

Я создал функцию, которая генерирует выпадающий список, поэтому я могу вывести каждое значение параметра как slug для моего фильтра, который уже работает. Моя единственная проблема заключается в том, что опция «Выбрать все» не работает.

Результаты возвращаются, когда ничего не найдено при выборе All. Фильтр может быть здесь .

Код, который я использовал для создания функции:

function adopt_custom_taxonomy_dropdown( $taxonomy, $orderby = 'date', $order = 'DESC', $limit = '-1', $name, $show_option_all = null, $show_option_none = null ) { $args = array( 'orderby' => $orderby, 'order' => $order, 'number' => $limit, ); $terms = get_terms( $taxonomy, $args ); $name = ( $name ) ? $name : $taxonomy; if ( $terms ) { printf( '<select name="%s" class="postform">', esc_attr( $name ) ); if ( $show_option_all ) { printf( '<option value="0">%s</option>', esc_html( $show_option_all ) ); } if ( $show_option_none ) { printf( '<option value="-1">%s</option>', esc_html( $show_option_none ) ); } foreach ( $terms as $term ) { printf( '<option value="%s">%s</option>', esc_attr( $term->slug ), esc_html( $term->name ) ); } print( '</select>' ); } } 

и вот где результаты тянутся к …

 <?php if (isset($_GET["farm-type"]) && empty($_GET["location-farms"])){ $farm_type = $_GET["farm-type"]; $myquery1['tax_query'] = array( array( 'taxonomy' => 'farm-type', 'terms' => array($farm_type), 'field' => 'slug', ), ); query_posts($myquery1); } ?> <?php if (isset($_GET["farm-type"]) && isset($_GET["location-farms"])){ $farm_type = $_GET["farm-type"]; $farm_location = $_GET["location-farms"]; $myquery2['tax_query'] = array( array( 'taxonomy' => 'farm-type', 'terms' => array($farm_type), 'field' => 'slug', ), array( 'taxonomy' => 'location-farms', 'terms' => array($farm_location), 'field' => 'slug', ), ); query_posts($myquery2); } ?> 

Пара примечаний:

  1. action вашей формы неверно: <form method="get" action="http://www.adoptapet.ie/archive-farm/"> . Страница <form method="get" action="http://www.adoptapet.ie/archive-farms/">
  2. Вы должны переупорядочить список аргументов для adopt_custom_taxonomy_dropdown() . Как было написано, большинство ваших аргументов имеют значения по умолчанию и могут быть опущены при вызове функции, за исключением того, что в качестве письменного аргумента 5 нет значения по умолчанию, поэтому на практике вы не можете опустить два, три и четыре. Переместите $name на передний план – гораздо удобнее.

     adopt_custom_taxonomy_dropdown( $taxonomy, $name, $orderby = 'date', $order = 'DESC', $limit = '-1', $show_option_all = null, $show_option_none = null ) 
  3. Не используйте query_posts() , когда-либо. Он захватывает основной запрос и может вызвать множество проблем.
  4. Хотя я не редактировал код в приведенных ниже предложениях, вы никогда не должны использовать данные, предоставленные пользователем, например $_GET без его очистки . $_GET и $_POST небезопасны .

Я думаю, что ваша проблема в основном логическая. Эта…

 isset($_GET["farm-type"]) && isset($_GET["location-farms"]) 

…. всегда будет правдой. $_GET["farm-type"] и $_GET["location-farms"] всегда будут установлены, когда ваша форма отправится , даже если они пусты. Вы должны использовать !empty() вместо этого.

И вы можете очистить этот код много :

 if (!empty($_GET["farm-type"])){ $farm_type = $_GET["farm-type"]; $myquery['tax_query'][] = array( 'taxonomy' => 'farm-type', 'terms' => array($farm_type), 'field' => 'slug', ); } if (!empty($_GET["location-farms"])){ $farm_location = $_GET["location-farms"]; $myquery['tax_query'][] = array( 'taxonomy' => 'location-farms', 'terms' => array($farm_location), 'field' => 'slug', ); } if (!empty($myquery)) { $q = new WP_Query($myquery); // instead of wp_query() var_dump($q); } 

И вы, вероятно, хотите отношения AND между двумя вашими компонентами.

 if (!empty($myquery)) { if (1 < count($myquery['tax_query'])) { $myquery['tax_query']['relation'] = 'AND'; } $q = new WP_Query($myquery); var_dump($q->request); // debug } 

Теперь, если вы передадите пустую строку для своей опции «Выбрать все» вместо номера, я считаю, что вы должны получить результаты, которые вы ищете.