模板与模板部分流程

本文档将解释模板和模板部分在前端如何渲染、在后台如何编辑的内部机制。

存储

与常规模板一样,区块模板最初以文件形式存在于主题文件夹中,但主要区别在于用户可以在站点编辑器的界面中编辑这些模板。

当用户编辑模板(或模板部分)时,初始的主题模板文件会保持原样,但该模板的一个分叉版本会保存到 wp_template 自定义文章类型(模板部分则对应 wp_template_part)中。

这些能力意味着在任何时间点,站点前端都是通过模板文件(来自主题)和 CPT 模板(已编辑的模板)的混合来渲染的。

同步

为了简化从两个不同位置编辑和渲染模板所使用的算法,我们执行了一项称为“模板同步”的操作。

同步操作是将主题模板以 auto-draft 状态复制到 wp_template(和 wp_template_part)自定义文章类型中。当用户编辑这些模板时,状态会更新为 publish。

这意味着:

  • 模板的渲染/获取只需考虑自定义文章类型的模板,无需直接从主题文件夹中获取模板文件,同步机制会确保这些模板已被复制到 CPT 中。
  • 未经改动的主题模板具有 auto-draft 状态。
  • 已编辑的主题模板具有 publish 状态。

同步对于两个不同的流程非常重要:

  • 在编辑模板和模板部分时,站点编辑器前端会通过 REST API 获取已编辑的模板和可用模板。这意味着对于所有向 wp-templates 和 wp-template-parts 端点发起的 GET API 请求,都需要进行同步。
  • 在渲染模板时(有时也称为“解析模板”):这是 WordPress 所遵循的算法,用于遍历模板层级,并为当前正在加载的页面找到要渲染的正确模板。
  • 在导出区块主题时,我们需要将其所有模板导回为文件。同步机制可以简化此操作,只需导出 CPT 模板即可。

切换主题

由于区块主题所使用的模板可以相互引用,并且可以保存到自定义文章类型中,因此就有可能混合使用来自不同主题的模板和模板部分。例如:

  • 用户可能喜欢主题 A 的“header”模板部分,并希望将其用于主题 B。
  • 用户可能喜欢主题 A 的“contact”模板,并希望将其用于主题 B。

启用这些流程需要经过精心设计的界面和体验。在全站编辑的当前阶段,我们先禁止这些可能性,并使模板和模板部分限定于特定主题。

话虽如此,跟踪模板和模板部分最初来自哪里、基于哪个主题,仍然很重要。我们通过为每个模板和模板部分的 CPT 条目保存一个包含主题标识符的 theme post meta 来实现这一点。

将来,我们可能会考虑允许用户混合使用具有不同 theme post meta 值的模板和模板部分。