Вопрос или проблема
Я пытаюсь добавить некоторый контекст в блок Query Loop и унаследовать его во внутренних блоках, таких как заголовок поста (т.е. вложенный в блок Post Template). Я могу отфильтровать его в render_block_context
, и контекст доступен в блоке Query Loop, но надеялся выяснить, как автоматически наследовать его в дочерних блоках.
Вот мой минимальный пример:
add_filter( 'render_block_context', function( $context, $parsed_block ) {
if ( 'core/query' === $parsed_block['blockName'] ) {
$context['helga/tacos'] = 'we love tacos';
}
return $context;
}, 10, 2 );
add_filter( 'block_type_metadata', function( $metadata ) {
if ( 'core/query' === $metadata['name'] ) {
$metadata['attributes'] ??= [];
$metadata['attributes']['tacos'] = [
'type' => 'string',
'default' => 'default tacos',
];
$metadata['providesContext'] ??= [];
$metadata['providesContext']['helga/tacos'] = 'tacos';
}
if ( 'core/post-title' === $metadata['name'] ) {
$metadata['usesContext'] ??= [];
$metadata['usesContext'][] = 'helga/tacos';
}
return $metadata;
} );
add_filter( 'render_block_core/post-title', function( $block_content, $block, $instance) {
return $block_content . json_encode( $instance->context );
}, 10, 3 );
Затем вставьте блок Query Loop куда угодно и посмотрите на получившийся вывод. Я добавил JSON-контекст после каждого заголовка поста… и он никогда не включает ключ контекста helga/tacos
, который я определил как в render_block_context
, так и установил providesContext
и usesContext
для в блоке цикла и заголовка соответственно.
Я пытаюсь сделать ключ helga/tacos
доступным в контексте в блоке заголовка поста И чтобы его значение было we love tacos
.
Ответ или решение
Вопрос о том, как наследовать контекст из блока Query Loop в вложенные блоки, такие как Post Title в WordPress, требует понимания механизма работы фильтров и контекста в блоках Гутенберга.
Ваш подход через render_block_context
для добавления контекста к блоку Query Loop понятен. Вы добавляете пользовательское значение в контекст, используя следующий код:
add_filter( 'render_block_context', function( $context, $parsed_block ) {
if ( 'core/query' === $parsed_block['blockName'] ) {
$context['helga/tacos'] = 'we love tacos';
}
return $context;
}, 10, 2 );
Этот код успешно добавляет ключ helga/tacos
в контекст блока Query Loop, однако контекст не наследуется автоматическим образом вложенным блоком Post Title. Давайте разберем причиной этого.
Во-первых, настройка block_type_metadata
Вы правильно настроили providesContext
и usesContext
для блоков core/query
и core/post-title
. Однако важно убедиться, что блоки действительно используют эту структуру, и она правильно определяется в момент рендеринга:
add_filter( 'block_type_metadata', function( $metadata ) {
if ( 'core/query' === $metadata['name'] ) {
$metadata['attributes'] ??= [];
$metadata['attributes']['tacos'] = [
'type' => 'string',
'default' => 'default tacos',
];
$metadata['providesContext'] ??= [];
$metadata['providesContext']['helga/tacos'] = 'tacos';
}
if ( 'core/post-title' === $metadata['name'] ) {
$metadata['usesContext'] ??= [];
$metadata['usesContext'][] = 'helga/tacos';
}
return $metadata;
} );
Ключевые описания проблемы:
-
Проверка структуры данных: Убедитесь, что данные контекста правильно передаются во все уровни вложенности. Добавьте временные отладочные выводы, чтобы подтвердить наличие ключа
helga/tacos
в$context
после фильтрации. -
Порядок вызова фильтров: Важно удостовериться, что фильтры выполняются в правильной последовательности, и контекст у блока Post Template переопределяется верно.
-
Среда разработки и совместимость: Проверьте, что ваша версия WordPress и используемый сборщик поддерживают данные настройки, поскольку некорректная версия может влиять на работу специфичных фильтров.
Наконец, сколько бы сложных деталей ни содержало ваше приложение, вы должны помнить, что WordPress и его блоки — это часть экосистемы, которая постоянно обновляется. Поэтому важно быть в курсе последних изменений и практик в документации WordPress, что может дать новые идеи и решения для вашей задачи.
Это попытка объяснить проблему с аспектами, которые могут улучшить вашу реализацию. Информация изложена в профессиональном тоне, избегая штампов и банальностей, с акцентом на специфической тематике WordPress для достижения наилучшего результата в SEO-оптимизации и читабельности для технической аудитории.