我正在使用 FSE 主题,我需要在导航块中添加一个简短的代码。 我知道没有直接的方法可以做到这一点,但我也找到了这个钩子block_core_navigation_render_inner_blocks。 如果我尝试添加迷你购物车(WooCommerce)块,则可以使用该挂钩,但现在我需要添加短代码。代码是:
add_filter(
'block_core_navigation_render_inner_blocks',
function( $inner_blocks ) {
$menu_item = [
'blockName' => 'core/shortcode',
'attrs' => [
"text" => 'fk_cart_menu',
],
'innerBlocks' => [],
'innerHTML' => '',
'innerContent' => [],
];
$inner_blocks->offsetSet( null, $menu_item );
return $inner_blocks;
}
);
我在导航块中没有看到短代码。为什么? 短代码存在,我还用
shortcode_exists()
检查了它,返回 true
我也尝试使用 [fk_car_menu] 带括号,但没有任何运气。
尽管有这个名字,短代码块实际上并不返回块;而是返回一个块。因此block_core_navigation_render_inner_blocks
无法渲染
短代码块,因为它只渲染块。这就是为什么在您的测试中,WooCommerce 块起作用但短代码块不起作用。
解决此限制的一种可能方法是注册您自己的动态块,在渲染回调中调用
do_shortcode(...)
,然后在您的add_filter(...)
代码中使用它,例如:
function so78080575_render_callback() {
// return your shortcode, not echo..
return do_shortcode( '[fk_cart_menu]' );
}
/* Register a simple, dynamic block */
function so78080575_register_block() {
if ( !function_exists( 'register_block_type' ) ) {
// return if block editor unavailable
return;
}
register_block_type( 'so/78080575',
$args = array(
'title' => 'FK Cart Menu',
'icon' => 'smiley',
'render_callback' => 'so78080575_render_callback' // to render shortcode
)
);
}
add_action( 'init', 'so78080575_register_block' );
add_filter(
'block_core_navigation_render_inner_blocks', // accepts only valid blocks
function( $inner_blocks ) {
$menu_item = new WP_Block(['blockName' => 'so/78080575']);
$inner_blocks->offsetSet( null, $menu_item );
return $inner_blocks;
}
);
希望这能让您更接近您想要实现的目标...