我需要使用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返回的关联数组格式的其他中介函数?
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内容,结果是;此块包含意外或无效的内容;错误,但尝试块恢复成功恢复所有块和内部块。