pre_get_posts с WP_Query для предотвращения появления записей с определенными тегами

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

Я нашел этот пост о том, как изменить конкретный запрос, но не могу найти способ сделать следующее:

  1. У меня есть несколько запросов на главной странице, которые извлекают посты из категорий, посты из раздела “Новые”, посты из “Рецептов”, посты из “Промо” и т.д.
  2. У меня есть область слайдера в верхней части, которая отображает посты из всех категорий, использующие тег “рекомендуемые”

Как я могу предотвратить все остальные запросы на главной странице от извлечения постов с использованием тега “рекомендуемые”, чтобы посты с этим тегом не отображались одновременно в других запросах?

Ясно, что изменение всех других запросов на исключение постов с использованием тега работало бы, но изменение запросов через 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' );

Комментарии к коду

  1. Проверка административной панели: Сначала мы гарантируем, что наш код не выполняется в административной части WordPress, чтобы избежать ненужных изменений в административных запросах.

  2. Проверка, что это главная страница: Код проверяет, является ли текущий запрос главной страницей и основным запросом с помощью $query->is_front_page() и $query->is_main_query().

  3. Исключение постов с тегом: В данном коде мы определяем ID тега "featured" с помощью функции get_term_by(), передавая слаг тэга и таксономию (post_tag). Затем мы используем метод set() для добавления параметра tag__not_in, что позволяет исключить посты с этим тегом из выборки.

Заключение

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

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

Если у вас возникнут дополнительные вопросы или потребуются уточнения, не стесняйтесь обращаться за помощью.

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

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