Я пытаюсь отобразить блоки Гутенберга из определенного идентификатора сообщения внутри другого.
Вопрос в том, существует ли функция, с помощью которой я могу получить все блоки из одного поста и отобразить их в любом месте сайта? Так же, как это делает get_the_content?






Я думаю, что вы можете получить Блоки Гутенберга, используя этот способ.
$post_id = 1;
$post = get_post( $post_id );
if ( has_blocks( $post->post_content ) ) {
$blocks = parse_blocks( $post->post_content );
print'<pre>';print_r($blocks);print'</pre>';
foreach( $blocks as $block ) {
echo render_block( $block );
}
}
Примечание: Я не тестировал код самостоятельно.
@LedilsonMotta Пожалуйста, проверьте код сейчас. Я добавил цикл foreach и отрендерил в нем блок. Вы также можете удалить print из него.
Почти готово! Большинство блоков отображается правильно, но некоторые блоки, такие как You Tube и Soundcloud, не отображаются, отображается только URL-адрес. Я думаю, это потому, что мы не используем apply_filters(), который содержится в теге the_content(). Вы уже очень мне помогли, меня устраивают решения, которые Вы мне дали, но если Вы хотите решить это полностью, не стесняйтесь!
Фильтры @LedilsonMotta можно применять к render_block. developer.wordpress.org/reference/hooks/render_block
Получил ошибку. Я мог видеть, что применить_фильтры находится внутри функции визуал_блок(), здесь: developer.wordpress.org/reference/functions/render_block. Как я могу использовать применить_фильтры в приведенном выше примере?
@LedilsonMotta Вам нужно использовать add_filter, а не apply_filters
$post_id = 1; // ID of the post
// parse_blocks parses blocks out of
// a content string into an array
$blocks = parse_blocks( get_the_content( $post_id ) );
$content_markup = '';
foreach ( $blocks as $block ) {
// render_block renders a single block into a HTML string
$content_markup .= render_block( $block );
}
// this will apply the_content filters for shortcodes
// and embeds to contiune working
echo apply_filters( 'the_content', $content_markup );
@ggorlen приведенный выше код основан на этой функции do_blocks
Спасибо, комментарии помогают прояснить код, да и не плохо кинуть ссылку внутри поста как правку.
Эй, Сами! Хорошо, у меня есть массив с блоками! Но есть ли способ отобразить блоки без необходимости компоновки массива?