静态块与动态块:有何区别?
WordPress 块编辑器提供两种类型的块:静态块和动态块。这两种块类型的区别在于它们在前端如何渲染。
静态块
静态块是一种在页面保存时其标记已知的内容片段。该块将其内容和标记直接保存在文章内容中。段落块是静态块的一个简单示例。

段落内的文字除非内容编辑者手动更改,否则不会改变。内容和标记都是已知的,这使得段落块成为静态块的绝佳示例。其 HTML 标记直接保存到文章内容中。
静态块完全用 JavaScript 编写。save() 函数将块的标记写入 wp_posts 数据库表中文章的 post_content 条目。上面示例的条目将包含确切的标记,外加块指示器内联注释:
<!-- wp:paragraph -->
<p>If I had a boat, I'd go out on the ocean.</p>
<!-- /wp:paragraph -->
块指示器是整体块语法的一部分。WordPress 使用这些 HTML 注释来定义块及其任何属性或元数据。WordPress 解析这些注释以在编辑器和前端显示块,但这些注释永远不会在源代码中渲染。对于静态块,源代码将只包含块指示器内部的标记。
深入探讨
静态块的 save() 函数和保存到数据库的内容彼此紧密相关。文章编辑器运行验证检查,以确保 save() 函数创建的标记与已保存到数据库的标记完全相同。如果存在任何差异,文章编辑器会变得非常“不高兴”并声明该块已损坏。这称为块验证错误。
内容编辑者可以选择尝试块恢复。这将尝试根据块的属性,协调数据库中的内容与块预期保存到数据库的内容。这个恢复过程有时会成功,但并非总是如此。
块验证错误最常见的原因是块的 save() 函数被更新以更改块生成的标记。任何微小的更改,即使是对类名的更改,都可能触发编辑器中的验证错误。
块开发者可以通过添加块弃用来注册块中的更改,从而缓解这些问题。块弃用会记录块标记的先前版本。然后,文章编辑器可以将块的当前内容与先前版本进行比较,并(理想情况下)避免验证错误。
动态块
动态块是一种在页面保存时其标记和确切内容未知的内容片段。这种块可能包含有时效性或依赖于网站其他部分更改的内容。动态块的内容预计会在没有内容编辑者干预的情况下发生变化。因此,动态块的标记在服务器端渲染。
一个简单的例子是核心的站点标题块,它显示网站的名称。此块必须是动态的,因为其内容在页面保存时无法预知。站点标题可以随时通过站点设置更改。

深入探讨
动态块在 JavaScript 和 PHP 中都需要注册。JavaScript 端处理编辑器体验,而 PHP 端处理前端标记的服务器端渲染。
PHP 块注册使用 register_block_type() 函数,该函数需要定义一个渲染方法。这可以通过以下两种方式之一实现:
- 注册函数包含一个
render_callback参数。 - 向
block.json添加一个render属性,其值指向一个单独的 PHP 文件。
这些渲染方法会自动接收属性和内部内容信息。它们还可以获取其他所需的动态站点信息——文章列表、评论、分类信息等。
块仍然作为文章 post_content 条目的一部分保存。但是,块的任何标记都不会保存到数据库。相反,其属性被写在块指示器注释内部。每当前端用户访问页面时,都会调用渲染方法来创建块的标记。
举个例子,让我们将上面的段落块想象成一个动态块。在这种情况下,块的序列化形式被保存到数据库。这种形式使用自闭合的块指示器注释。块属性以 JSON 编码字符串中的键值对形式保存:
<!— wp:paragraph { “content”: “If I had a boat, I'd go out on the ocean.” } /—>
块的渲染方法将获取内容属性并应用标记。前端代码将与块的静态版本相同。
应该使用哪种类型?
如果你是块开发者,你可能需要做出的首要决定之一是将块编写为静态块还是动态块。
有时,块的需求会为你做出决定。你的块是否依赖于网站其他部分的信息,例如其他文章、分类法或站点设置?如果是,那么块必须是动态的。内容依赖于其所在页面之外的信息,因此它可能会发生变化。
另一方面,如果你能保证块的内容始终保持不变,你仍然有选择。静态块是显而易见的选择,因为内容是静态的。然而,在这种情况下,选择动态块也有其道理。
静态块的优点
静态块本质上更简单,因为它们只用一种语言(JavaScript)编写。它们的标记在页面保存时已知,因此,如上所述,所有这些 HTML 代码都可以直接保存到数据库。
这种方法性能更高。当访问者查看页面时,内容来自数据库。由于不需要服务器端渲染,显示块时没有延迟。
动态块的优点
动态块的标记预计会发生变化。这就是为什么该标记不保存到数据库的原因。因此,该标记不受文章编辑器验证的约束。这意味着对动态块标记的更改不会引发验证错误。块验证错误相当复杂,北卡罗来纳州立大学这篇关于选择动态块的文章对此有精彩的解释。
这对于更敏捷的团队中的块开发者来说可能是有利的,因为标记更改可能更频繁。例如,团队可能希望对块进行 UX 或可访问性改进。如果该块是动态块,则只需对 PHP render() 函数进行标记更改。无需向弃用数组添加内容。
结论
块开发者可以选择他们想要开发的块类型。静态块非常适合不会改变的内容和标记。动态块专为依赖于外部因素的内容而设计,但对于静态内容也有优势。最终,由块开发者根据其内容和具体情况做出正确的选择。