块模板是否与SERIALIZE_BLOCKS不兼容?

时间:2021-12-09 作者:John Ryan

我需要使用wp_insert_post()wp_update_post(). 我正在处理的帖子类型有一个简单的块模板与之关联,因此我的目标是将块模板附加到帖子类型对象,使用innerContent, 然后使用serialize\\u块将模板转换为可呈现的post\\u内容标记(例如,带有标记)。

我的问题是,块模板在PHP中定义为索引数组:

$post_object->template = array(
   array( \'core/image\', array(
        \'align\' => \'left\',
   ) ),
   array( \'core/heading\', array(
        \'placeholder\' => \'Add Author...\',
   ) ),
   array( \'core/paragraph\', array(
        \'placeholder\' => \'Add Description...\',
    ) ),
);
虽然serialize\\u blocks()似乎需要与parse\\u blocks返回的内容类似的关联数组:

$blocks = parse_blocks( $post->post_content );
var_dump( $blocks );
// array(
//   array( \'blockName\' => \'core/image\', \'attrs\' => array(
//      \'align\' => \'left\',
// ) ),
//  array( \'blockName\' => \'core/heading\', \'attrs\' => array(
//       \'placeholder\' => \'Add Author...\',
// ) ),
// array( \'blockName\' => \'core/paragraph\', \'attrs\' => array(
//      \'placeholder\' => \'Add Description...\',
//  ) ),
//);
尝试将块模板定义为关联数组会中断编辑器,并且尝试使用索引数组序列化块会导致来自wp includes/blocks的未定义索引和无效参数警告。php,函数不返回任何内容。

这里有我遗漏的东西吗?将索引块模板数组转换为parse\\u blocks返回的关联数组格式的其他中介函数?

1 个回复
SO网友:John Ryan

This comment on another post 为我提供了一个正确的解决方案,该解决方案将块模板的索引数组转换为类似parse\\u块输出的关联数组(如下所示)。

但更大的问题仍然存在:为什么块模板不遵循parse\\u块使用的相同结构和格式?它们不打算以类似的方式使用吗?是否有其他本地解决方案可以将块模板转换为可渲染的帖子内容,甚至转换为可渲染的html?

以下是一个权宜之计,它可以将块模板的索引数组转换为序列化\\u块所需的关联数组:

function block_template_to_associative_array( $blocks ){
    $blocks_array = [];
    foreach( $blocks as $block ):
        $blocks_array[] = [
            \'blockName\' => $block[0],
            \'attrs\' => $block[1] ?? [],
            \'innerBlocks\' => isset( $block[2] ) ? block_template_to_associative_array( $block[2] ) : [],
            \'innerHTML\' => $block[3] ?? [],
            \'innerContent\' => $block[4] ?? []
        ];
    endforeach;
    return $blocks_array;
}
Edit: 不幸的是,这只是部分解决方案。它的结果与parse\\u blocks从post\\u内容创建的内容相近,但缺少在编辑器中正确呈现所需的innerHTML和innerContent。使用serialize\\u块,然后插入post\\u内容,结果是;此块包含意外或无效的内容;错误,但尝试块恢复成功恢复所有块和内部块。

相关推荐