Make WordPress Core


Ignore:
Timestamp:
12/04/2023 08:24:33 PM (3 years ago)
Author:
Bernhard Reiter
Message:

Block Hooks: Store ignored hooked blocks metadata in anchor block.

The biggest tradeoff that was made in the implementation of Block Hooks was that they were limited to layouts (i.e. templates, template parts, and patterns) that didn't have any user modifications (see #59313 for the reason). This changeset is a preparatory step to remove this limitation, so they’ll eventually also work with user-modified layouts.

The crucial problem to solve is how to acknowledge that a user has opted to remove or persist a hooked block, so that the auto-insertion mechanism won't run again and inject an extraneous hooked block on the frontend when none is solicited.

This is achieved by storing all known blocks hooked to a given anchor block in the metadata attribute on that anchor block; specifically in a field called ignoredHookedBlocks inside of the metadata. Hooked blocks are only rendered on the frontend if they're absent from that field; OTOH, they're injected into that field (via the REST API) when first loaded in the editor.

This simple logic guarantees that once a user modifies a given layout, those changes are respected on the frontend; yet if a plugin that includes a hooked block is activated after those modifications have taken place, the hooked block will be rendered on the frontend. This new technique supplants the one previously used (i.e. rendering hooked blocks on the frontend only if a layout doesn't have any modifications) in a rather direct way.

Note that this changeset only introduces the new metadata field and relevant logic; it does not yet enable hooked block insertion into modified layouts. That will be done in a subsequent step (see #59646).

Props gziolo.
Closes #60008.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/blocks/getHookedBlocks.php

    r56805 r57157  
    150150                );
    151151                $this->assertStringContainsString(
    152                         '<!-- wp:post-content {"layout":{"type":"constrained"}} /-->'
     152                        '<!-- wp:post-content {"layout":{"type":"constrained"},"metadata":{"ignoredHookedBlocks":["tests/hooked-after"]}} /-->'
    153153                        . '<!-- wp:tests/hooked-after /-->',
    154154                        $template->content
     
    177177                $this->assertStringContainsString(
    178178                        '<!-- wp:tests/hooked-before /-->'
    179                         . '<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} /-->',
     179                        . '<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"},"metadata":{"ignoredHookedBlocks":["tests/hooked-before"]}} /-->',
    180180                        $template->content
    181181                );
     
    216216                );
    217217                $this->assertStringContainsString(
    218                         '<!-- wp:comments -->'
     218                        '<!-- wp:comments {"metadata":{"ignoredHookedBlocks":["tests/hooked-first-child"]}} -->'
    219219                        . '<div class="wp-block-comments">'
    220220                        . '<!-- wp:tests/hooked-first-child /-->',
Note: See TracChangeset for help on using the changeset viewer.