Mastering Gutenberg: A Guide to Modifying Post Content Blocks with PHP

Since its introduction in WordPress 5.0, Gutenberg has revolutionized the way users create and manage content on their websites. With its block-based editor, Gutenberg offers a flexible and intuitive approach to designing web pages.

While Gutenberg provides an array of built-in blocks, sometimes you may want to customize them to suit your specific needs. In this article, we will explore how to modify Gutenberg blocks from post content using PHP, allowing you to take full control of your website’s design and functionality.

Understanding Gutenberg Blocks

Before diving into the customization process, it’s essential to grasp the concept of Gutenberg blocks. A Gutenberg block is a self-contained unit of content that can be added and arranged to build your web pages. Blocks range from simple elements like paragraphs and headings to complex components such as galleries, forms, or even custom blocks created by developers.

Locating Block Content in PHP

To modify a Gutenberg block’s content programmatically, we need to locate the block within the PHP template files. When using Gutenberg, the post content is stored as an array of blocks. You can access this array using the parse_blocks() function, which converts the content into a structured format.

$content = get_the_content();
$blocks = parse_blocks($content);

Once you have the blocks array, you can loop through it to find the specific block you want to modify. Each block has a blockName property, which indicates the type of block it is. You can use this property to target the desired block.

Modifying Block Content

To modify the content of a Gutenberg block, you’ll first need to locate the block using the method described above. Once you have the block, you can access its attributes and modify them as needed. The attributes of a block are stored in an associative array called attrs.

Let’s say we want to modify the text inside a paragraph block. We can achieve this by finding the block with the blockName set to 'core/paragraph' and updating the content attribute.

foreach ($blocks as &$block) {
    if ($block['blockName'] === 'core/paragraph') {
        $block['attrs']['content'] = 'Modified content';

In the example above, we loop through each block until we find a paragraph block. Once found, we update the content attribute with our desired content. It’s important to use the & symbol before $block to ensure we are modifying the original array element.

Updating Block Attributes

Apart from modifying the content, you can also customize other attributes of a Gutenberg block. For instance, you may want to change the background color of a specific block or modify the number of columns in a gallery block.

To modify the attributes, you need to access the attrs array of the block. The structure and available attributes depend on the specific block type you are working with. WordPress provides extensive documentation on the available attributes for each block type.

Saving the Modified Blocks

After making the desired modifications to the blocks, you need to convert them back into a string format and save them. To do this, you can use the render_block() function to convert the blocks array into HTML.

$modifiedContent = '';
foreach ($blocks as $block) {
    $modifiedContent .= render_block($block);

In the code snippet above, we loop through the modified blocks and concatenate the rendered HTML into the $modifiedContent variable. Finally, you can output or save the modified content using echo or by assigning it to a variable.

Jan Horecny

Jan Horecny

Jan Horecny is a highly skilled Lead Senior Developer at GALTON Brands, specializing in WordPress development, PHP, and databases. With a keen eye for detail and a passion for creating exceptional online experiences, Jan consistently delivers top-notch solutions that drive results. His extensive expertise in WordPress, coupled with his deep understanding of PHP and database management, enables him to design and develop robust, scalable, and user-friendly websites.