wp-includes/blocks.php:1104Runs the hooked blocks algorithm on the given content.
$contentstring$contextWP_Block_Template|WP_Post|array|nulloptionalnull$callbackcallableoptional'insert_hooked_blocks'stringfunction apply_block_hooks_to_content( $content, $context = null, $callback = 'insert_hooked_blocks' ) { // Default to the current post if no context is provided. if ( null === $context ) { $context = get_post(); } $hooked_blocks = get_hooked_blocks(); $before_block_visitor = '_inject_theme_attribute_in_template_part_block'; $after_block_visitor = null; if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) { $before_block_visitor = make_before_block_visitor( $hooked_blocks, $context, $callback ); $after_block_visitor = make_after_block_visitor( $hooked_blocks, $context, $callback ); } $block_allows_multiple_instances = array(); /* * Remove hooked blocks from `$hooked_block_types` if they have `multiple` set to false and * are already present in `$content`. */ foreach ( $hooked_blocks as $anchor_block_type => $relative_positions ) { foreach ( $relative_positions as $relative_position => $hooked_block_types ) { foreach ( $hooked_block_types as $index => $hooked_block_type ) { $hooked_block_type_definition = WP_Block_Type_Registry::get_instance()->get_registered( $hooked_block_type ); $block_allows_multiple_instances[ $hooked_block_type ] = block_has_support( $hooked_block_type_definition, 'multiple', true ); if ( ! $block_allows_multiple_instances[ $hooked_block_type ] && has_block( $hooked_block_type, $content ) ) { unset( $hooked_blocks[ $anchor_block_type ][ $relative_position ][ $index ] ); } } if ( empty( $hooked_blocks[ $anchor_block_type ][ $relative_position ] ) ) { unset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] ); } } if ( empty( $hooked_blocks[ $anchor_block_type ] ) ) { unset( $hooked_blocks[ $anchor_block_type ] ); } } /* * We also need to cover the case where the hooked block is not present in * `$content` at first and we're allowed to insert it once -- but not again. */ $suppress_single_instance_blocks = static function ( $hooked_block_types ) use ( &$block_allows_multiple_instances, $content ) { static $single_instance_blocks_present_in_content = array(); foreach ( $hooked_block_types as $index => $hooked_block_type ) { if ( ! isset( $block_allows_multiple_instances[ $hooked_block_type ] ) ) { $hooked_block_type_definition = WP_Block_Type_Registry::get_instance()->get_registered( $hooked_block_type ); $block_allows_multiple_instances[ $hooked_block_type ] = block_has_support( $hooked_block_type_definition, 'multiple', true ); } if ( $block_allows_multiple_instances[ $hooked_block_type ] ) { continue; } // The block doesn't allow multiple instances, so we need to check if it's already present. if ( in_array( $hooked_block_type, $single_instance_blocks_present_in_content, true ) || has_block( $hooked_block_type, $content ) ) { unset( $hooked_block_types[ $index ] ); } else { // We can insert the block once, but need to remember not to insert it again. $single_instance_blocks_present_in_content[] = $hooked_block_type; } } return $hooked_block_types; }; add_filter( 'hooked_block_types', $suppress_single_instance_blocks, PHP_INT_MAX ); $content = traverse_and_serialize_blocks( parse_blocks( $content ),Introduced in 6.6.0. One change between 6.7.7 and 7.1.0.
Signature, return type and hooks compared across 5 parsed releases.
$context retyped from WP_Block_Template|WP_Post|array to WP_Block_Template|WP_Post|array|null.verified against sourcesrc/wp-includes/blocks.php, and regenerated for each WordPress release so it tracks the code rather than a snapshot of it.