From 1d49212bb97622e0773652cf1972b86fd08fca22 Mon Sep 17 00:00:00 2001 From: bernhard-reiter Date: Wed, 4 Dec 2024 12:05:33 +0000 Subject: [PATCH] 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 than 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. Props bernhard-reiter. Fixes #62639. git-svn-id: https://develop.svn.wordpress.org/trunk@59482 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/blocks.php | 1 + .../updateIgnoredHookedBlocksPostMeta.php | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 9d8f4bfaf9845..94c4dfa43afb6 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -1217,6 +1217,7 @@ function update_ignored_hooked_blocks_postmeta( $post ) { $existing_post = get_post( $post->ID ); // Merge the existing post object with the updated post object to pass to the block hooks algorithm for context. $context = (object) array_merge( (array) $existing_post, (array) $post ); + $context = new WP_Post( $context ); // Convert to WP_Post object. $serialized_block = apply_block_hooks_to_content( $markup, $context, 'set_ignored_hooked_blocks_metadata' ); $root_block = parse_blocks( $serialized_block )[0]; diff --git a/tests/phpunit/tests/blocks/updateIgnoredHookedBlocksPostMeta.php b/tests/phpunit/tests/blocks/updateIgnoredHookedBlocksPostMeta.php index 7b0a830dd52dd..18b5eff08ba79 100644 --- a/tests/phpunit/tests/blocks/updateIgnoredHookedBlocksPostMeta.php +++ b/tests/phpunit/tests/blocks/updateIgnoredHookedBlocksPostMeta.php @@ -193,4 +193,31 @@ public function test_update_ignored_hooked_blocks_postmeta_dont_modify_if_no_pos 'Post content did not match the original markup.' ); } + + /** + * @ticket 62639 + */ + public function test_update_ignored_hooked_blocks_postmeta_sets_correct_context_type() { + $action = new MockAction(); + add_filter( 'hooked_block_types', array( $action, 'filter' ), 10, 4 ); + + $original_markup = ''; + $post = new stdClass(); + $post->ID = self::$navigation_post->ID; + $post->post_content = $original_markup; + $post->post_type = 'wp_navigation'; + + $post = update_ignored_hooked_blocks_postmeta( $post ); + + $args = $action->get_args(); + $contexts = array_column( $args, 3 ); + + foreach ( $contexts as $context ) { + $this->assertInstanceOf( + WP_Post::class, + $context, + 'The context passed to the hooked_block_types filter is not a WP_Post instance.' + ); + } + } }