Вопрос или проблема
У меня есть пользовательский тип записи в моей теме, который называется портфолио. Его категории называются категориями проектов. Я пытаюсь исключить категорию проекта для вошедших пользователей. Я никак не могу это сделать. Я прочитал codex pre_get_posts, но я застрял. Я не уверен, определяю ли я категории для моего пользовательского типа записи или это будет так же, как для обычной категории записи. Когда я нажимаю на категорию, чтобы отредактировать ее, в адресной строке браузера отображается следующее
wp-admin/edit-tags.php?action=edit&taxonomy=project-type&tag_ID=94&post_type=portfolio
Вот код, который я сейчас пробую.
function exclude_category( $query ) {
if ( is_user_logged_in() && $query->is_main_query() ) {
$taxquery = array(
'taxonomy' => 'project-type',
'field' => 'id',
'terms' => array( 94 ),
'operator' => 'NOT IN'
);
$query->set( 'tax_query', $taxquery);
}
}
add_action( 'pre_get_posts', 'exclude_category' );
Любые идеи о том, что я мог делать неправильно, будут очень ценны. Спасибо
Хорошо, у вас есть несколько ошибок в коде.
field
может бытьterm_id
илиslug
, но неid
.tax_query
должна быть массивом массивов, а не массивом.
Так что вот исправленный код:
function exclude_category( $query ) {
if ( is_user_logged_in() && $query->is_main_query() ) {
$taxquery = array(
array(
'taxonomy' => 'project-type',
'field' => 'term_id',
'terms' => array( 94 ),
'operator' => 'NOT IN'
),
);
$query->set( 'tax_query', $taxquery);
}
}
add_action( 'pre_get_posts', 'exclude_category' );
Он не тестировался, но я вполне уверен, что он должен работать отлично.
Ответ или решение
Для решения задачи исключения определенной категории пользовательского типа записей из результатов поиска для пользователей, которые вошли в систему, необходимо правильно настроить запросы в WordPress, используя хук pre_get_posts
. Ваша проблема связана с тем, как вы формируете запрос и какие параметры задаете.
Основные ошибки и их исправления
-
Неправильное использование поля
field
вtax_query
. В вашем коде было указано значениеid
, что не является корректным обязательным значением. Должно быть указано либоterm_id
, либоslug
. -
Форматирование запроса
tax_query
.tax_query
должен быть массивом массивов, где каждый подмассив определяет отдельный фильтр, использующийся в запросе.
Исправленный код
Ниже представлен исправленный вариант вашего кода:
function exclude_category( $query ) {
if ( is_user_logged_in() && $query->is_main_query() ) {
$taxquery = array(
array(
'taxonomy' => 'project-type',
'field' => 'term_id', // Исправлено на term_id
'terms' => array( 94 ), // Укажите ID исключаемой категории
'operator' => 'NOT IN'
),
);
$query->set( 'tax_query', $taxquery ); // Установите tax_query
}
}
add_action( 'pre_get_posts', 'exclude_category' );
Объяснение работы кода
-
Проверка пользователя:
is_user_logged_in()
проверяет, вошел ли пользователь в систему. Это гарантирует, что код будет выполняться только для аутентифицированных пользователей. -
Основной запрос:
is_main_query()
проверяет, является ли текущий запрос основным запросом WordPress (что особенно важно для исключения категорий из главных циклов, таких как главная страница или категория). -
Формирование
tax_query
: Внутриtax_query
формируется массив, в который добавляется информация о том, как нужно фильтровать записи. Укажите таксономию, поле и термин, который нужно исключить.
Дополнительные рекомендации
-
Тестирование: Убедитесь, что вы тестируете код в разных контекстах. Например, протестируйте его в различных обстановках (на главной странице, на страницах архивов и т.д.), чтобы убедиться, что исключение работает повсеместно, как вы намеревались.
-
Логирование: Если вы продолжаете испытывать проблемы, добавьте логирование с помощью функции
error_log()
, чтобы вывести информацию о текущих запросах и убедиться, что они соответствуют вашим ожиданиям. -
Остальные билды: При использовании плагинов кэширования проверьте, не мешает ли кэширование работе этой функции, особенно если вы получили результаты, не соответствующие вашим ожиданиям.
Эти изменения и рекомендации помогут вам успешно скрыть определенную категорию пользовательского типа записей от аутентифицированных пользователей, обеспечивая, что ваш сайт работает именно так, как вы задумали.