Исключить посты с определенными тегами в архиве категории

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

Когда мы нажимаем на ссылку категории, мы видим все посты под этой категорией. Я хотел бы скрыть посты с определенным тегом в этой категории и показать ссылку, которая позволяет нам показать посты с этим тегом (который был скрыт) внутри категории. С помощью jQuery и вкладок я могу это сделать, но есть проблема с пагинацией. Поэтому мне нужно найти другой способ.

Пример: У нас 10 постов; 5 с категорией A и 5 с категорией B.

Из них 3 поста имеют тег C (2 из категории A и 1 из категории B).

Когда я нажимаю на категорию A, отображаются 3 поста (скрывая два с тегом ‘C’), а затем (когда я на странице категории), если я нажму на тег C, отобразятся 2 поста (а не 3, потому что 1 пост имеет категорию B).

Это возможно?

Вы можете изменить свой запрос в pre_get_posts.

Пример:

// Я бы не стал жестко закодировать идентификаторы тегов/категорий, но где 
// хранить и как извлекать эти настройки выходит за рамки этого вопроса.

define( 'YIVIS_EXCLUDED_TAG', 12 );

add_action( 'pre_get_posts', 'yivi_excludes_tags' ); 

function yivi_excludes_tags( $query ) {

  if ( $query->is_category() {
     $query->set('tag', [ YIVIS_EXCLUDED_TAG *  -1 ] );
  }

}

С этим, каждый раз, когда вы выполняете запрос на основе категории, посты с этим тегом будут исключены из поиска. Исключить определенные категории при просмотре по тегу должно быть достаточно легко, следуя отсюда.

Ответ или решение

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

Алгоритм решения

  1. Идентификация тегов и категорий: Необходимо заранее определить, какие теги следует исключать и в каких категориях. В вашем примере можно использовать идентификатор тега ‘C’ и определить категорию ‘A’.

  2. Использование pre_get_posts: Данный хук позволяет изменить параметры запроса WordPress перед его выполнением. Вы можете исключать посты с определёнными тегами при запросе на страницу категории.

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

Пример реализации

// Определяем ID тега, который нужно исключить
define( 'YIVIS_EXCLUDED_TAG', 12 ); // замените 12 на соответствующий ID тега 'C'

// Подключаем функцию к хуку 'pre_get_posts'
add_action( 'pre_get_posts', 'yivi_excludes_tags' );

function yivi_excludes_tags( $query ) {
    // Проверяем, что это запрос категории и что он выполняется на главном сайте
    if ( $query->is_category() && $query->is_main_query() ) {
        // Исключаем посты с заданным тегом из выборки
        $query->set( 'tag__not_in', array( YIVIS_EXCLUDED_TAG ) );
    }
}

Пояснение коду

  • В первом шаге мы определяем идентификатор тега, который необходимо исключать. В данном случае это ID тега ‘C’.
  • Затем с помощью add_action мы связываем свою функцию с хуком pre_get_posts, что позволяет нам вмешиваться в запросы перед их выполнением.
  • В функции yivi_excludes_tags мы проверяем, что запрос относится к категории и является основным запросом. Это важно для предотвращения изменений в других запросах, например, в запросах для виджетов или исполнения AJAX-запросов.
  • Используя метод set, мы модифицируем запрос, исключая указанные теги.

Функция для отображения скрытых постов

После того как вы скрыли посты с определёнными тегами, полезно добавить ссылку для отображения этих постов. Например, можно использовать кнопку или ссылку, которая будет вести на страницу с тегом ‘C’, где будут перечислены все сообщения, независимо от категории.

Заключение

Данный подход позволяет вам исключать определённые посты из категорий, сохраняя при этом возможность их отображения по тегу. Используя pre_get_posts, вы сохраняете контроль над выборкой данных, делая ваш сайт более динамичным и удобным для пользователей. Важно помнить о пагинации и других аспектах UX, чтобы избежать неожиданностей при навигации по сайту.

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

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

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