Выбор всех не работает в фильтре поиска WordPress.

Вопрос или проблема

Я пытаюсь создать фильтр поиска в 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);

        }
        ?>

Пара заметок:

  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(). Текущая версия имеет большинство аргументов со значениями по умолчанию и может быть пропущена при вызове функции, за исключением аргумента пять, у которого нет значения по умолчанию, поэтому невозможно пропустить два, три, и четыре. Переместите
    $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); // вместо 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, предполагает анализ логики работы кода и некоторых технических аспектов. Рассмотрим возможные решения и улучшения, которые помогут устранить эту неполадку.

Актуальная Проблема

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

Проблемы с логикой и кодом

  1. Ошибка действия формы: У вас неверно указан action в HTML-форме. Замените http://www.adoptapet.ie/archive-farm/ на http://www.adoptapet.ie/archive-farms/.

  2. Порядок аргументов функции: Переместите аргумент $name в начало функции adopt_custom_taxonomy_dropdown(), чтобы обеспечить более удобный вызов функции.

  3. Использование query_posts(): Всегда старайтесь избегать использования query_posts(), так как он может нарушить основную логику запросов WordPress. Вместо этого используйте WP_Query.

  4. Проблемы в логике проверки: Использование isset() в вашем коде приведет к тому, что условие будет всегда истинным, даже если параметры пусты. Вместо этого используйте !empty().

  5. Валидация данных: Никогда не используйте данные из $_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() для обработки данных, получаемых от пользователей.
  • Пустая строка для "Выбрать все": В опции "Выбрать все" используйте пустую строку, чтобы поиск охватывал все элементы.
  • Очистка кода: Достигните большей читабельности и элегантности кода, используя массивы и объекты более эффективно.

Улучшив эти аспекты, вы сможете обеспечить не только исправление проблемы, но и повысить общую безопасность и удобство использования вашей системы поиска.

Оцените материал
Добавить комментарий

Капча загружается...