Пользовательские блоки Gutenberg php рендерит - PullRequest
0 голосов
/ 07 декабря 2018

Я создаю несколько пользовательских динамических блоков для редактора WordPress Gutenberg (по этой ссылке ).

Я использую рендеринг PHP для этих блоков, что означает, что у меня есть этот код при сохранении:

save: function( props ) {
    // Rendering in PHP
      return;

},

Функция рендеринга вызывается с помощью этого обратного вызова:

register_block_type( 'my-plugin/latest-post', array(
    'render_callback' => 'my_plugin_render_block_latest_post',
) );

Я не собираюсь публиковать код функции, так как в данном случае это не имеет значения.(Я делаю WP_Query, отображаю некоторые пользовательские данные и возвращаю HTML-код), * ​​1011 *

Моя проблема в том, что WP Gutenberg берет вывод из функции и добавляет <p> and <br> теги (классическое поведение wpautop).

Мой вопрос: как я могу отключить это только для пользовательских блоков?Я мог бы использовать это:

remove_filter( 'the_content', 'wpautop' );

, но я не хочу изменять поведение по умолчанию.

Некоторые дополнительные выводы.Функция php для рендеринга блоков использует get_the_excerpt ().Как только эта функция используется (и я предполагаю, что это происходит для get_the_content ()), применяется фильтр wpautop и html-разметка блока портится.

Я не знаю, является ли это ошибкой илиожидаемое поведение, но есть ли простое решение для этого, которое не включает в себя удаление фильтра?(Например, удалить этот фильтр не разрешено.)

1 Ответ

0 голосов
/ 13 декабря 2018

У нас по умолчанию:

add_filter( 'the_content', 'do_blocks', 9 );
add_filter( 'the_content', 'wpautop' );
add_filter( 'the_excerpt', 'wpautop' );
...

Я пролистал do_blocks() ( src ) и, если я правильно понимаю, он удаляет фильтрацию wpautop, если содержимое содержит какие-либоблокирует, но восстанавливает фильтр для любого последующего the_content() использования.

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

Можно было бынапример, попробуйте:

$block_content = '';

remove_filter( 'the_content', 'wpautop' ); // Remove the filter on the content.
remove_filter( 'the_excerpt', 'wpautop' ); // Remove the filter on the excerpt.

... code in callback ...

add_filter( 'the_content', 'wpautop' );    // Restore the filter on the content.
add_filter( 'the_excerpt', 'wpautop' );    // Restore the filter on the excerpt.

return $block_content;

в вашем my_plugin_render_block_latest_post() коде обратного вызова.

...