Исключить пользовательскую таксономию из результатов поиска и архивных страниц

Вопрос или проблема

ОБНОВЛЕНИЕ:
У меня есть работающий код. Он исключает таксономию из результатов поиска. Однако я хотел бы, чтобы это происходило только в том случае, если пользователь не вошел в систему. Код ниже применяется как для вошедших, так и для не вошедших пользователей. Как я могу проверить, вошел ли пользователь в систему из файла 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;
}

Объяснение кода:

  1. Фильтр: Используется add_filter() для модификации основного запроса WordPress перед его выполнением.
  2. Проверка админки: Сначала мы проверяем, не является ли текущий запрос админ-запросом или не основным запросом (is_main_query()). Это предотвращает влияние на админ-панель и другие запросы.
  3. Условие поиска и архива: Если запрос является поиском (is_search()) или архивной страницей (is_archive()), и пользователь не авторизован (!is_user_logged_in()), мы продолжаем.
  4. Построение tax_query: Создаётся массив tax_query с указанием таксономии и term ID, которые мы хотим исключить.
  5. Установка tax_query: Применяем подготовленный массив к основному запросу через метод $query->set().

Теперь данный код будет корректно исключать элементы по указанной таксономии только для незарегистрированных пользователей. Не забудьте протестировать и убедиться, что всё работает как задумано.

Оцените материал
Добавить комментарий

Капча загружается...