コンテンツにスキップ

WordPress開発者向けEmDash

EmDashは、WordPressの馴染み深い概念—投稿、固定ページ、タクソノミー、メニュー、ウィジェット、メディアライブラリ—をモダンなAstroスタックに持ち込みます。あなたのコンテンツ管理に関する知識はそのまま活かせます。

移行前にプラットフォームを比較する場合は、EmDash vs WordPress と WordPress to Astro with EmDash をお読みください。

WordPressから知っている概念は、EmDashにおいても第一級の機能です:

  • コレクションはカスタム投稿タイプのように機能します—コンテンツ構造を定義し、テンプレート内でクエリします
  • タクソノミーも同じように機能します—階層型(カテゴリーのような)とフラット型(タグのような)
  • メニューはドラッグ&ドロップでの順序変更とネストされた項目に対応
  • ウィジェットエリアはサイドバーや動的コンテンツ領域用です
  • メディアライブラリはアップロード、整理、画像管理機能付き
  • 管理UIはコンテンツ編集者がコードに触れずに使用できます

実装は変わりますが、メンタルモデルは同じままです:

PHPの代わりにTypeScript

テンプレートはAstroコンポーネントです。構文はよりクリーンですが、概念は同じです:HTMLを出力するサーバーコードです。

WP_Queryの代わりにコンテンツAPI

getEmDashCollection()のようなクエリ関数がWP_Queryを置き換えます。SQLは不要で、関数呼び出しだけです。

ファイルベースのルーティング

src/pages/内のファイルがURLになります。リライトルールやテンプレート階層を暗記する必要はありません。

テンプレートパーツの代わりにコンポーネント

コンポーネントをインポートして使用します。get_template_part()と同じ考え方ですが、より整理されています。

WordPressEmDash備考
カスタム投稿タイプコレクション管理UIまたはAPIで定義
WP_QuerygetEmDashCollection()フィルター、制限、タクソノミークエリ
get_post()getEmDashEntry()エントリーまたはnullを返す
カテゴリー/タグタクソノミー階層型サポートを維持
register_nav_menus()getMenu()第一級のメニューサポート
register_sidebar()getWidgetArea()第一級のウィジェットエリアサポート
bloginfo('name')getSiteSetting("title")サイト設定API
the_content()<PortableText />構造化コンテンツレンダリング
ショートコードPortable Textブロックカスタムコンポーネント
add_action/filter()プラグインフックcontent:beforeSaveなど
wp_optionsctx.kvキーバリューストレージ
テーマディレクトリsrc/ディレクトリコンポーネント、レイアウト、ページ
functions.phpastro.config.mjs + EmDash設定ビルドおよびランタイム設定

WordPressのクエリはWP_Queryまたはヘルパー関数を使用します。EmDashは型付きクエリ関数を使用します。

archive.php
<?php
$posts = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 10,
'post_status' => 'publish',
'category_name' => 'news',
]);
while ($posts->have_posts()) :
$posts->the_post();
?>
<h2><?php the_title(); ?></h2>
<?php the_excerpt(); ?>
<?php endwhile; ?>
php title="single.php"
<?php
$post = get_post($id);
?>
<article>
<h1><?php echo $post->post_title; ?></h1>
<?php echo apply_filters('the_content', $post->post_content); ?>
</article>

WordPressはテンプレート階層を使用してページをレンダリングするファイルを選択します。Astroは明示的なファイルベースのルーティングを使用します。

WordPressテンプレートEmDash相当
index.phpsrc/pages/index.astro
single.phpsrc/pages/posts/[slug].astro
single-{type}.phpsrc/pages/{type}/[slug].astro
page.phpsrc/pages/pages/[slug].astro
archive.phpsrc/pages/posts/index.astro
archive-{type}.phpsrc/pages/{type}/index.astro
category.phpsrc/pages/categories/[slug].astro
tag.phpsrc/pages/tags/[slug].astro
search.phpsrc/pages/search.astro
404.phpsrc/pages/404.astro
header.php / footer.phpsrc/layouts/Base.astro
sidebar.phpsrc/components/Sidebar.astro

テンプレートパーツ → コンポーネント

Section titled “テンプレートパーツ → コンポーネント”

WordPressのテンプレートパーツはAstroコンポーネントになります:

