Title: make_before_block_visitor
Published: November 8, 2023
Last modified: May 20, 2026

---

# make_before_block_visitor( array $hooked_blocks, WP_Block_Template|WP_Post|array $context, callable $callback = 'insert_hooked_blocks' ): callable

## In this article

 * [Description](https://developer.wordpress.org/reference/functions/make_before_block_visitor/?output_format=md#description)
 * [Parameters](https://developer.wordpress.org/reference/functions/make_before_block_visitor/?output_format=md#parameters)
 * [Return](https://developer.wordpress.org/reference/functions/make_before_block_visitor/?output_format=md#return)
 * [Source](https://developer.wordpress.org/reference/functions/make_before_block_visitor/?output_format=md#source)
 * [Related](https://developer.wordpress.org/reference/functions/make_before_block_visitor/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/functions/make_before_block_visitor/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/functions/make_before_block_visitor/?output_format=md#wp--skip-link--target)

This function’s access is marked private. This means it is not intended for use 
by plugin or theme developers, only by core. It is listed here for completeness.

Returns a function that injects the theme attribute into, and hooked blocks before,
a given block.

## 󠀁[Description](https://developer.wordpress.org/reference/functions/make_before_block_visitor/?output_format=md#description)󠁿

The returned function can be used as `$pre_callback` argument to `traverse_and_serialize_block(
s)`, where it will inject the `theme` attribute into all Template Part blocks, and
prepend the markup for any blocks hooked `before` the given block and as its parent’s`
first_child`, respectively.

This function is meant for internal use only.

## 󠀁[Parameters](https://developer.wordpress.org/reference/functions/make_before_block_visitor/?output_format=md#parameters)󠁿

 `$hooked_blocks`arrayrequired

An array of blocks hooked to another given block.

`$context`[WP_Block_Template](https://developer.wordpress.org/reference/classes/wp_block_template/)
|[WP_Post](https://developer.wordpress.org/reference/classes/wp_post/)|arrayrequired

A block template, template part, post object, or pattern that the blocks belong 
to.

`$callback`callableoptional

A function that will be called for each block to generate the markup for a given
list of blocks that are hooked to it.
 Default: `'insert_hooked_blocks'`.

Default:`'insert_hooked_blocks'`

## 󠀁[Return](https://developer.wordpress.org/reference/functions/make_before_block_visitor/?output_format=md#return)󠁿

 callable A function that returns the serialized markup for the given block, including
the markup for any hooked blocks before it.

## 󠀁[Source](https://developer.wordpress.org/reference/functions/make_before_block_visitor/?output_format=md#source)󠁿

    ```php
    function make_before_block_visitor( $hooked_blocks, $context, $callback = 'insert_hooked_blocks' ) {
    	/**
    	 * Injects hooked blocks before the given block, injects the `theme` attribute into Template Part blocks, and returns the serialized markup.
    	 *
    	 * If the current block is a Template Part block, inject the `theme` attribute.
    	 * Furthermore, prepend the markup for any blocks hooked `before` the given block and as its parent's
    	 * `first_child`, respectively, to the serialized markup for the given block.
    	 *
    	 * @param array $block        The block to inject the theme attribute into, and hooked blocks before. Passed by reference.
    	 * @param array $parent_block The parent block of the given block. Passed by reference. Default null.
    	 * @param array $prev         The previous sibling block of the given block. Default null.
    	 * @return string The serialized markup for the given block, with the markup for any hooked blocks prepended to it.
    	 */
    	return function ( &$block, &$parent_block = null, $prev = null ) use ( $hooked_blocks, $context, $callback ) {
    		_inject_theme_attribute_in_template_part_block( $block );

    		$markup = '';

    		if ( $parent_block && ! $prev ) {
    			// Candidate for first-child insertion.
    			$markup .= call_user_func_array(
    				$callback,
    				array( &$parent_block, 'first_child', $hooked_blocks, $context )
    			);
    		}

    		$markup .= call_user_func_array(
    			$callback,
    			array( &$block, 'before', $hooked_blocks, $context )
    		);

    		return $markup;
    	};
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/blocks.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/7.0/src/wp-includes/blocks.php#L1541)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/7.0/src/wp-includes/blocks.php#L1541-L1574)

## 󠀁[Related](https://developer.wordpress.org/reference/functions/make_before_block_visitor/?output_format=md#related)󠁿

| Uses | Description | 
| [_inject_theme_attribute_in_template_part_block()](https://developer.wordpress.org/reference/functions/_inject_theme_attribute_in_template_part_block/)`wp-includes/block-template-utils.php` |

Injects the active theme’s stylesheet as a `theme` attribute into a given template part block.

  |

| Used by | Description | 
| [apply_block_hooks_to_content()](https://developer.wordpress.org/reference/functions/apply_block_hooks_to_content/)`wp-includes/blocks.php` |

Runs the hooked blocks algorithm on the given content.

  |

## 󠀁[Changelog](https://developer.wordpress.org/reference/functions/make_before_block_visitor/?output_format=md#changelog)󠁿

| Version | Description | 
| [6.5.0](https://developer.wordpress.org/reference/since/6.5.0/) | Added $callback argument. | 
| [6.4.0](https://developer.wordpress.org/reference/since/6.4.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fmake_before_block_visitor%2F)
before being able to contribute a note or feedback.