Make WordPress Core

Changeset 59487


Ignore:
Timestamp:
12/05/2024 11:17:36 AM (22 months ago)
Author:
cbravobernal
Message:

Block Hooks: Fix context in update_ignored_hooked_blocks_postmeta.

Ensure that the $context arg passed from update_ignored_hooked_blocks_postmeta to apply_block_hooks_to_content (and from there, to filters such as hooked_block_types and hooked_block) has the correct type (WP_Post).

Filters hooked to hooked_block_types etc can typically include checks that conditionally insert a hooked block depending on $context. Prior to this changeset, a check like if ( $context instanceof WP_Post ) would incorrectly fail, as $context would be a stdClass instance rather han a WP_Post. As a consequence, a hooked block inside of a Navigation post object that was modified by the user would not be marked as ignored by update_ignored_hooked_blocks_postmeta, and thus be erroneosly re-inserted by the Block Hooks algorithm.

Reviewed by cbravobernal.
Merges [59482] to the 6.7 branch.

Props bernhard-reiter.
Fixes #62639.

Location:
branches/6.7
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/6.7

  • branches/6.7/src/wp-includes/blocks.php

    r59166 r59487  
    12181218        // Merge the existing post object with the updated post object to pass to the block hooks algorithm for context.
    12191219        $context          = (object) array_merge( (array) $existing_post, (array) $post );
     1220        $context          = new WP_Post( $context ); // Convert to WP_Post object.
    12201221        $serialized_block = apply_block_hooks_to_content( $markup, $context, 'set_ignored_hooked_blocks_metadata' );
    12211222        $root_block       = parse_blocks( $serialized_block )[0];
  • branches/6.7/tests/phpunit/tests/blocks/updateIgnoredHookedBlocksPostMeta.php

    r58578 r59487  
    194194                );
    195195        }
     196
     197        /**
     198         * @ticket 62639
     199         */
     200        public function test_update_ignored_hooked_blocks_postmeta_sets_correct_context_type() {
     201                $action = new MockAction();
     202                add_filter( 'hooked_block_types', array( $action, 'filter' ), 10, 4 );
     203
     204                $original_markup    = '<!-- wp:navigation-link {"label":"News","type":"page","id":2,"url":"http://localhost:8888/?page_id=2","kind":"post-type"} /-->';
     205                $post               = new stdClass();
     206                $post->ID           = self::$navigation_post->ID;
     207                $post->post_content = $original_markup;
     208                $post->post_type    = 'wp_navigation';
     209
     210                $post = update_ignored_hooked_blocks_postmeta( $post );
     211
     212                $args     = $action->get_args();
     213                $contexts = array_column( $args, 3 );
     214
     215                foreach ( $contexts as $context ) {
     216                        $this->assertInstanceOf(
     217                                WP_Post::class,
     218                                $context,
     219                                'The context passed to the hooked_block_types filter is not a WP_Post instance.'
     220                        );
     221                }
     222        }
    196223}
Note: See TracChangeset for help on using the changeset viewer.