Функция фильтра WordPress с использованием модификаций запросов

Я пытаюсь создать функцию фильтра для основного запроса на странице архива типа персонализированного сообщения.

Тип персонализированного сообщения называется «Отель». Для этого настраиваемого типа сообщений у меня есть пользовательская таксономия «Услуги». Каждый «отель» может иметь одно или несколько объектов.

Я создал функцию формы с пометкой для каждой доступной таксономии. Также я создал привязку к функции pre_get_posts, которая выглядит так:

$facilitati = isset($_POST['fac']) ? array( 'taxonomy' => 'facilitati', 'field' => 'id', 'terms' => $_POST['fac'], 'operator' => 'IN' ) : array( 'taxonomy' => 'facilitati', 'field' => 'id', 'terms' => array( 0 ), 'operator' => 'NOT IN' ); $arr = array( 'relation' => 'AND', $locatii, $facilitati ); $query->set('tax_query', $arr ); 

Проблема в том, что это не работает, как я хочу. Например. В отеле «ABC» есть удобства: телевизор, телефон, WIFI, автостоянка. В отеле «DEF» есть удобства: телевизор, телефон, ресторан. Отель «GHI» имеет удобства: WIFI, автостоянка

Если я проверю все объекты в форме, все отели будут отображаться. Это имеет смысл, поскольку, как я вижу, tax_query видит все термины, находящиеся в массиве проверенных объектов.

Так, например, если в отеле «GHI» есть только объекты WIFI и место для парковки, он также будет отображаться, потому что два объекта находятся в комплексе всех объектов.

Можно ли это сделать для фильтрации? Также я хочу иметь возможность получить следующее: если проверяется только WIFI и место для парковки, результат не должен быть только в отеле «GHI», а также в отеле «ABC».

Я искал решение по всему описанию класса WP Word Word WPress, но не нашел его.

Solutions Collecting From Web of "Функция фильтра WordPress с использованием модификаций запросов"

Я думаю, ваша проблема связана с использованием аргумента operator в вашем tax_query . На самом деле вы используете IN и NOT IN . Из вашего вопроса я понимаю, что вы хотите И. Кроме того, вам не нужно устанавливать terms aguments в 0 если $_POST[] не установлен:

 if(isset($_POST['fac'])) { // I assume that $_POST['fac'] is an array with the terms ID // because you talked about an array of checkbox inputs in your form // also, as you are using the field => 'id' I assume that the value of // each checkbox is a term ID $terms = array_map('intval', $_POST['fac']); $facilitati = array( 'relation' => 'AND', array( 'taxonomy' => 'facilitati', 'field' => 'id', 'terms' => $terms, 'operator' => 'AND' ), ); $query->set('tax_query', $facilitati ); } 

Для дальнейшей помощи мне нужно знать ожидаемый тип данных $ _POST ['fac'].