# 站点编辑模板

## 模板与模板部件流程

本文档将阐述模板及模板部件在前端如何渲染、在后端如何编辑的内部机制。

## 存储机制

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

当用户编辑模板（或模板部件）时，初始的主题模板文件将保持原样，但模板的衍生版本会保存至`wp_template`自定义文章类型（模板部件则保存至`wp_template_part`）。

这意味着在任意时间点，网站前端渲染会同时使用主题文件中的模板文件与CPT模板（经编辑的模板）。

## 同步机制

为简化从两个不同位置编辑和渲染模板的算法，我们执行了名为"模板同步"的操作。

同步操作包括将主题模板复制到`wp_template`（及`wp_template_part`）自定义模板中并标记为`auto-draft`状态。当用户编辑这些模板时，状态将更新为`publish`。

这意味着：

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

同步机制对以下两个流程至关重要：

- 当编辑模板和模板部件时，站点编辑器前端通过REST API获取已编辑和可用的模板。这意味着所有对`wp-templates`和`wp-template-parts`端点的`GET`API请求都需要进行同步
- 当渲染模板（有时称为"解析模板"）时：这是WordPress遵循的算法，用于遍历模板层级结构并为当前加载页面找到正确的渲染模板
- 当导出区块主题时，我们需要将所有模板重新导出为文件。同步机制可简化此操作，仅导出CPT模板

## 主题切换

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

- 用户可能喜欢主题A的"页眉"模板部件，并希望在主题B中使用它
- 用户可能喜欢主题A的"联系"模板，并希望在主题B中使用它

实现这些流程需要精心设计的界面和用户体验。在全站编辑的当前阶段，我们首先禁止这些可能性，确保模板和模板部件具有主题专属性。

尽管如此，记录模板和模板部件的初始来源（基于哪个主题）仍然非常重要。我们通过为每个模板和模板部件CPT条目保存包含主题标识符的`theme`文章元数据来实现这一点。

未来，我们可能会考虑允许用户混合使用具有不同`theme`文章元数据值的模板和模板部件。