如何解析WordPress小工具区域内插入的区块内容?
核心问题原因
dynamic_sidebar() 输出的是小工具渲染完成的最终HTML代码,而 parse_blocks() 仅能识别包含WordPress原生区块注释标记(形如<!-- wp:xxx -->)的原始未渲染内容,因此直接拿渲染后的HTML解析必然无法得到预期的区块结构。
可行实现方案
WordPress 5.8版本上线区块小工具编辑器后,所有区块类型的小工具原始内容都会存储在站点options表的widget_widget_block字段中,我们可以直接提取该原始内容再调用parse_blocks()解析,示例代码如下:
// 获取所有侧边栏的小工具配置 $all_sidebars = wp_get_sidebars_widgets(); // 替换为目标侧边栏ID,示例为sidebar-1 $target_sidebar_id = 'sidebar-1'; $target_widget_list = $all_sidebars[$target_sidebar_id] ?? []; // 获取所有区块小工具的原始配置 $block_widget_config = get_option( 'widget_widget_block', [] ); $parsed_sidebar_blocks = []; foreach ( $target_widget_list as $widget_id ) { // 筛选区块类型的小工具,适配低版本PHP可用strpos($widget_id, 'widget_block-') === 0替代str_starts_with if ( str_starts_with( $widget_id, 'widget_block-' ) ) { $instance_id = (int) substr( $widget_id, 13 ); if ( isset( $block_widget_config[$instance_id]['content'] ) ) { // 解析原始区块内容 $blocks = parse_blocks( $block_widget_config[$instance_id]['content'] ); $parsed_sidebar_blocks = array_merge( $parsed_sidebar_blocks, $blocks ); } } } // $parsed_sidebar_blocks 即为侧边栏内所有区块的解析结果
注意事项
- 该方案仅适用于WordPress 5.8及以上版本
- 若侧边栏中包含传统非区块类型的小工具,这部分内容无法通过该方法解析,仍需通过
dynamic_sidebar()渲染获取输出
内容的提问来源于stack exchange,提问作者Thirumani guhan
相关产品推荐
相关产品推荐

