面向 WordPress 開發者的 EmDash

本頁內容

EmDash 保留了熟悉的內容概念,如文章、頁面、分類法、選單、媒體和修訂。Astro 提供佈景主題層:路由、佈局、元件和伺服器渲染。

保持熟悉的部分

編輯器仍然使用具名內容類型、結構化欄位、草稿和已發布狀態、階層式分類、扁平標籤、巢狀選單、媒體和修訂歷史。這些概念被遷移到 EmDash 集合和管理介面中。

開發工作流程發生了變化。PHP 範本選擇變為明確的 Astro 路由,範本部件變為匯入的元件,程式碼與資料庫內容分開部署。建置公開網站不需要 React;.astro 元件將伺服器端 TypeScript 與類 HTML 範本結合在一起。

概念對應

WordPressEmDash 和 Astro
Post TypeEmDash 集合
Post Meta集合欄位
分類或標籤EmDash 分類法
WP_QuerygetEmDashCollection()
get_post()getEmDashEntry()
the_content()<PortableText />
範本層級src/pages/ 中的檔案
範本部件匯入的 .astro 元件
header.phpfooter.phpAstro 佈局
wp_nav_menu()getMenu()
側邊欄小工具區域和 <WidgetArea />
Options API網站設定,或外掛的 ctx.kv
WordPress 外掛沙盒或原生 EmDash 外掛

內容模型

在 EmDash 管理後台的內容類型下建立和編輯集合。集合有明確的型別化欄位,可以啟用草稿、修訂、排程發布、搜尋、SEO 或留言。

查詢返回 Astro 即時集合項目。entry.id 是路由識別碼,通常是 slug;entry.data.id 是資料庫內容 ID。

以下封存按發布順序查詢文章:

---
import { getEmDashCollection } from "emdash";

const { entries: posts, error } = await getEmDashCollection("posts", {
  orderBy: { published_at: "desc" },
  limit: 10,
});

if (error) return new Response("無法載入文章", { status: 500 });
---

{posts.map((post) => (
  <article>
    <h2><a href={`/posts/${post.id}`}>{post.data.title}</a></h2>
    {post.data.excerpt && <p>{post.data.excerpt}</p>}
  </article>
))}

佈景主題檔案

Astro 路由取代了 WordPress 範本層級。範本選擇自己的 URL 結構,而不是依賴魔術檔名。

WordPress 檔案目前部落格範本檔案
front-page.phphome.phpsrc/pages/index.astro
single.phpsrc/pages/posts/[slug].astro
archive.phpsrc/pages/posts/index.astro
page.phpsrc/pages/pages/[slug].astro
category.phpsrc/pages/category/[slug].astro
tag.phpsrc/pages/tag/[slug].astro
search.phpsrc/pages/search.astro
404.phpsrc/pages/404.astro
header.phpfooter.phpsrc/layouts/Base.astro

有關 EmDash 範本使用的專案結構、元件語法、Props、插槽、佈局、路由和伺服器渲染查詢流程,請閱讀面向 WordPress 開發者的 Astro

選單和小工具區域

選單和小工具區域存在於資料庫中,設定後仍可編輯。範本在請求時查詢它們:

---
import { getMenu } from "emdash";
import { WidgetArea } from "emdash/ui";

const primary = await getMenu("primary");
---

<nav>
  {primary?.items.map((item) => <a href={item.url}>{item.label}</a>)}
</nav>

<aside><WidgetArea name="sidebar" /></aside>

網站設定和分類法

自訂器風格的網站身分位於 EmDash 設定中。取得一次設定,並在存在時使用解析後的標誌 URL:

---
import { getSiteSettings } from "emdash";

const settings = await getSiteSettings();
---

<a href="/">
  {settings.logo?.url
    ? <img src={settings.logo.url} alt={settings.logo.alt || settings.title} />
    : settings.title}
</a>

分類法術語是獨立記錄,而非直接儲存在 entry.data 中的值。解析一個術語,然後在集合篩選器中使用其 slug:

import { getEmDashCollection, getTerm } from "emdash";

const news = await getTerm("category", "news", { includeCounts: false });
const { entries: posts } = news
  ? await getEmDashCollection("posts", { where: { category: news.slug } })
  : { entries: [] };

外掛格式

EmDash 有兩種外掛格式:

  • 沙盒外掛使用 emdash-plugin.jsonc 作為其身分和信任合約,加上使用 SandboxedPlugin 型別的預設匯出 src/plugin.ts 物件。它可以在隔離的執行時中執行,並使用 Block Kit 建構管理 UI。
  • 原生外掛匯出建置時的描述符工廠和使用 definePlugin() 建構的執行時 createPlugin() 函式。用於 React 管理元件、公開 Astro 元件或頁面片段。

選擇外掛格式開始。掛鉤名稱和 PluginContext API 是共用的,但套件和處理常式的形式不可互換。

匯入 WordPress 內容

在管理側邊欄中開啟 WordPress 匯入,或直接造訪 /_emdash/admin/import/wordpress。EmDash 支援兩種匯入路徑:

  1. 上傳從 工具 → 匯出 匯出的 WordPress eXtended RSS(WXR)檔案。
  2. 在 WordPress 網站上安裝 EmDash Exporter 外掛,並使用 WordPress 應用程式密碼連線。此路徑可以包含一般公開 REST API 不公開的內容。

不使用匯出器輸入 WordPress URL 可以偵測網站並統計公開文章、頁面和媒體。該 REST 探測不匯入內容。

匯入器將 WordPress 的 publish 對應到 EmDash 的 published。草稿、待審、私密、排程、資源回收筒和未知狀態變為草稿。在變更 DNS 或停用 WordPress 之前,請檢查匯入的權限和發布狀態。

完整步驟和重試行為請參見從 WordPress 遷移

編輯器工作流程

EmDash 管理後台提供集合清單、Portable Text 編輯器、媒體管理、選單編輯、分類法管理、修訂和預覽連結。它不是 wp-admin 的視覺副本:Gutenberg 區塊變為 Portable Text,可用的介面取決於為網站設定的集合和功能。

下一步