How to serialize a Gutenberg block from block attributes in PHP?

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

Leave a Comment