WordPress開発者のためのEmDash
このページで分かること
- WordPressの概念(投稿タイプ、投稿メタ、カテゴリー・タグ、WP_Query、テンプレート階層、プラグインなど)が、EmDashとAstroの何にあたるかの対応表
- WordPressのテーマファイル(
single.php、archive.phpなど)とブログテンプレートのファイルの対応、メニュー・ウィジェットエリア・サイト設定・タクソノミーの取得方法 - 2つのプラグイン形式の違いと、WordPressのコンテンツをインポートする2つの方法(WXRファイル、EmDash Exporterプラグイン)
このページの目次
EmDashでは、投稿、固定ページ、タクソノミー、メニュー、メディア、リビジョンといった、なじみのあるコンテンツの概念がそのまま使えます。テーマの層は、Astroが受け持ちます。ルート、レイアウト、コンポーネント、サーバーでの描画です。
そのまま使える概念
編集者は引き続き、名前の付いたコンテンツの種類、構造化されたフィールド、下書きと公開済みの状態、階層を持つカテゴリー、階層のないタグ、入れ子のメニュー、メディア、リビジョンの履歴を使って作業します。これらの概念は、EmDashのコレクションと管理画面に移ります。
変わるのは開発のワークフローです。PHPのテンプレートの選択は明示的なAstroのルートになり、テンプレートパーツはimportするコンポーネントになり、コードはデータベースのコンテンツとは別にデプロイします。公開するサイトを作るのにReactは必要ありません。.astro コンポーネントは、サーバー側のTypeScriptとHTMLに似たテンプレートを組み合わせたものです。
やさしい解説
WordPressで編集者が使っていた機能(投稿、カテゴリー、タグ、メニュー、メディア、リビジョン)は、EmDashの管理画面にもあります。大きく変わるのは開発者の作業です。WordPressでは、ファイル名の決まり(テンプレート階層)によって使うテンプレートが自動で選ばれますが、Astroでは src/pages/ の中のファイルの置き場所がそのままURLになります。また、コードはデプロイで更新し、記事はデータベースに保存するという分担になります。
概念の対応表
| WordPress | EmDashとAstro |
|---|---|
| 投稿タイプ(Post type) | EmDashのコレクション |
| 投稿メタ(Post meta) | コレクションのフィールド |
| カテゴリーまたはタグ | EmDashのタクソノミー |
WP_Query |
getEmDashCollection() |
get_post() |
getEmDashEntry() |
the_content() |
<PortableText /> |
| テンプレート階層 | src/pages/ の中のファイル |
| テンプレートパーツ | importした .astro コンポーネント |
header.php と footer.php |
Astroのレイアウト |
wp_nav_menu() |
getMenu() |
| サイドバー | ウィジェットエリアと <WidgetArea /> |
| Options API | サイト設定、またはプラグインの ctx.kv |
| WordPressのプラグイン | EmDashのサンドボックス型プラグインまたはネイティブ型プラグイン |
コンテンツモデル
コレクションは、EmDashの管理画面の「コンテンツタイプ」で作成・編集します。コレクションは型が明示されたフィールドを持ち、下書き、リビジョン、予約公開、検索、SEO、コメントを有効にできます。
クエリは、Astroのライブコレクションのエントリーを返します。entry.id はルートの識別子で、通常はスラッグです。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("Could not load posts", { 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>
))}
やさしい解説
WordPressの WP_Query で投稿の一覧を取得していた処理は、EmDashでは getEmDashCollection() になります。上のコードでは、posts コレクションから公開日の新しい順に10件を取得し、タイトルと抜粋を並べています。取得に失敗したときは error に内容が入るため、エラーの応答を返します。記事のURLには post.id(通常はスラッグ)を使い、データベース上のIDは post.data.id にあります。
テーマのファイル
WordPressのテンプレート階層の代わりに、Astroのルートを使います。テンプレートは、特別な意味を持つファイル名に頼らず、自分でURLの構造を決めます。
| WordPressのファイル | 現在のブログテンプレートのファイル |
|---|---|
front-page.php または home.php |
src/pages/index.astro |
single.php |
src/pages/posts/[slug].astro |
archive.php |
src/pages/posts/index.astro |
page.php |
src/pages/pages/[slug].astro |
category.php |
src/pages/category/[slug].astro |
tag.php |
src/pages/tag/[slug].astro |
search.php |
src/pages/search.astro |
404.php |
src/pages/404.astro |
header.php と footer.php |
src/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の設定に保存されます。設定を1回取得し、ロゴがある場合は解決済みのロゴの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 に直接保存される値ではなく、別のレコードです。タームを解決してから、そのスラッグをコレクションの絞り込みに使います。
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には2つのプラグイン形式があります。
- サンドボックス型プラグインは、識別情報と信頼に関する約束事を
emdash-plugin.jsoncに書き、SandboxedPluginの型を付けたオブジェクトをsrc/plugin.tsからデフォルトエクスポートします。隔離された実行環境で動かすことができ、管理画面のUIにはBlock Kitを使えます。 - ネイティブ型プラグインは、ビルド時に使う記述子を返すファクトリーと、
definePlugin()で作った実行時のcreatePlugin()関数をエクスポートします。Reactの管理画面コンポーネント、公開サイト用のAstroコンポーネント、ページの断片を使う場合は、この形式を使います。
まずプラグイン形式の選び方を読みます。フックの名前と PluginContext のAPIは共通ですが、パッケージとハンドラーの形は互いに入れ替えられません。
やさしい解説
WordPressのプラグインはサイト全体にアクセスできますが、EmDashのプラグインには2つの形式があります。サンドボックス型プラグインは、サイト本体から切り離された環境で動き、許可された操作だけができます。ネイティブ型プラグインは、WordPressのプラグインに近く、サイトと同じアクセス権を持ちます。どちらを選ぶかで作り方が変わるため、作り始める前に「プラグイン形式の選び方」を確認します。
WordPressのコンテンツのインポート
管理画面のサイドバーで「Import WordPress」を開くか、/_emdash/admin/import/wordpress に直接アクセスします。EmDashは、2つのインポート方法に対応しています。
- Tools → Export から書き出したWordPress eXtended RSS(WXR)ファイルをアップロードします。
- WordPressのサイトにEmDash Exporterプラグインをインストールし、WordPressのアプリケーションパスワードで接続します。この方法では、通常の公開REST APIが提供しないコンテンツも含められます。
エクスポーターを入れずにWordPressのURLを入力すると、サイトを検出し、公開されている投稿、固定ページ、メディアの数を数えられます。このRESTでの確認では、コンテンツはインポートされません。
インポーターは、WordPressの publish をEmDashの published に対応付けます。下書き、承認待ち、非公開、予約済み、ゴミ箱、不明な状態は、下書きになります。DNSを切り替えたりWordPressを停止したりする前に、インポートした権限と公開状態を確認します。
完全な手順と再試行の動作については、WordPressからの移行に従います。
編集者のワークフロー
EmDashの管理画面には、コレクションの一覧、Portable Textのエディター、メディアの管理、メニューの編集、タクソノミーの管理、リビジョン、プレビューのリンクがあります。wp-admin の見た目をそのまま再現したものではありません。Gutenbergのブロックは Portable Text になり、使える画面は、サイトに設定したコレクションと機能によって変わります。
次のステップ
- コンテンツを移行する:WordPressのサイトを書き出し、インポートし、確認します。
- テーマを移植する:テンプレートのファイルと動的な機能を、Astroのテンプレートに変換します。
- プラグインを移植する:プラグインの形式を選び、フック、ストレージ、ルート、UIを対応付けます。