如何在PHP中从块属性序列化Gutenberg块?

时间:2019-07-17 作者:Sudar

我正在编写一个迁移脚本,它必须读取帖子的post\\u内容,然后动态更改一些自定义Gutenberg块的一些属性。

我能够读取post\\u内容,然后使用parse_blocks 作用我还能够通过操纵块对象动态更改自定义块的属性。

但我无法将这些块对象转换为Gutenberg用来序列化它们以便更新post\\u内容的特殊HTML注释。

我发现WordPress core的PHP部分只有parse_blocks 函数将特殊HTML注释解析为块对象,并render_block 函数来渲染块,但没有serialize_block 作用

我发现在JavaScript中有一个函数serializeBlock 这就是为什么。但是,在PHP中是否有一个等效的迁移脚本可以调用它?

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

这个标记是在js端生成的,并保存在块编辑器的内容中,这就是为什么似乎没有用于此的本地PHP函数的原因。

然而,我在Gutenberg插件的一个“实验”类中发现了一个PHP方法,它可以做到这一点。您可以在此处看到:https://github.com/WordPress/gutenberg/blob/master/lib/class-experimental-wp-widget-blocks-manager.php#L265

您可以将其作为方法添加到自己的类中,或转换为标准函数,如下所示:

/**
 * Serializes a block.
 *
 * @param array $block Block object.
 * @return string String representing the block.
 */
function serialize_block( $block ) {
    if ( ! isset( $block[\'blockName\'] ) ) {
        return false;
    }
    $name = $block[\'blockName\'];
    if ( 0 === strpos( $name, \'core/\' ) ) {
        $name = substr( $name, strlen( \'core/\' ) );
    }
    if ( empty( $block[\'attrs\'] ) ) {
        $opening_tag_suffix = \'\';
    } else {
        $opening_tag_suffix = \' \' . json_encode( $block[\'attrs\'] );
    }
    if ( empty( $block[\'innerHTML\'] ) ) {
        return sprintf(
            \'<!-- wp:%s%s /-->\',
            $name,
            $opening_tag_suffix
        );
    } else {
        return sprintf(
            \'<!-- wp:%1$s%2$s -->%3$s<!-- /wp:%1$s -->\',
            $name,
            $opening_tag_suffix,
            $block[\'innerHTML\']
        );
    }
}

SO网友:uryga

2020年3月更新:看起来像serialize_block() 从5.3.1开始就包含在WP中,尽管我认为它现在还没有记录。Here\'s the source on Trac. 文档字符串显示:

/* [...]
 *
 * Returns the content of a block, including comment delimiters, serializing all
 * attributes from the given parsed block.
 *
 * This should be used when preparing a block to be saved to post content.
 * Prefer `render_block` when preparing a block for display. Unlike
 * `render_block`, this does not evaluate a block\'s `render_callback`, and will
 * instead preserve the markup as parsed.
 */
从我做的几个简单测试来看,它似乎工作得很好,但我不确定它是否打算用于公共用途,因为还有一个不同实现的Trac票据(截至2020年3月20日标记为“等待审查”):#47375 - Blocks API: Add server-side serialize_block()