Получить блоки Гутенберга без the_content()

Я пытаюсь отобразить блоки Гутенберга из определенного идентификатора сообщения внутри другого.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
2 852
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, что вы можете получить Блоки Гутенберга, используя этот способ.

$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 );
    }
}

Примечание: Я не тестировал код самостоятельно.

Эй, Сами! Хорошо, у меня есть массив с блоками! Но есть ли способ отобразить блоки без необходимости компоновки массива?

Ledilson Motta 18.07.2019 20:29

@LedilsonMotta Пожалуйста, проверьте код сейчас. Я добавил цикл foreach и отрендерил в нем блок. Вы также можете удалить print из него.

Sami Ahmed Siddiqui 19.07.2019 08:00

Почти готово! Большинство блоков отображается правильно, но некоторые блоки, такие как You Tube и Soundcloud, не отображаются, отображается только URL-адрес. Я думаю, это потому, что мы не используем apply_filters(), который содержится в теге the_content(). Вы уже очень мне помогли, меня устраивают решения, которые Вы мне дали, но если Вы хотите решить это полностью, не стесняйтесь!

Ledilson Motta 19.07.2019 15:39

Фильтры @LedilsonMotta можно применять к render_block. developer.wordpress.org/reference/hooks/render_block

Sami Ahmed Siddiqui 19.07.2019 19:58

Получил ошибку. Я мог видеть, что применить_фильтры находится внутри функции визуал_блок(), здесь: developer.wordpress.org/reference/functions/render_block. Как я могу использовать применить_фильтры в приведенном выше примере?

Ledilson Motta 19.07.2019 21:26

@LedilsonMotta Вам нужно использовать add_filter, а не apply_filters

Sami Ahmed Siddiqui 19.07.2019 21:41
$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

samuelpodina 26.09.2019 11:07

Спасибо, комментарии помогают прояснить код, да и не плохо кинуть ссылку внутри поста как правку.

ggorlen 26.09.2019 17:04

Другие вопросы по теме