background-image

WordPressをヘッドレスCMS化して爆速サイトを作る方法【Astroでの構築例】

WordPressをヘッドレス化して爆速サイトを作る方法

CONTENTS

なぜ今、WordPressをヘッドレスCMS化するのか?

Web制作者の皆さん、こんにちは。

「クライアントのWordPressサイト、表示速度がなかなか改善しない…」「最新のJavaScriptフレームワークを使いたいけど、WordPressだと制約が多い…」

そんな悩み、ありませんか?

多くのWebサイトで利用されているWordPressは、その手軽さと柔軟性から非常に便利なツールです。
しかし、テーマやプラグインを多用するうちにサイトが重くなり、Lighthouseスコアが伸び悩むといった課題に直面することも少なくありません。

ヘッドレスCMSという新しいアプローチ

そこで今、Web制作の最前線で注目されているのが、「ヘッドレスCMS」という新しいアプローチです。

ヘッドレスCMSとは、Webサイトの「頭(Head)」、つまり見た目の部分と、「体(Body)」であるコンテンツ管理部分を分離する仕組みです。
従来のWordPressのように、管理画面と表示部分が一体になっている「モノリシック」な構成とは根本的に異なります。

このヘッドレスCMSの考え方をWordPressに適用し、コンテンツ管理の部分だけを再利用する手法が、今回解説する「WordPressのヘッドレス化」です。

この記事で得られること

この記事では、WordPressをヘッドレスCMSとして活用し、Astroというモダンなフレームワークを組み合わせることで、爆速でセキュリティの高いWebサイトを構築する方法を、具体的な手順を交えてご紹介します。

この記事を読めば、あなたはWordPressの新しい可能性を知り、クライアントに最新の技術を用いたWebサイトを提案できるようになるでしょう。

WordPressをヘッドレスCMS化するメリット・デメリット

WordPressのヘッドレス化がWeb制作の未来を担うアプローチであることはお伝えしました。
では、具体的にどのようなメリットとデメリットがあるのでしょうか?それぞれ詳しく見ていきましょう。

メリット1:圧倒的な表示速度とSEO向上

ヘッドレスCMSの最大のメリットは、信じられないほどの表示速度です。
WordPressの重さの原因は、動的なPHP処理やデータベースへの複雑なクエリにあります。
一方、Astroのような静的サイトジェネレーターは、あらかじめHTMLファイルを生成しておくため、ユーザーはサーバーから直接、軽量な静的ファイルを受け取ります。

メリット2:セキュリティの劇的な向上

WordPressのセキュリティリスクは、主にPHPの脆弱性やプラグイン、テーマの不備から生じます。
ヘッドレス化すると、公開されるのは静的なHTMLファイルのみとなり、WordPressの管理画面は外部に公開されません
これにより、悪意のある攻撃者がWordPressの脆弱性を突く機会を大幅に減らすことができます。

メリット3:開発の自由度が広がる

従来のWordPressでは、テンプレート言語やPHPの制約がありました。
ヘッドレス化によって、フロントエンド(見た目)は完全に分離されるため、React, Vue, Svelteといった最新のJavaScriptフレームワークや、マークアップに特化したAstroなど、好きな技術を選んで開発できます。
これにより、より複雑なUIや機能を柔軟に実装することが可能になります。

デメリット1:運用の複雑さが増す

ヘッドレス化では、WordPressの管理画面とフロントエンドの2つのシステムを管理する必要があります。
また、コンテンツのプレビュー環境の構築など、初期設定の手間が増えることも事実です。

デメリット2:プラグイン機能の制約

WordPressプラグインの中には、予約フォームやEC機能など、フロントエンドと密接に連携するものが多くあります。
ヘッドレス化した場合、これらの機能がそのまま使えない場合があります。

技術解説:WordPress × Astroの組み合わせが最強な理由

