第三阶段:构建
目标:站点在本地运行。实际内容通过核心函数渲染。查询保存、转发后清理。结构测试通过。
首先阅读:项目的 AGENTS.md,然后是 references/architecture.md。
步骤
- 本地站点。 按照项目的
README.md中的“首次运行”部分操作。然后检查:ddev wp eval 'echo wp_get_environment_type();'必须输出local。 如果不是,请参阅references/local-env.md。在输出local之前,站点会认为自己是生产环境:可能被搜索引擎索引,也可能向真实客户发送邮件。 - 重命名示例内容类型。 在内容存在之前执行此操作。将
<prefix>_offer替换为业务的词语(tour、service、course):包括modules/content.php中的文章类型、重写 slug 和标签,以及函数名(_get_offers、_render_offer_card)、parts/offer-card.php文件和测试。文章类型名称有 20 个字符限制。 - 建模内容。 找到需求中需要的每个字段。将其注册为具有清理回调和认证回调的文章元数据。价格在元数据中为数字。0 表示“价格面议”,永远不是“免费”。如果编辑者需要更丰富的字段界面,可以在其基础上添加 ACF(免费)插件,但仅通过核心函数读取值。
- 数据文件 → 生成器(当站点所有者提供大量内容时):
- 在
docs/data/<type>/中为每个项目保留一个 Markdown 或 JSON 文件; - 编写一个幂等的 WP-CLI 脚本,根据这些文件创建或更新文章;
- 提供
--dry-run选项; - 使用
ddev wp eval-file - < scripts/<name>.php运行该脚本。 文件是可审查的真实数据;数据库是其副本。
- 在
- 模板为每个区域调用一个核心函数。
- 布局在主题中:模板、
parts/、皮肤覆盖。 - 数据、查询、价格、政策语句和表单来自核心。
- 使用
function_exists()保护每个调用,确保插件缺失时模板不会崩溃。
- 布局在主题中:模板、
- 查询。 保持管线在
modules/enquiry.php中(references/forms-and-leads.md)。- 同时在三个位置添加字段:表单、处理程序和详情框。
- 在
wp-config.php常量中设置收件箱和发件人,绝不在代码中硬编码。
- 政策文本(条款、押金、取消):在核心中作为单一函数实现(例如
<prefix>_policy( 'cancellation' ))。模板打印该函数,如果模板硬编码了政策语句,测试会失败。 - 新模块? 在
modules/中添加一个文件,在引导程序中添加一行require_once,并在同一提交中更新tests/structure/core.spec.ts。 - 检查和提交。
- 运行
npm run test:structure和npm run lint:php(0 错误)。 - 要求 wp-rules-reviewer 智能体审查差异。
- 提交(遵循 Conventional Commits)。
- 运行
门控(在 SITE_STATUS.md 中勾选)
-
wp_get_environment_type()= local - 核心插件和子主题已激活;皮肤已加载
- 实际内容通过核心函数渲染;没有硬编码的卡片、价格或别名
- 查询:保存 → 邮件发送 → 重试 → 清理;在 Mailpit 中端到端测试
- 结构测试通过;PHPCS 0 错误
禁止事项
- 业务逻辑、
WP_Query、价格、pll_*调用或政策文本在主题中。 - 未使用
wp_unslash和清理函数的原始$_POST或$_GET;输出未使用esc_*。 - 将第三方 API 密钥或端点放在 HTML 或 JS 中;从服务器端转发。
- 使用原始
wp option update切换插件模块;使用插件自身的 UI 或 CLI,然后重新检查其影响的每个页面。 - 未加前缀的函数、选项、钩子、元数据键或 nonce。