Вопрос или проблема
Я пытаюсь создать фильтр поиска в WordPress, чтобы фильтровать все пользовательские таксономии внутри типа записи.
Я создал функцию, которая генерирует выпадающий список, чтобы я мог выводить каждое значение опции как слаг для моего фильтра, который уже работает. Моя единственная проблема в том, что опция “Выбрать все” не работает.
Результаты возвращаются с сообщением “ничего не найдено” при выборе Все. Фильтр можно найти здесь.
Код, который я использовал для создания функции:
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);
}
?>
Пара заметок:
- Ваш
action
формы неверный:<form method="get"
. Страница должна быть
action="http://www.adoptapet.ie/archive-farm/"><form
method="get" action="http://www.adoptapet.ie/archive-farms/"> -
Вам следует изменить порядок аргументов в
adopt_custom_taxonomy_dropdown()
. Текущая версия имеет большинство аргументов со значениями по умолчанию и может быть пропущена при вызове функции, за исключением аргумента пять, у которого нет значения по умолчанию, поэтому невозможно пропустить два, три, и четыре. Переместите
$name
вперед для лучшей удобства использования.adopt_custom_taxonomy_dropdown( $taxonomy, $name, $orderby = 'date', $order="DESC", $limit="-1", $show_option_all = null, $show_option_none = null )
- Никогда не используйте
query_posts()
. Это уничтожает основной запрос и может вызвать множество проблем. - Хотя я не изменил код в предложениях ниже, вы никогда не должны использовать данные от пользователей, такие как
$_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); // вместо 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); // отладка
}
Теперь, если вы передаете пустую строку для вашей опции “Выбрать все”, вместо числа, я считаю, что вы получите искомые результаты.
Ответ или решение
Проблема, с которой вы столкнулись, связана с неработающей опцией "Выбрать все" в фильтре поиска WordPress, предполагает анализ логики работы кода и некоторых технических аспектов. Рассмотрим возможные решения и улучшения, которые помогут устранить эту неполадку.
Актуальная Проблема
Вы создали функцию, которая генерирует выпадающий список с пользовательскими таксономиями для конкретного типа записей. Однако, когда пользователь выбирает "Выбрать все", результаты не отображаются, и вы получаете пустые результаты.
Проблемы с логикой и кодом
-
Ошибка действия формы: У вас неверно указан
action
в HTML-форме. Заменитеhttp://www.adoptapet.ie/archive-farm/
наhttp://www.adoptapet.ie/archive-farms/
. -
Порядок аргументов функции: Переместите аргумент
$name
в начало функцииadopt_custom_taxonomy_dropdown()
, чтобы обеспечить более удобный вызов функции. -
Использование
query_posts()
: Всегда старайтесь избегать использованияquery_posts()
, так как он может нарушить основную логику запросов WordPress. Вместо этого используйтеWP_Query
. -
Проблемы в логике проверки: Использование
isset()
в вашем коде приведет к тому, что условие будет всегда истинным, даже если параметры пусты. Вместо этого используйте!empty()
. -
Валидация данных: Никогда не используйте данные из
$_GET
напрямую. Нужно обязательно их валидировать и очищать, чтобы избежать потенциальных угроз безопасности.
Решение Проблем
Оптимизация функции
function adopt_custom_taxonomy_dropdown($name, $taxonomy, $orderby = 'date', $order = "DESC", $limit = "-1", $show_option_all = null, $show_option_none = null) {
$args = array(
'orderby' => $orderby,
'order' => $order,
'number' => $limit,
);
$terms = get_terms($taxonomy, $args);
if ($terms) {
printf('<select name="%s" class="postform">', esc_attr($name));
if ($show_option_all) {
printf('<option value="">%s</option>', esc_html($show_option_all)); // Замените "0" на пустую строку
}
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>');
}
}
Улучшение логики фильтрации
$myquery = array('tax_query' => array());
if (!empty($_GET["farm-type"])) {
$farm_type = sanitize_text_field($_GET["farm-type"]);
$myquery['tax_query'][] = array(
'taxonomy' => 'farm-type',
'terms' => array($farm_type),
'field' => 'slug',
);
}
if (!empty($_GET["location-farms"])) {
$farm_location = sanitize_text_field($_GET["location-farms"]);
$myquery['tax_query'][] = array(
'taxonomy' => 'location-farms',
'terms' => array($farm_location),
'field' => 'slug',
);
}
if (!empty($myquery['tax_query'])) {
if (count($myquery['tax_query']) > 1) {
$myquery['tax_query']['relation'] = 'AND';
}
$q = new WP_Query($myquery);
var_dump($q->request); // Для отладки
}
Обратите внимание
- Санитизация данных: Используйте функции
sanitize_text_field()
для обработки данных, получаемых от пользователей. - Пустая строка для "Выбрать все": В опции "Выбрать все" используйте пустую строку, чтобы поиск охватывал все элементы.
- Очистка кода: Достигните большей читабельности и элегантности кода, используя массивы и объекты более эффективно.
Улучшив эти аспекты, вы сможете обеспечить не только исправление проблемы, но и повысить общую безопасность и удобство использования вашей системы поиска.