Проверка наличия блоков Gutenberg в post_content
Я работаю над дизайном, который имеет разные стили в зависимости от наличия определенного блока Gutenberg на странице. Другими словами, если первый блок - это пользовательский блок Gutenberg, то post_title отображается в другом месте в соответствии с принятыми решениями по дизайну.
Существует ли в WordPress функция для получения списка всех блоков Gutenberg, присутствующих в post_content?

В WordPress 5.0+ для этого есть функция: parse_blocks()
. Чтобы проверить, является ли первый блок в записи блоком "Заголовок", нужно сделать следующее:
$post = get_post();
if ( has_blocks( $post->post_content ) ) {
$blocks = parse_blocks( $post->post_content );
if ( $blocks[0]['blockName'] === 'core/heading' ) {
}
}

Спасибо! Я не мог найти эту функцию. Забавно, что мой пользовательский код делает практически то же самое, но с гораздо меньшим количеством кода! В любом случае, отметил как принятый, так как это правильная встроенная функция.

Эта функция устарела (но только переименована), вместо неё следует использовать has_blocks($blockName)
: https://github.com/WordPress/gutenberg/pull/8631/commits/7e5efa2bcfa02c970a9bf0955e04a34a532157e7. Также есть has_block()
(без буквы "s" на конце).

Имейте в виду, что в настоящее время существует известная проблема, когда parse_blocks()
возвращает несуществующие блоки как элементы массива NULL - https://core.trac.wordpress.org/ticket/45312

https://developer.wordpress.org/reference/functions/parse_blocks/ :)

Решение, которое я использую на момент написания, проверяет post_content на наличие HTML-комментариев Gutenberg. В связи с будущими изменениями в Gutenberg это может перестать работать в будущем.
<?php
$post_content = get_the_content( get_the_ID() ); // Получаем содержимое поста
preg_match_all('<!-- /wp:(.*?) -->', $post_content, $blocks); // Ищем все совпадения между строками <!-- /wp: -->
// $blocks[1] содержит названия всех блоков, присутствующих в post_content
if ( in_array( 'heading', $blocks[1] ) ) {
// Содержимое поста содержит блок wp:heading
}
else {
// Содержимое поста не содержит блок wp:heading
}

Начиная с версии 5.0 эти функции устарели, так как Гутенберг теперь интегрирован в ядро. Я предполагаю, но не подтверждал, что эти функции всё ещё существуют в отдельном плагине Gutenberg.
Вместо gutenberg_content_has_blocks
используйте has_blocks
Вместо gutenberg_parse_blocks
используйте parse_blocks
