Вопрос или проблема
ОБНОВЛЕНИЕ:
У меня есть работающий код. Он исключает таксономию из результатов поиска. Однако я хотел бы, чтобы это происходило только в том случае, если пользователь не вошел в систему. Код ниже применяется как для вошедших, так и для не вошедших пользователей. Как я могу проверить, вошел ли пользователь в систему из файла functions.php? Я много раз пробовал !is_user_logged_in(), но не могу заставить его работать? Спасибо за любую помощь!
add_filter( 'pre_get_posts', 'exclude_pages_search_when_logged_out' );
function exclude_pages_search_when_logged_out($query) {
if ( $query->is_search && !is_user_logged_in() ) {
$tax_query = array([
'taxonomy' => 'wpfc_service_type',
'field' => 'term_id',
'terms' => [ 505 ],
'operator' => 'NOT IN',
]);
$query->set( 'tax_query', $tax_query );
}
return $query;
}
ОРИГИНАЛЬНЫЙ ВОПРОС
Я пытаюсь исключить таксономию 'wpfc_service_type', термин 505, из моих результатов поиска и архивных страниц. Я добавил следующее в файл functions.php, но это, похоже, не работает. Что я делаю не так?
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
// Исключить термины по ID из поиска и архивов
if ( is_search() || is_tax( 'wpfc_service_type' ) ) {
$tax_query = array([
'taxonomy' => 'wpfc_service_type',
'field' => 'term_id',
'terms' => [ 505 ],
'operator' => 'NOT IN',
]);
$query->set( 'tax_query', $tax_query );
}
}, 11, 1 );
Скопируйте следующий фрагмент и вставьте его в код вашей темы, предпочтительно в файл functions.php:
/* Исключить категорию из результатов поиска */
add_filter( 'pre_get_posts' , 'search_exc_cats' );
function search_exc_cats( $query ) {
if( $query->is_admin )
return $query;
if( $query->is_search ) {
$query->set( 'category__not_in' , array( 30 ) ); // ID категории
}
return $query;
}
Ответ или решение
Для решения вашей задачи по исключению таксономии из результатов поиска и архивных страниц только для незарегистрированных пользователей, вам необходимо уточнить условие в вашем коде. Чтобы это сделать, вы правильно использовали функцию is_user_logged_in()
, и вам нужно убедиться, что она применяется в нужном контексте.
Ниже приведён исправленный код, который будет исключать таксономию wpfc_service_type
сTerm ID 505 из результатов поиска и страниц архивов только для незарегистрированных пользователей:
add_filter( 'pre_get_posts', 'exclude_taxonomy_from_search_and_archive' );
function exclude_taxonomy_from_search_and_archive( $query ) {
// Проверяем, является ли этот запрос основным и не admin-запросом
if ( is_admin() || ! $query->is_main_query() ) {
return $query;
}
// Проверяем, что это либо поиск, либо архивная страница
if ( ( $query->is_search() || $query->is_archive() ) && ! is_user_logged_in() ) {
// Исключаем таксономию wpfc_service_type с Term ID 505
$tax_query = array(
array(
'taxonomy' => 'wpfc_service_type',
'field' => 'term_id',
'terms' => array( 505 ),
'operator' => 'NOT IN',
),
);
// Применяем tax_query к основному запросу
$query->set( 'tax_query', $tax_query );
}
return $query;
}
Объяснение кода:
- Фильтр: Используется
add_filter()
для модификации основного запроса WordPress перед его выполнением. - Проверка админки: Сначала мы проверяем, не является ли текущий запрос админ-запросом или не основным запросом (
is_main_query()
). Это предотвращает влияние на админ-панель и другие запросы. - Условие поиска и архива: Если запрос является поиском (
is_search()
) или архивной страницей (is_archive()
), и пользователь не авторизован (!is_user_logged_in()
), мы продолжаем. - Построение tax_query: Создаётся массив
tax_query
с указанием таксономии и term ID, которые мы хотим исключить. - Установка tax_query: Применяем подготовленный массив к основному запросу через метод
$query->set()
.
Теперь данный код будет корректно исключать элементы по указанной таксономии только для незарегистрированных пользователей. Не забудьте протестировать и убедиться, что всё работает как задумано.