Я пытаюсь скрыть категорию пользовательского типа записи от вошедших пользователей с помощью Pre_Get_Posts.

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

У меня есть пользовательский тип записи в моей теме, который называется портфолио. Его категории называются категориями проектов. Я пытаюсь исключить категорию проекта для вошедших пользователей. Я никак не могу это сделать. Я прочитал codex pre_get_posts, но я застрял. Я не уверен, определяю ли я категории для моего пользовательского типа записи или это будет так же, как для обычной категории записи. Когда я нажимаю на категорию, чтобы отредактировать ее, в адресной строке браузера отображается следующее

wp-admin/edit-tags.php?action=edit&taxonomy=project-type&tag_ID=94&post_type=po‌​rtfolio

Вот код, который я сейчас пробую.

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' );

Любые идеи о том, что я мог делать неправильно, будут очень ценны. Спасибо

Хорошо, у вас есть несколько ошибок в коде.

  1. field может быть term_id или slug, но не id.
  2. 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. Ваша проблема связана с тем, как вы формируете запрос и какие параметры задаете.

Основные ошибки и их исправления

  1. Неправильное использование поля field в tax_query. В вашем коде было указано значение id, что не является корректным обязательным значением. Должно быть указано либо term_id, либо slug.

  2. Форматирование запроса 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' );

Объяснение работы кода

  1. Проверка пользователя: is_user_logged_in() проверяет, вошел ли пользователь в систему. Это гарантирует, что код будет выполняться только для аутентифицированных пользователей.

  2. Основной запрос: is_main_query() проверяет, является ли текущий запрос основным запросом WordPress (что особенно важно для исключения категорий из главных циклов, таких как главная страница или категория).

  3. Формирование tax_query: Внутри tax_query формируется массив, в который добавляется информация о том, как нужно фильтровать записи. Укажите таксономию, поле и термин, который нужно исключить.

Дополнительные рекомендации

  • Тестирование: Убедитесь, что вы тестируете код в разных контекстах. Например, протестируйте его в различных обстановках (на главной странице, на страницах архивов и т.д.), чтобы убедиться, что исключение работает повсеместно, как вы намеревались.

  • Логирование: Если вы продолжаете испытывать проблемы, добавьте логирование с помощью функции error_log(), чтобы вывести информацию о текущих запросах и убедиться, что они соответствуют вашим ожиданиям.

  • Остальные билды: При использовании плагинов кэширования проверьте, не мешает ли кэширование работе этой функции, особенно если вы получили результаты, не соответствующие вашим ожиданиям.

Эти изменения и рекомендации помогут вам успешно скрыть определенную категорию пользовательского типа записей от аутентифицированных пользователей, обеспечивая, что ваш сайт работает именно так, как вы задумали.

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

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