Make WordPress Core


Ignore:
Timestamp:
02/20/2024 03:20:39 PM (3 months ago)
Author:
Bernhard Reiter
Message:

Block Hooks: Allow hooked_block filters to return null.

Allow returning null from the hooked_block and hooked_block_{$hooked_block_type} filters to suppress a hooked block from being inserted. This is required to allow extenders conditionally inserting a hooked block based on e.g. the value of an attribute of the anchor block.

Props swissspidy, gziolo, joshuatf, tomjcafferkey.
Fixes 60580.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/blocks.php

    r57660 r57668  
    898898         * @since 6.5.0
    899899         *
    900          * @param array                           $parsed_hooked_block The parsed block array for the given hooked block type.
     900         * @param array|null                      $parsed_hooked_block The parsed block array for the given hooked block type, or null to suppress the block.
    901901         * @param string                          $hooked_block_type   The hooked block type name.
    902902         * @param string                          $relative_position   The relative position of the hooked block.
     
    914914         * @since 6.5.0
    915915         *
    916          * @param array                           $parsed_hooked_block The parsed block array for the given hooked block type.
     916         * @param array|null                      $parsed_hooked_block The parsed block array for the given hooked block type, or null to suppress the block.
    917917         * @param string                          $hooked_block_type   The hooked block type name.
    918918         * @param string                          $relative_position   The relative position of the hooked block.
     
    923923        $parsed_hooked_block = apply_filters( "hooked_block_{$hooked_block_type}", $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context );
    924924
     925        if ( null === $parsed_hooked_block ) {
     926            continue;
     927        }
     928
    925929        // It's possible that the filter returned a block of a different type, so we explicitly
    926930        // look for the original `$hooked_block_type` in the `ignoredHookedBlocks` metadata.
     
    961965    if ( empty( $hooked_block_types ) ) {
    962966        return '';
     967    }
     968
     969    foreach ( $hooked_block_types as $index => $hooked_block_type ) {
     970        $parsed_hooked_block = array(
     971            'blockName'    => $hooked_block_type,
     972            'attrs'        => array(),
     973            'innerBlocks'  => array(),
     974            'innerContent' => array(),
     975        );
     976
     977        /** This filter is documented in wp-includes/blocks.php */
     978        $parsed_hooked_block = apply_filters( 'hooked_block', $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context );
     979
     980        /** This filter is documented in wp-includes/blocks.php */
     981        $parsed_hooked_block = apply_filters( "hooked_block_{$hooked_block_type}", $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context );
     982
     983        if ( null === $parsed_hooked_block ) {
     984            unset( $hooked_block_types[ $index ] );
     985        }
    963986    }
    964987
Note: See TracChangeset for help on using the changeset viewer.