このページで分かること

  • WordPressの概念(投稿タイプ、投稿メタ、カテゴリー・タグ、WP_Query、テンプレート階層、プラグインなど)が、EmDashとAstroの何にあたるかの対応表
  • WordPressのテーマファイル(single.phparchive.php など)とブログテンプレートのファイルの対応、メニュー・ウィジェットエリア・サイト設定・タクソノミーの取得方法
  • 2つのプラグイン形式の違いと、WordPressのコンテンツをインポートする2つの方法(WXRファイル、EmDash Exporterプラグイン)
難易度
基礎
読む時間
4分
前提知識
CMSとはAstroとは
このページの目次

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.phpfooter.php Astroのレイアウト
wp_nav_menu() getMenu()
サイドバー ウィジェットエリアと <WidgetArea />
Options API サイト設定、またはプラグインの ctx.kv
WordPressのプラグイン EmDashのサンドボックス型プラグインまたはネイティブ型プラグイン

コンテンツモデル

コレクションは、EmDashの管理画面の「コンテンツタイプ」で作成・編集します。コレクションは型が明示されたフィールドを持ち、下書き、リビジョン、予約公開、検索、SEO、コメントを有効にできます。

クエリは、Astroのライブコレクションのエントリーを返します。entry.id はルートの識別子で、通常はスラッグです。entry.data.id は、データベース上のコンテンツのIDです。

次のアーカイブページでは、投稿を公開日の順に取得します。

src/pages/posts/index.astro
---
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.phpfooter.php src/layouts/Base.astro

EmDashのテンプレートで使われている、プロジェクトの構成、コンポーネントの構文、props、スロット、レイアウト、ルーティング、サーバーで描画するときのクエリの流れについては、WordPress開発者のためのAstroを読みます。

メニューとウィジェットエリアはデータベースに保存され、セットアップ後も編集できます。テンプレートは、リクエストのたびにそれらを取得します。

src/layouts/Base.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を使います。

src/components/SiteIdentity.astro
---
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つのインポート方法に対応しています。

  1. Tools → Export から書き出した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 になり、使える画面は、サイトに設定したコレクションと機能によって変わります。

次のステップ