Запрос нескольких таксономий в WordPress

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

У меня есть простая форма, состоящая из двух множественных селекторов, которые (словно по волшебству) фильтруют архив моих постов с параметрами URL:

<form class="filters">
    <select name="country" multiple>
        <option value="united-kingdom">Великобритания</option>
        <option value="ireland">Ирландия</option>
    </select>
    <select name="type" multiple>
        <option value="director">Режиссер</option>
        <option value="partner">Партнер</option>
    </select>
    <input type="submit">
</form>

Если я выберу ‘Ирландия’ и ‘Партнер’, меня отправят на:

https://example.com/network/?country=ireland&_type=partner

Затем, если я выберу несколько значений, таких как ‘Ирландия’, ‘Великобритания’ и ‘Партнер’, меня отправят на:

https://example.com/network/?country=ireland&country=united-kingdom&_type=partner

Мой вопрос: как я могу использовать эту форму для создания условного запроса ‘ИЛИ’, похожего на https://example.com/network/?country=ireland,united-kingdom&type=partner?

Возможно, вы можете добавить скрытое поле в HTML, которое будет передавать 'relation' => 'OR'.

<input type="hidden" name="tax_query[relation]" value="OR">

<select name="tax_query[][country]" multiple>
    <option value="united-kingdom">Великобритания</option>
    <option value="ireland">Ирландия</option>
</select>

<select name="tax_query[][type]" multiple>
    <option value="director">Режиссер</option>
    <option value="partner">Партнер</option>
</select>

Что переводится как:

tax_query[relation]=OR&tax_query[][country]=united-kingdom&tax_query[][type]=director

Array
(
    [tax_query] => Array
        (
            [relation] => OR
            [0] => Array
                (
                    [country] => united-kingdom
                )

            [1] => Array
                (
                    [type] => director
                )

        )

)

Кажется, ваша страница network кастомная и можно найти это с помощью $_REQUEST.


Просто ссылаясь на то, как обрабатывать несколько запросов таксономии и моделируя на основе http_build_query(), чтобы добавить 'relation' => 'OR'.

$args = http_build_query( array (

    'post_type' => 'post',

    'tax_query' => array (

        'relation' => 'OR',

        array (
            'taxonomy' => 'movie_genre',
            'field'    => 'slug',
            'terms'    => array ( 'action', 'comedy' ),
        ),

        array (
            'taxonomy' => 'actor',
            'field'    => 'term_id',
            'terms'    => array ( 103, 115, 206 ),
            'operator' => 'NOT IN',
        ),
    ),
) );

echo "<pre>";

echo PHP_EOL . $args . PHP_EOL;

print_r( wp_parse_args( $args ) );

Что в конечном итоге будет выглядеть так:

post_type=post&tax_query%5Brelation%5D=AND&tax_query%5B0%5D%5Btaxonomy%5D=movie_genre&tax_query%5B0%5D%5Bfield%5D=slug&tax_query%5B0%5D%5Bterms%5D%5B0%5D=action&tax_query%5B0%5D%5Bterms%5D%5B1%5D=comedy&tax_query%5B1%5D%5Btaxonomy%5D=actor&tax_query%5B1%5D%5Bfield%5D=term_id&tax_query%5B1%5D%5Bterms%5D%5B0%5D=103&tax_query%5B1%5D%5Bterms%5D%5B1%5D=115&tax_query%5B1%5D%5Bterms%5D%5B2%5D=206&tax_query%5B1%5D%5Boperator%5D=NOT+IN

И может быть разобран с помощью wp_parse_args().

Ответ или решение

Конечно! Для создания многостраничного запроса таксономий в WordPress с использованием условия "ИЛИ" (OR) можно адаптировать ваш текущий код на основе формы. Давайте разберем, как вы можете это реализовать, чтобы соответствовать вашим требованиям.

Шаги для создания фильтрации с использованием OR в запросах таксономий

  1. HTML Форма: Вы можете изменить свою HTML форму, чтобы она корректно собирала параметры для передачи их на страницу запроса. Вам нужно будет создать массив таксономий и добавить скрытое поле для указания отношения "OR".
<form class="filters" method="GET" action="https://example.com/network/">
    <input type="hidden" name="tax_query[relation]" value="OR">

    <select name="tax_query[][country]" multiple>
        <option value="united-kingdom">United Kingdom</option>
        <option value="ireland">Ireland</option>
    </select>

    <select name="tax_query[][type]" multiple>
        <option value="director">Director</option>
        <option value="partner">Partner</option>
    </select>

    <input type="submit" value="Filter">
</form>
  1. Обработка запроса на сервере: Когда форма отправляет запрос, вы будете обрабатывать его на вашей странице. Для этого вы можете использовать функцию WP_Query, чтобы выполнить запрос, учитывающий таксономии.
if (isset($_GET['tax_query'])) {
    $tax_query = array('relation' => strtoupper($_GET['tax_query']['relation']));

    foreach ($_GET['tax_query'] as $key => $value) {
        if (is_array($value)) {
            foreach ($value as $taxonomy => $terms) {
                $tax_query[] = array(
                    'taxonomy' => $taxonomy,
                    'field'    => 'slug',
                    'terms'    => explode(',', $terms),
                    'operator' => 'IN',
                );
            }
        }
    }

    $args = array(
        'post_type' => 'post',
        'tax_query' => $tax_query,
    );

    $query = new WP_Query($args);
}
  1. Создание URL: Используя http_build_query, вы можете динамически создавать нужный URL для формирования параметров GET.
$filtered_url = 'https://example.com/network/?' . http_build_query(array(
    'tax_query' => array(
        'relation' => 'OR',
        array(
            'country' => implode(',', $_GET['tax_query'][0]['country']),
        ),
        array(
            'type' => implode(',', $_GET['tax_query'][1]['type']),
        ),
    ),
));
  1. Показ записей: Далее, при помощи WP_Query вы можете вывести результаты, основываясь на том, как были заданы параметры.
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        // Ваш код для вывода поста...
    }
    wp_reset_postdata();
} else {
    echo 'Нет записей, соответствующих вашему запросу.';
}

Заключение

Пусть ваше решение будет чистым и организованным. Уделите внимание тому, чтобы все параметры фильтрации работали согласно ожиданиям пользователя и возвращали корректные результаты. Совместив использование HTML формы и правильно обработав запрос на сервере через WP_Query, вы создадите эффективный механизм фильтрации в WordPress с поддержкой логики "ИЛИ".

SEO-оптимизация: Не забудьте про ключевые слова, такие как "WordPress фильтрация", "многостраничный запрос таксономий" и "пользовательские запросы в WordPress". Это поможет вашему контенту получить видимость в поисковых системах.

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

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