Вопрос или проблема
Когда мы нажимаем на ссылку категории, мы видим все посты под этой категорией. Я хотел бы скрыть посты с определенным тегом в этой категории и показать ссылку, которая позволяет нам показать посты с этим тегом (который был скрыт) внутри категории. С помощью 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 для модификации запроса. Этот метод обеспечивает возможность настройки выборки постов в зависимости от категорий и тегов, что идеально подходит для вашей ситуации. Давайте подробно разберём, как это можно реализовать, чтобы достичь запрашиваемого вами функционала, а также обеспечим управление пагинацией.
Алгоритм решения
-
Идентификация тегов и категорий: Необходимо заранее определить, какие теги следует исключать и в каких категориях. В вашем примере можно использовать идентификатор тега ‘C’ и определить категорию ‘A’.
-
Использование
pre_get_posts
: Данный хук позволяет изменить параметры запроса WordPress перед его выполнением. Вы можете исключать посты с определёнными тегами при запросе на страницу категории. -
Логика для отображения постов: После того как пользователь убирает фильтр (например, нажимает на ссылку для отображения скрытых постов), необходимо обеспечить нормальный переход на страницу с тегами, которая будет отображать лишь сообщения с определённым тегом.
Пример реализации
// Определяем 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, чтобы избежать неожиданностей при навигации по сайту.
Данный метод не только решает вашу задачу, но и может быть расширен для реализации более сложной логики, если это потребуется в будущем.