Вопрос или проблема
Я нашел этот пост о том, как изменить конкретный запрос, но не могу найти способ сделать следующее:
- У меня есть несколько запросов на главной странице, которые извлекают посты из категорий, посты из раздела “Новые”, посты из “Рецептов”, посты из “Промо” и т.д.
- У меня есть область слайдера в верхней части, которая отображает посты из всех категорий, использующие тег “рекомендуемые”
Как я могу предотвратить все остальные запросы на главной странице от извлечения постов с использованием тега “рекомендуемые”, чтобы посты с этим тегом не отображались одновременно в других запросах?
Ясно, что изменение всех других запросов на исключение постов с использованием тега работало бы, но изменение запросов через pre_get_posts
кажется более аккуратным решением.
Спасибо за любую помощь
Я вижу несколько проблем здесь. Я предполагаю, что часть с “рекомендуемыми” является мета-значением какого-то рода. Мы можем запустить условие, которое будет действовать для всех запросов на главной странице, но это переопределит meta_queries, а не добавит к ним. Хук будет выглядеть примерно так:
/**
* Модификация запросов темы
*
* @param WP_Query $query
*
* @return void
*/
function theme_pgp( $query ) {
if( is_admin() ) {
return;
}
if( $query->is_front_page() ) {
if( false !== $query->get( 'post', false ) ) {
$query->set( 'tag__not_in ' => array( 'Featured_Slug_ID' ) );
}
}
}
Я не знаю, какой слаг типа вашего поста или каков ваш ключ мета “рекомендуемые”, поэтому немного сложно создать точный запрос для исключения. Надеюсь, вышеуказанное направит вас в правильном направлении.
Ответ или решение
Для разработки решения, которое предотвратит отображение постов с определенными тегами (в данном случае с тегом "featured") в различных запросах на главной странице, мы будем использовать хук pre_get_posts
в WordPress. Давайте рассмотрим, как это сделать пошагово.
Анализ проблемы
На главной странице вашего сайта используются несколько отдельных запросов для отображения постов из различных категорий, таких как "Новые", "Рецепты", "Промо" и другие. Также имеется слайдер в верхней части страницы, который выводит посты с тегом "featured". Необходимо исключить посты с этим тегом из всех остальных запросов на главной странице, чтобы избежать дублирования контента.
Решение с использованием pre_get_posts
Чтобы достичь этой цели, вы можете использовать следующий код в вашем файле functions.php
вашей темы или в плагине:
/**
* Модификация запросов темы
*
* @param WP_Query $query
*/
function theme_filter_featured_posts( $query ) {
// Проверка, что это не административная панель
if ( is_admin() ) {
return;
}
// Проверяем, что это главная страница
if ( $query->is_front_page() && $query->is_main_query() ) {
// Убедимся, что запрос содержит посты
if ( $query->get( 'post_type' ) ) {
// Исключаем посты с тегом "featured"
$query->set( 'tag__not_in', array( get_term_by( 'slug', 'featured', 'post_tag' )->term_id ) );
}
}
}
// Подключаем нашу функцию к хуку pre_get_posts
add_action( 'pre_get_posts', 'theme_filter_featured_posts' );
Комментарии к коду
-
Проверка административной панели: Сначала мы гарантируем, что наш код не выполняется в административной части WordPress, чтобы избежать ненужных изменений в административных запросах.
-
Проверка, что это главная страница: Код проверяет, является ли текущий запрос главной страницей и основным запросом с помощью
$query->is_front_page()
и$query->is_main_query()
. -
Исключение постов с тегом: В данном коде мы определяем ID тега "featured" с помощью функции
get_term_by()
, передавая слаг тэга и таксономию (post_tag
). Затем мы используем методset()
для добавления параметраtag__not_in
, что позволяет исключить посты с этим тегом из выборки.
Заключение
Использование pre_get_posts
для модификации запросов позволяет вам централизованно управлять тем, какие посты отображаются на сайте. Это решение помогает избежать необходимости изменять множество отдельных запросов, что делает код более чистым и управляемым.
Кроме того, такое подход помогает улучшить SEO вашего сайта, так как избегает дублирования контента, что может негативно сказаться на индексации поисковыми системами.
Если у вас возникнут дополнительные вопросы или потребуются уточнения, не стесняйтесь обращаться за помощью.