
WordPress 动态区块若需支持嵌套的 InnerBlocks,即使其内容由服务端渲染,也必须在 JavaScript 的 save 函数中显式返回 ,否则编辑器无法序列化子区块内容,导致更新后丢失。
wordpress 动态区块若需支持嵌套的 innerblocks,即使其内容由服务端渲染,也必须在 javascript 的 `save` 函数中显式返回 `
在 Gutenberg 中,动态区块(dynamic block)的本质是:前端仅负责编辑体验,实际 HTML 渲染交由 PHP 的 render_callback 处理。但这并不意味着 save 函数可以省略或留空——恰恰相反,save 函数承担着关键的结构持久化职责:它告诉编辑器“哪些内容属于该区块的子结构”,从而确保 InnerBlocks 中插入的其他区块(如段落、标题、自定义区块等)能被正确序列化为 post content 并保存到数据库。
你当前的 block.js 中 save 函数写法存在两个问题:
- 使用了过时的函数式写法 function(props) { return (InnerBlocks.Content); },未正确调用组件;
- 更关键的是,InnerBlocks.Content 是一个 React 组件,必须作为 JSX 元素返回(即
),而非直接调用或裸引用。
✅ 正确写法如下(推荐使用箭头函数 + JSX 语法):
安全的随机密码生成器。支持自定义长度、字符类型(大写/小写字母、数字、特殊符号),排除相似字符,批量生成。纯 Python 标准库,无需 API 密钥。
save: (props) => {
return <innerblocks.content></innerblocks.content>;
},
⚠️ 注意事项:
- 即使是动态区块,save 函数不可省略,且必须返回
—— 这是 Gutenberg 识别并保留嵌套区块内容的唯一方式; - InnerBlocks.Content 不会输出实际 HTML(那是 PHP render_callback 的工作),它仅生成标准化的占位标记(如 ),供后端解析并注入真实内容;
- 若你在 edit 函数中已正确使用
(注意:无 .Content),则编辑界面可正常拖入子区块;但若 save 缺失或错误,这些子区块在「更新页面」后将彻底消失; - 确保 block.json 中未声明 supports.anchors 或 supports.html 等可能干扰嵌套逻辑的配置(本例无需额外设置);
- WordPress 6.x 完全支持此模式,无需降级或兼容补丁。
? 总结:动态 ≠ 被动。Gutenberg 的区块生命周期要求前后端协同——前端 save 负责结构固化,后端 render_callback 负责动态渲染。二者缺一不可。修正 save 函数后,刷新页面即可看到嵌套区块持久化保存,且服务端渲染结果(含 $content 插入位置)保持完整。










