Я пытаюсь создать функцию фильтра для основного запроса на странице архива типа персонализированного сообщения.
Тип персонализированного сообщения называется «Отель». Для этого настраиваемого типа сообщений у меня есть пользовательская таксономия «Услуги». Каждый «отель» может иметь одно или несколько объектов.
Я создал функцию формы с пометкой для каждой доступной таксономии. Также я создал привязку к функции 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, но не нашел его.
Я думаю, ваша проблема связана с использованием аргумента 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'].