前述の通り、WordPressをヘッドレスCMS化することで多くのメリットが得られます。
では、数あるフロントエンド技術の中でも、なぜWordPressとAstroの組み合わせがWeb制作者にとって最強の選択肢となり得るのでしょうか?

なぜ「WordPress」をヘッドレスCMSとして使うのか?

ヘッドレスCMSは他にもありますが、あえてWordPressを使うのには理由があります。

慣れ親しんだ管理画面

クライアントやコンテンツ担当者は、WordPressの管理画面に慣れていることがほとんどです。
新しいCMSの操作方法を教える必要がなく、スムーズにプロジェクトを進められます。

豊富なプラグイン

SEO、フォーム作成、多言語対応など、WordPressには豊富なプラグインがあります。
これらをAPI経由で利用することで、開発コストを抑えながら高度な機能を実装できます。

クライアントへの引き渡しやすさ

運用フェーズに入った後も、クライアントが直感的にコンテンツを更新できるため、引き渡しが非常にスムーズです。

なぜ「Astro」を選ぶのか?

WordPressのコンテンツをフロントに表示する技術は多数存在しますが、特にAstroはヘッドレスCMSとの相性が抜群です。

静的サイト生成に特化

Astroは静的サイトを生成することに特化しており、ページの表示速度を極限まで高めます。
これにより、SEOパフォーマンスも最大化されます。

JavaScriptの読み込みが最小限

Astroの最大の特徴は「Islands Architecture」です。
インタラクティブな部分(スライダーやフォームなど)にのみJavaScriptを読み込み、それ以外の部分は軽量なHTMLとして配信します。
これにより、ページの描画速度が圧倒的に速くなります。

コンポーネント指向

ReactやVueなどのコンポーネントをそのまま利用できるため、モダンな開発スタイルで効率的にコーディングできます。

具体的な構築手順

ここからは、実際にWordPressとAstroを連携させるための具体的な手順を解説します。
今回は、コンテンツ取得方法としてWordPress標準のREST APIと、より柔軟なデータ取得が可能なGraphQLの両方のサンプルコードを紹介します。

Step 1: 開発環境の準備

まず、PCにAstroを動かすための環境を整えます。
Node.jsがインストールされていれば、以下のコマンドでAstroのプロジェクトを簡単に作成できます。

npm create astro@latest

このコマンドを実行すると、プロジェクト名や使用するフレームワーク(ReactやVueなど)、TypeScriptの有無などを尋ねられます。
今回はシンプルなブログサイトを想定し、テンプレートを選択して進めましょう。

Step 2: WordPress側の設定

REST APIの場合

WordPressは標準でREST APIを備えているため、特別なプラグインは不要です。
https://[あなたのサイトURL]/wp-json/wp/v2/postsにアクセスして、JSONデータが取得できるか確認してください。

GraphQLの場合

WPGraphQLプラグインをインストールして有効化します。
これにより、GraphQLエンドポイントが利用可能になり、必要なデータだけをピンポイントで取得できるようになります。

Step 3: AstroからWordPressのデータを取得

では実際にAstroでWordPressのデータを取得してみます。
Astroのsrc/pagesディレクトリ内に、ブログ一覧ページを作成します。

【REST API】ブログ一覧ページ(例:src/pages/blog/index.astro)

以下のコードでは、fetch関数を使ってWordPressの投稿データを取得し、一覧として表示します。

---
interface Post {
  id: number;
  slug: string;
  title: {
    rendered: string;
  };
  excerpt: {
    rendered: string;
  };
}

const response = await fetch('https://[あなたのサイトURL]/wp-json/wp/v2/posts?_fields=id,slug,title,excerpt');
const posts:Post[] = await response.json();
---

<div class="posts">
  {posts.map(post => (
    <a href={`/blog/${post.slug}`}>
      <h2>{post.title.rendered}</h2>
      <p set:html={post.excerpt.rendered} />
    </a>
  ))}
