Gutenberg:如何在块编辑器后台使用php render_allback函数的输出?

时间:2020-04-10 作者:Marc

我试图为Gutenberg编写一个非常简单的块插件:一个简单的TOC生成器。我现在可以在帖子中放置一个块,目录将作为无序列表生成。太棒了但在后端(Gutenberg编辑器),仍然有我的丑陋块,只说“SimpleTOC”,不是动态的。

如何在插件中显示php函数“render\\u callback”的输出。phphttps://github.com/mtoensing/simpletoc/blob/0.5/plugin.php 在JS代码的“编辑”功能中?我阅读了教程并查看了核心模块,但我不了解服务器端的功能。

这是我所有的索引。js公司https://github.com/mtoensing/simpletoc/blob/0.5/src/index.js 块代码:

const { __, setLocaleData } = wp.i18n;
const { registerBlockType } = wp.blocks;

registerBlockType( \'simpletoc/toc\', {
    title: __( \'Table of Contents\', \'simpletoc\' ),
    icon: \'list-view\',
    category: \'layout\',
    edit( { className } ) {
    return <p className={ className }>
        <ul>
            <li>SimpleTOC</li>
            <li>SimpleTOC</li>
            <li>SimpleTOC</li>
        </ul>
        </p>;
  },
    save: props => {
        return null;
    },
} );
我的render\\u回调函数在插件中类似于此。phphttps://github.com/mtoensing/simpletoc/blob/0.5/plugin.php:

function render_callback( $attributes, $content ) {

    $blocks = parse_blocks( get_the_content( get_the_ID()));

    if ( empty( $blocks ) ) {
        return \'No contents.\';
    }

  //add only if block is used in this post.
  add_filter( \'render_block\', __NAMESPACE__ . \'\\\\filter_block\', 10, 2 );

    $headings = array_values( array_filter( $blocks, function( $block ){
        return $block[\'blockName\'] === \'core/heading\';
    }) );
    if ( empty( $headings ) ) {
        return \'No headings.\';
    }

    $heading_contents = array_column( $headings, \'innerHTML\');

    $output .= \'<ul class="toc">\';
    foreach ( $heading_contents as $heading_content ) {
        preg_match( \'|<h[^>]+>(.*)</h[^>]+>|iU\', $heading_content , $matches );

        $link = sanitize_title_with_dashes( $matches[1]);
        $output .= \'<li><a href="#\' . $link . \'">\' . $matches[1] . \'</a></li>\';
    }
    $output .= \'</ul>\';

    return $output;
}

2 个回复
最合适的回答,由SO网友:Marc 整理而成

我不得不在php(init)包中添加serversiderender作为组件。js和js代码。

php中的初始化

  wp_register_script(
    \'simpletoc\',
    plugins_url(\'build/index.js\', __FILE__),
    [ \'wp-blocks\', \'wp-i18n\', \'wp-element\', \'wp-server-side-render\' ],
    filemtime(plugin_dir_path(__FILE__) . \'build/index.js\')
    );
区块js:

const { __, setLocaleData } = wp.i18n;
const { registerBlockType } = wp.blocks;
import ServerSideRender from \'@wordpress/server-side-render\';

registerBlockType( \'simpletoc/toc\', {
    title: __( \'SimpleTOC\', \'simpletoc\' ),
    icon: \'list-view\',
    category: \'layout\',
    edit: function( props ) {
        return (
                    <p className={ props.className }>
            <ServerSideRender
                block="simpletoc/toc"
                attributes={ props.attributes }
            />
                    </p>
        );
    },
    save: props => {
        return null;
    },
} );
并将其安装到环境中:

npm install @wordpress/server-side-render --save
我忘记了第一步,然后就成功了。在此处填写工作脚本:https://github.com/mtoensing/simpletoc/tree/0.6

SO网友:Tim

我认为您丢失了块的PHP注册。

JS定义没有问题,但您需要告诉PHP该块存在。

您是否可以尝试在插件或函数中注册块。php文件?

下面是一个示例https://developer.wordpress.org/block-editor/tutorials/block-tutorial/creating-dynamic-blocks/

<?php

function simpletoc_toc_render_callback( $attributes, $content ) {
    return \'This is my block content\'.
}

function simpletoc_toc_register_block() {
    register_block_type( \'simpletoc/toc\', array(
        \'render_callback\' => \'simpletoc_toc_render_callback\'
    ) );

}
add_action( \'init\', \'simpletoc_toc_register_block\' );

请注意,上面的代码被缩短为基本代码。

EDIT 抱歉,没有意识到后端渲染的所有魔力都来自ACF插件。

你可能想看看这个。https://developer.wordpress.org/block-editor/packages/packages-server-side-render/ 虽然我不知道如何使用它。

相关推荐

Testing Plugins for Multisite

我最近发布了一个WordPress插件,它在单个站点上非常有效。我被告知该插件在多站点安装上不能正常工作,我理解其中的一些原因。我已经更新了代码,现在需要一种方法来测试更新后的代码,然后才能转到实时客户的多站点安装。我有一个用于测试的WordPress安装程序的单站点安装,但需要在多站点安装上进行测试。根据我所能找到的唯一方法是在网络上至少有两个站点来安装整个多站点安装,以测试我的插件。设置WordPress的整个多站点安装是插件开发人员的唯一/首选方式,还是有更快的测试环境可用。