第三階段:建置
目標:網站可在本機執行。真實項目透過核心函數呈現。詢問先儲存、再轉發、然後清除。結構測試皆為通過。
請先閱讀:專案的 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 個字元的限制。 - 建立內容模型。 找出簡報所需的所有欄位。將每個欄位註冊為具有 sanitize 回呼與 auth 回呼的 post meta。價格以數字形式儲存於 meta。0 表示「價格請洽詢」,切勿使用「免費」。若編輯者需要更豐富的欄位畫面,可在上方額外安裝 ACF(免費版),但僅能透過核心函數讀取值。
- 資料檔案 → 產生器(當業主提供大量項目時執行):
- 在
docs/data/<類型>/中為每個項目保留一個 Markdown 或 JSON 檔案; - 撰寫一個可重複執行的 WP-CLI 腳本,從這些檔案建立或更新文章;
- 為其提供
--dry-run選項; - 使用
ddev wp eval-file - < scripts/<名稱>.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 - 核心外掛與子佈景主題已啟用;子佈景主題的 Skin 正常載入
- 真實項目透過核心函數呈現;無寫死的卡片、價格或 slug
- 詢問:已儲存 → 已寄送電子郵件 → 重試 → 清除;在 Mailpit 中完成端到端測試
- 結構測試通過;PHPCS 0 個錯誤
禁忌
- 商業邏輯、
WP_Query、價格、pll_*呼叫或政策文字不可放在佈景主題。 - 未使用
wp_unslash加上 sanitize 函數的原始$_POST或$_GET;未使用esc_*的輸出。 - 第三方 API 金鑰或端點不可出現在 HTML 或 JS 中。應由伺服器端轉發。
- 不可使用原始
wp option update切換外掛模組。請使用外掛本身的 UI 或 CLI,然後重新檢查所有受影響的頁面。 - 不可使用未加前綴的函數、選項、勾點、meta 鍵或 nonce。