1

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?

1

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']
        );
    }
}
  • Awesome. Thanks. I didn't know about this experimental class – Sudar Jul 21 at 18:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.