</div>
interface Post取得するJSONデータの構造に合わせて型を定義しています。
これにより、変数postsがどのようなデータを持つかを明確にし、開発中のエラーを防ぎます。
fetch(…)WordPressのREST APIエンドポイントにリクエストを送信しています。
?_fields=...とすることで、必要なデータ(id, slug, title, excerpt)だけを取得し、通信量を抑えています。
await response.json()取得したレスポンスをJSON形式に変換し、定義したPost[]型として扱っています。
{posts.map(…)取得したposts配列をループ処理し、各投稿のHTMLを生成しています
set:html={…}WordPressのAPIから取得した抜粋文にはHTMLタグが含まれているため、set:htmlディレクティブを使って、文字列ではなくHTMLとしてレンダリングするように指定しています。

この状態で

npm run dev

このコードを実行してローカルサーバーを立ち上げます。
すると、このようにWorPress側の投稿が表示されます。(下記の画像はWordPressにデフォルトで投稿されている記事)

出力結果

【GraphQL】ブログ一覧ページ(例:src/pages/blog/index.astro)

以下のコードでは、GraphQLクエリを使って投稿のID、タイトル、スラッグ、抜粋文だけを取得します。
余分なデータを含まないため、より高速に処理できます。

GraphQLでデータを取得する場合、「GraphQL IDE」を使用すると非常に便利です。
WordPressサイドバーの「GraphQL」⇒「GraphQL IDE」から開きます。

「Query Composer」を使用することで、取得するクエリの一覧とその結果のプレビューを確認することができます。

---
const POSTS_QUERY = `
  query MyQuery {
    posts {
      nodes {
        id
        slug
        title
        excerpt
      }
    }
  }
`;

const response = await fetch('https://[あなたのサイトURL]/graphql', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ query: POSTS_QUERY }),
});

const { data } = await response.json();
const posts = data.posts.nodes;
---

<div class="posts">
  {posts.map(post => (
    <a href={`/blog/${post.slug}`}>
      <h2>{post.title}</h2>
      <p>{post.excerpt}</p>
    </a>
  ))}
</div>
const POSTS_QUERY = …GraphQLクエリを定義しています。このクエリでは、postsnodesからid, slug, title, excerptのみをリクエストしています。
fetch(…)GraphQLでは、リクエストメソッドにPOSTを指定し、bodyにJSON形式でクエリを渡します。
{ data }: { data: PostsData }レスポンスのJSONデータからdataプロパティを抽出し、型定義を適用しています。
出力結果

【REST API】投稿詳細ページ(例:src/pages/blog/[slug].astro)

Astroの動的ルーティング機能を使って、各投稿のURLを生成します。

---
interface Post {
  slug: string;
  title: { rendered: string; };
  content: { rendered: string; };
}

export async function getStaticPaths() {
  const response = await fetch('https://[あなたのサイトURL]/wp-json/wp/v2/posts?_fields=slug,title,content');
  const posts: Post[] = await response.json();

  return posts.map(post => ({
    params: { slug: post.slug },
    props: { post },
  }));
}

const { post } = Astro.props;
---

<div>
  <h1>{post.title.rendered}</h1>
  <div set:html={post.content.rendered} />
</div>
export async function getStaticPaths()Astroの静的サイト生成時に、どのURLパスを生成するかを定義する関数です。
return posts.map(…)取得した投稿データから、スラッグをparamsとして設定し、その投稿データをpropsとしてページコンポーネントに渡しています。これにより、blog/post-a, blog/post-bといった詳細ページが自動的に生成されます。
const { post } = Astro.props;getStaticPathsから渡されたprops(この場合post)をページ内で使用するために取得しています。
{posts.map(…)取得したposts配列をループ処理し、各投稿のHTMLを生成しています

先ほど作成したREST APIの一覧ページのリンクをクリックすると下記のように記事の詳細ページにアクセスできるようになります。
(見た目がほとんど一緒なので分かりづらいですが…)

【GraphQL】投稿詳細ページ(例:src/pages/blog/[slug].astro)

---
// import type { GetStaticPaths } from 'astro';

interface PostNode {
  slug: string;
  title: string;
  content: string;
}

interface PostsData {
  posts: {
    nodes: PostNode[];
  };
}

export async function getStaticPaths() {
  const response = await fetch('https://[あなたのサイトURL]/graphql', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      query: `
        query MyQuery {
          posts {
            nodes {
              slug
              title
              content
            }
          }
        }
      `,
    }),
  });
  const { data }: { data: PostsData } = await response.json();
  const posts = data.posts.nodes;

  return posts.map((post) => ({
    params: { slug: post.slug },
    props: { post },
  }));
};