php title="functions.php / template"
// テンプレート内:
get_template_part('template-parts/content', 'post');
// template-parts/content-post.php:
<article class="post">
<h2><?php the_title(); ?></h2>
<?php the_excerpt(); ?>
</article>

EmDashは自動URL解決を備えたファーストクラスのメニューサポートを提供します:

php title="header.php"
<?php
wp_nav_menu([
'theme_location' => 'primary',
'container' => 'nav',
]);
?>

メニューは管理UI、シードファイル、またはWordPressインポートを通じて作成されます。

ウィジェットエリアはWordPressのサイドバーのように機能します:

php title="sidebar.php"
<?php if (is_active_sidebar('sidebar-1')) : ?>
<aside>
<?php dynamic_sidebar('sidebar-1'); ?>
</aside>
<?php endif; ?>

サイトオプションとカスタマイザー設定は getSiteSetting() にマッピングされます:

WordPressEmDash
bloginfo('name')getSiteSetting("title")
bloginfo('description')getSiteSetting("tagline")
get_custom_logo()getSiteSetting("logo")
get_option('date_format')getSiteSetting("dateFormat")
home_url()Astro.site
import { getSiteSetting } from "emdash";
const title = await getSiteSetting("title");
const logo = await getSiteSetting("logo"); // { mediaId, alt, url } を返します

タクソノミーは概念的には同じように機能します—階層型(カテゴリーなど)またはフラット型(タグなど):

import { getTaxonomyTerms, getEntryTerms, getTerm } from "emdash";
// すべてのカテゴリーを取得
const categories = await getTaxonomyTerms("categories");
// 特定のタームを取得
const news = await getTerm("categories", "news");
// 投稿のタームを取得
const postCategories = await getEntryTerms("posts", postId, "categories");

WordPressフック(add_action, add_filter)はEmDashプラグインフックになります:

WordPress HookEmDash Hook目的
save_postcontent:beforeSave保存前のコンテンツを変更
the_contentPortableText componentsレンダリングされたコンテンツを変換
pre_get_postsQuery optionsクエリをフィルタリング
wp_headLayout <head>ヘッドコンテンツを追加
wp_footerLayout before </body>フッターコンテンツを追加

Type Safety

TypeScriptを全面的に採用。コレクション、クエリ、コンポーネントは完全に型付けされています。フィールド名や戻り値の型を推測する必要はありません。

Performance

PHPのオーバーヘッドなし。デフォルトで静的生成。必要に応じてサーバーレンダリング。エッジデプロイメントに対応。

Modern DX

ホットモジュールリプレースメント。コンポーネントベースのアーキテクチャ。モダンなツーリング(Vite、TypeScript、ESLint)。

Git-based Deployments

コードとテンプレートはgitで管理。コンテンツはデータベースに保存。FTP、ファイルパーミッション、ハッキングされたサイトはありません。

EmDashはHMAC署名付きトークンを使用した安全なプレビューURLを生成します。コンテンツ編集者は本番環境にログインせずに下書きをプレビューできます—認証情報ではなくリンクを共有します。

WordPressのプラグイン競合は解消されます。EmDashプラグインは明示的なAPIを持つ分離されたコンテキストで実行されます。グローバル状態の汚染はありません。

コンテンツ編集者エクスペリエンス

Section titled “コンテンツ編集者エクスペリエンス”

コンテンツ編集者はwp-adminに似たEmDash管理パネルを使用します:

  • ダッシュボード:最近のアクティビティを表示
  • コレクション一覧:検索、フィルタリング、一括操作が可能
  • リッチエディター:コンテンツ編集用(GutenbergではなくPortable Text)
  • メディアライブラリ:ドラッグ&ドロップアップロード
  • メニュービルダー:ドラッグ&ドロップによる順序変更
  • ウィジェットエリアエディター:サイドバーコンテンツ用

編集エクスペリエンスは見慣れたものですが、その基盤となる技術はモダンです。

EmDashはWordPressコンテンツを直接インポートします:

  1. WordPressからエクスポート(ツール → エクスポート)
  2. EmDash管理パネルで .xml ファイルをアップロード
  3. 投稿タイプをコレクションにマッピング
  4. コンテンツとメディアをインポート

投稿、ページ、タクソノミー、メニュー、メディアが移行されます。GutenbergブロックはPortable Textに変換されます。カスタムフィールドは分析されマッピングされます。

完全な手順についてはWordPress移行ガイドを参照してください。