make_before_block_visitor

The timeline below displays how wordpress function make_before_block_visitor has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.5

/**
 * Returns a function that injects the theme attribute into, and hooked blocks before, a given block.
 *
 * 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.
 *
 * @since 6.4.0
 * @since 6.5.0 Added $callback argument.
 * @access private
 *
 * @param array                           $hooked_blocks An array of blocks hooked to another given block.
 * @param WP_Block_Template|WP_Post|array $context       A block template, template part, `wp_navigation` post object,
 *                                                       or pattern that the blocks belong to.
 * @param callable                        $callback      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'.
 * @return callable A function that returns the serialized markup for the given block,
 *                  including the markup for any hooked blocks before it.
 */
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;
    };
}

WordPress Version: 6.4

/**
 * Returns a function that injects the theme attribute into, and hooked blocks before, a given block.
 *
 * 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.
 *
 * @since 6.4.0
 * @access private
 *
 * @param array                   $hooked_blocks An array of blocks hooked to another given block.
 * @param WP_Block_Template|array $context       A block template, template part, or pattern that the blocks belong to.
 * @return callable A function that returns the serialized markup for the given block,
 *                  including the markup for any hooked blocks before it.
 */
function make_before_block_visitor($hooked_blocks, $context)
{
    /**
     * 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) {
        _inject_theme_attribute_in_template_part_block($block);
        $markup = '';
        if ($parent_block && !$prev) {
            // Candidate for first-child insertion.
            $relative_position = 'first_child';
            $anchor_block_type = $parent_block['blockName'];
            $hooked_block_types = isset($hooked_blocks[$anchor_block_type][$relative_position]) ? $hooked_blocks[$anchor_block_type][$relative_position] : array();
            /**
             * Filters the list of hooked block types for a given anchor block type and relative position.
             *
             * @since 6.4.0
             *
             * @param string[]                $hooked_block_types  The list of hooked block types.
             * @param string                  $relative_position   The relative position of the hooked blocks.
             *                                                     Can be one of 'before', 'after', 'first_child', or 'last_child'.
             * @param string                  $anchor_block_type   The anchor block type.
             * @param WP_Block_Template|array $context             The block template, template part, or pattern that the anchor block belongs to.
             */
            $hooked_block_types = apply_filters('hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context);
            foreach ($hooked_block_types as $hooked_block_type) {
                $markup .= get_comment_delimited_block_content($hooked_block_type, array(), '');
            }
        }
        $relative_position = 'before';
        $anchor_block_type = $block['blockName'];
        $hooked_block_types = isset($hooked_blocks[$anchor_block_type][$relative_position]) ? $hooked_blocks[$anchor_block_type][$relative_position] : array();
        /** This filter is documented in wp-includes/blocks.php */
        $hooked_block_types = apply_filters('hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context);
        foreach ($hooked_block_types as $hooked_block_type) {
            $markup .= get_comment_delimited_block_content($hooked_block_type, array(), '');
        }
        return $markup;
    };
}