const { post } = Astro.props;
---

<div>
  <h1>{post.title}</h1>
  <div set:html={post.content} />
</div>

GraphQLのクエリを使用している点以外は、REST APIのgetStaticPaths関数と同様の働きをします。
必要なデータ(slug, title, content)だけをリクエストし、静的ページを生成するための情報を取得しています。

出力結果

WordPress × Astroの事例と未来

ここまで、WordPressをヘッドレス化し、Astroと組み合わせる方法について解説してきました。
このアプローチは、単なる技術トレンドではなく、すでに多くのプロジェクトで採用され、その効果が実証されています。

実例から見るパフォーマンスの向上

実際にWordPressとAstroを組み合わせたサイトは、従来のWordPressサイトと比べてどれほどのパフォーマンス差があるのでしょうか?

Lighthouseによるパフォーマンス計測では、テーマやプラグインを多用し、最適化が不十分な従来のWordPressサイトのスコアが平均40〜60点であるのに対し、Astroで構築したヘッドレスサイトは90点以上を安定してマークすることが可能です。
これは、ユーザー体験の向上はもちろん、Googleのランキングアルゴリズムにおける評価にも直結します。

例えば、企業サイトやオウンドメディア、ポートフォリオサイトなど、表示速度が特に重要となるプロジェクトにこの手法は最適です。

Web制作の未来を切り拓く

ヘッドレスCMSは、Web制作の常識を塗り替えつつあります。

クライアントは、コンテンツ管理のしやすさ、Web制作者は、開発の自由度とパフォーマンスを両立できる。
これは、双方にとって大きなメリットをもたらします。
WordPressの管理画面という慣れ親しんだ環境を活かしつつ、最先端の技術で圧倒的なユーザー体験を提供できるのです。

今後も、Webサイトのパフォーマンスやセキュリティに対する要求は高まり続けるでしょう。
WordPressのヘッドレス化は、そうした未来を見据えた、Web制作者の皆さんにとって強力な武器となります。

まとめ:WordPressヘッドレス化でWeb制作の常識をアップデートしよう

この記事では、Web制作者の皆さんに向けて、WordPressをヘッドレスCMSとして活用し、Astroと組み合わせる手法を解説しました。

WordPressをヘッドレス化する理由

従来のWordPressが抱える表示速度やセキュリティの課題を解決するためです。

最大のメリット

圧倒的な表示速度、セキュリティの向上、そしてReactやVueといった最新技術を使える開発の自由度にあります。

WordPress × Astroが最強な理由

クライアントが慣れ親しんだWordPressのコンテンツ管理のしやすさと、Astroが提供する最高のパフォーマンス(Islands Architecture)を両立できるからです。

実践的なステップ

実際に開発環境を整え、WordPressのREST APIとGraphQLをAstroで取得する具体的な手順を紹介しました。

WordPressのヘッドレス化は、単なるトレンドではなく、今後のWeb制作においてますます重要となるアプローチです。
コンテンツ管理の利便性を保ちつつ、ユーザーに最高のパフォーマンスを提供できるこの手法は、あなたのポートフォリオを強化し、クライアントからの信頼を一層高める強力な武器となるでしょう。

©UCHIWA Creative Studio.all rights reserved.