Вопрос или проблема
Я мигрирую сайт с конструктора страниц на блочную тему.
В своем основном шаблоне поста я хочу вывести другие посты из той же категории, что и текущий пост, исключая сам текущий пост.
В конструкторе страниц фильтрация эквивалентного списка блог-постов была простой: нужно было просто выбрать ‘текущую категорию’ из выпадающего списка, но это не поддерживается в стандартном блоке 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 не поддерживает эту функциональность напрямую, вам потребуется внести некоторые изменения в регистрацию блока.
-
Создание Вариации Блока: Вам нужно зарегистрировать вариацию для блока Query с условиями для выбора постов из текущей категории.
-
Получение ID Текущего Поста и Категорий: Вам нужно получить ID текущего поста и его категории в функции PHP.
-
Фильтрация Запроса: Значения этих данных должны быть использованы для настройки запроса внутри блока.
Вот пример кода, который вы можете использовать:
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), // Исключаем текущий пост
),
)
);
}
Пояснения к коду:
-
add_action('init', 'register_related_latest_posts_block');
: Хук WordPress, который вызывает вашу функцию регистрации блока, когда инициализируется тема. -
get_the_category($GLOBALS['post']->ID)
: Функция, которая получает текущие категории поста. Переменная$GLOBALS['post']
позволяет получить доступ к текущему посту вне контекста цикла. -
taxQuery
иpost__not_in
: Позволяют установить критерии запроса для выборки постов только из тех же категорий, что и текущий пост, и исключают сам текущий пост из результатов.
Теперь, при использовании созданной вариации блока "Связанные последние посты" в вашем редакторе блоков, вы сможете видеть посты из текущей категории, исключая текущий пост.
Если вам нужно что-то более сложное или специфическое, например, сортировка или дополнительные параметры, вы можете расширить этот код в зависимости от ваших требований.