I am writing a migration script which has to read the post_content of posts and then dynamically change some attributes of some custom Gutenberg blocks.
I was able to read the post_content and then convert them into block objects by using the parse_blocks
function. I was also able to dynamically change the attributes of the custom blocks by manipulating the block objects.
But I am not able to convert these block objects into the special HTML comments that Gutenberg uses to serialize them so that I can update the post_content.
I found that the PHP part of WordPress core only has parse_blocks
function to parse the special HTML comments into block objects and render_block
function to render the blocks, but there is no serialize_block
function.
I found that in JavaScript there is a function called serializeBlock
which does this. But is there an equivalent of it in PHP which I can call from my migration scripts?
This markup is generated on the js side of things and saved in the content of the block editor, which is why there doesn’t seem to be a native PHP function for this.
However, I found a PHP method that does exactly this in an “experimental” class in the Gutenberg plugin. You can see this here: https://github.com/WordPress/gutenberg/blob/master/lib/class-experimental-wp-widget-blocks-manager.php#L265
You could add it as a method in your own class or convert to a standard function like so:
/**
* 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']
);
}
}