Как фильтровать Query Loop, чтобы показывать только посты в текущей категории?

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

Я мигрирую сайт с конструктора страниц на блочную тему.

В своем основном шаблоне поста я хочу вывести другие посты из той же категории, что и текущий пост, исключая сам текущий пост.

В конструкторе страниц фильтрация эквивалентного списка блог-постов была простой: нужно было просто выбрать ‘текущую категорию’ из выпадающего списка, но это не поддерживается в стандартном блоке Query Loop WordPress.

Я надеялся создать вариацию блока для блока Query Loop, но не смог разобраться, что мне нужно сделать, чтобы автоматически фильтровать результаты в блоке на основе категории текущего поста.

wp.blocks.registerBlockVariation(
'core/query',
{
    name: 'related-latest-posts',
    title: 'Связанные последние посты',
    description: 'Отображает связанные посты',
    attributes: {
        postsToShow: 3
    },
    query: {
        postType: 'post',
        postStatus: 'publish',
        orderby: 'date',
        order: 'desc',
        perPage: 3
    }
}

);

Мне интересно, удалось ли вам это выяснить? Я сталкиваюсь с подобной ситуацией.

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

Чтобы отфильтровать Query Loop и отображать только посты из текущей категории (исключая сам текущий пост) в блоковой теме WordPress, вы можете создать собственное вариацию блока Query Loop с использованием PHP. Поскольку стандартный блок Query Loop не поддерживает эту функциональность напрямую, вам потребуется внести некоторые изменения в регистрацию блока.

  1. Создание Вариации Блока: Вам нужно зарегистрировать вариацию для блока Query с условиями для выбора постов из текущей категории.

  2. Получение ID Текущего Поста и Категорий: Вам нужно получить ID текущего поста и его категории в функции PHP.

  3. Фильтрация Запроса: Значения этих данных должны быть использованы для настройки запроса внутри блока.

Вот пример кода, который вы можете использовать:

add_action('init', 'register_related_latest_posts_block');

function register_related_latest_posts_block() {
    if ( ! function_exists('register_block_type') ) {
        return;
    }

    wp.blocks.registerBlockVariation(
        'core/query',
        array(
            'name' => 'related-latest-posts',
            'title' => 'Связанные последние посты',
            'description' => 'Отображает связанные посты',
            'attributes' => array(
                'postsToShow' => 3,
            ),
            'query' => array(
                'postType' => 'post',
                'postStatus' => 'publish',
                'orderby' => 'date',
                'order' => 'desc',
                'perPage' => 3,
                'taxQuery' => array(
                    array(
                        'taxonomy' => 'category',
                        'field' => 'term_id',
                        'terms' => get_the_category($GLOBALS['post']->ID), // Получаем категории текущего поста
                        'operator' => 'IN',
                    ),
                ),
                'post__not_in' => array($GLOBALS['post']->ID), // Исключаем текущий пост
            ),
        )
    );
}

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

  1. add_action('init', 'register_related_latest_posts_block');: Хук WordPress, который вызывает вашу функцию регистрации блока, когда инициализируется тема.

  2. get_the_category($GLOBALS['post']->ID): Функция, которая получает текущие категории поста. Переменная $GLOBALS['post'] позволяет получить доступ к текущему посту вне контекста цикла.

  3. taxQuery и post__not_in: Позволяют установить критерии запроса для выборки постов только из тех же категорий, что и текущий пост, и исключают сам текущий пост из результатов.

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

Если вам нужно что-то более сложное или специфическое, например, сортировка или дополнительные параметры, вы можете расширить этот код в зависимости от ваших требований.

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

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