Проверьте, какие блоки Гутенберга находятся в post_content

19

Я работаю над дизайном, который имеет другой стиль, если на странице присутствует определенный блок Гутенберга. Другими словами, если первый блок является пользовательским блоком Гутенберга, post_title отображается в другом месте из-за сделанного выбора дизайна.

Есть ли в WordPress какая-либо функция для получения списка всех блоков Гутенберга, присутствующих в post_content?

Джеффри фон Грамбков
источник
Существует веб-сайт whichblocks.com Когда вы вводите URL веб-страницы, он сканирует страницу и выясняет, какие блоки Гутенберга используются на странице.
Тина Бабу

Ответы:

27

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' ) {
    }
}
Джейкоб Питти
источник
Благодарность! Я не мог найти эту функцию. Как ни странно, мой пользовательский код делает то же самое, но с гораздо меньшим количеством кода! Во всяком случае, помечены как принятые, поскольку это правильная встроенная функция.
Джеффри фон Грамбков
3
Эта функция устарела (но только переименована), has_blocks($blockName)вместо нее следует использовать : github.com/WordPress/gutenberg/pull/8631/commits/… . Там тоже has_block()(без "с").
Нико Прат
@NicoPrat, мы обновили ответ, чтобы отразить правильные методы
Джеффри фон Грамбков
Имейте в виду, что в данный момент существует известная проблема, при которой parse_blocks()несуществующие блоки возвращаются в виде элементов массива NULL - core.trac.wordpress.org/ticket/45312
Lee,
2

Решение, которое я использую при написании, проверяет post_content для HTML-комментариев Гутенберга. Из-за будущих изменений Гутенберга это может не сработать в будущем.

<?php    
$post_content = get_the_content( get_the_ID() ); // Get the post_content
preg_match_all('<!-- /wp:(.*?) -->', $post_content, $blocks); // Get all matches in between <!-- /wp: --> strings

// $blocks[1] contains the names of all the blocks present in the post_content
if ( in_array( 'heading', $blocks[1] ) ) {
    // Post content contains a wp:heading block
}
else {
    // Post content does not contain a wp:heading block
}
Джеффри фон Грамбков
источник
0

Начиная с версии 5.0, эти функции устарели, и теперь Гутенберг интегрирован в ядро. Я представляю, но не подтвердил, что эти функции все еще существуют в автономном плагине Gutenberg.

Вместо gutenberg_content_has_blocksиспользованияhas_blocks

Вместо gutenberg_parse_blocksиспользованияparse_blocks

Ян-Хойт
источник
2
@JeffreyvonGrumbkow дело в том, что ian-hoyte имеет низкое значение репутации, чтобы редактировать или комментировать =)
honk31