Проверка наличия блоков Gutenberg в post_content

2 авг. 2018 г., 11:52:45
Просмотры: 31.9K
Голосов: 32

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

Существует ли в WordPress функция для получения списка всех блоков Gutenberg, присутствующих в post_content?

1
Комментарии

Есть сайт https://whichblocks.com/. Когда вы вводите URL веб-страницы, он сканирует её и определяет, какие блоки Гутенберга используются на странице.

Teena Babu Teena Babu
14 февр. 2020 г. 11:33:47
Все ответы на вопрос 3
5
45

В 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' ) {
    }
}
2 авг. 2018 г. 13:52:03
Комментарии

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

Jebble Jebble
2 авг. 2018 г. 14:36:00

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

Nico Prat Nico Prat
12 нояб. 2018 г. 11:16:10

@NicoPrat мы обновили ответ, чтобы отразить корректные методы

Jebble Jebble
10 дек. 2018 г. 17:24:50

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

Lee Lee
18 апр. 2019 г. 16:34:47

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

bbeecher bbeecher
15 апр. 2020 г. 03:13:55
0

Решение, которое я использую на момент написания, проверяет 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
}
2 авг. 2018 г. 12:26:09
1

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

Вместо gutenberg_content_has_blocks используйте has_blocks

Вместо gutenberg_parse_blocks используйте parse_blocks

6 дек. 2018 г. 21:09:21
Комментарии

@JeffreyvonGrumbkow дело в том, что у ian-hoyte слишком низкий рейтинг, чтобы редактировать или комментировать =)

honk31 honk31
4 мар. 2019 г. 18:11:04