函数文档

_flatten_blocks()

💡 云策文档标注

概述

_flatten_blocks() 函数用于将传入的块及其内部块展平为一个数组,返回所有块的引用。它通过队列遍历块结构,递归处理内部块。

关键要点

  • 函数接受一个块数组作为参数,返回包含所有块引用的数组
  • 使用队列(queue)实现广度优先遍历,确保块和内部块按顺序处理
  • 适用于 WordPress 块编辑器(Gutenberg)开发,常用于处理嵌套块结构

代码示例

function _flatten_blocks( &$blocks ) {
    $all_blocks = array();
    $queue      = array();
    foreach ( $blocks as &$block ) {
        $queue[] = &$block;
    }

    while ( count( $queue ) > 0 ) {
        $block = &$queue[0];
        array_shift( $queue );
        $all_blocks[] = &$block;

        if ( ! empty( $block['innerBlocks'] ) ) {
            foreach ( $block['innerBlocks'] as &$inner_block ) {
                $queue[] = &$inner_block;
            }
        }
    }

    return $all_blocks;
}

注意事项

  • 函数使用引用传递(&$blocks),直接修改传入的块数组,需注意副作用
  • 从 WordPress 5.9.0 版本开始引入,适用于较新版本的块编辑器功能
  • 相关函数包括 _inject_theme_attribute_in_block_template_content() 和 _remove_theme_attribute_in_block_template_content(),用于处理块模板主题属性

📄 原文内容

Returns an array containing the references of the passed blocks and their inner blocks.

Parameters

$blocksarrayrequired
array of blocks.

Return

array block references to the passed blocks and their inner blocks.

Source

function _flatten_blocks( &$blocks ) {
	$all_blocks = array();
	$queue      = array();
	foreach ( $blocks as &$block ) {
		$queue[] = &$block;
	}

	while ( count( $queue ) > 0 ) {
		$block = &$queue[0];
		array_shift( $queue );
		$all_blocks[] = &$block;

		if ( ! empty( $block['innerBlocks'] ) ) {
			foreach ( $block['innerBlocks'] as &$inner_block ) {
				$queue[] = &$inner_block;
			}
		}
	}

	return $all_blocks;
}

Changelog

Version Description
5.9.0 Introduced.