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?
2 s
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']
);
}
}