Вопрос или проблема
У меня есть простая форма, состоящая из двух множественных селекторов, которые (словно по волшебству) фильтруют архив моих постов с параметрами 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 в запросах таксономий
- 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>
- Обработка запроса на сервере: Когда форма отправляет запрос, вы будете обрабатывать его на вашей странице. Для этого вы можете использовать функцию
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);
}
- Создание 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']),
),
),
));
- Показ записей: Далее, при помощи
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". Это поможет вашему контенту получить видимость в поисковых системах.