WordPress REST APIのざっくり理解と、別サイトの投稿をPHPで取って表示する

  • WordPress
  • PHP
  • REST API

最近、別ドメインの WordPress で書いた記事を、ほかのサイト側で一覧だけ出したい場面があり、WordPress 標準の REST API を触り直しました。用語が多くて読むだけだと飲み込みづらい部分もあるので、自分なりの実務向けメモとしてまとめます。

REST APIって何?

ざっくり言うと、決められた URL にアクセスすると、サーバーがデータを返してくる仕組みのひとつです。WordPress の場合は、その返ってくるデータが JSON というテキスト形式になることが多く、プログラムから「取得して表示する」がしやすくなります。

JSON は、いわば キーと値の組み合わせを並べたデータの書き方だと思っておけば十分です({ "title": "..." } のような形)。

ブラウザで普通にページを開くときは HTML が返りますが、REST API のエンドポイントは 機械にも読みやすい JSON が返る、というイメージです。

WordPressでできること(例)

WordPress には公式の REST API があり、/wp-json/wp/v2/ 以下に「投稿」「固定ページ」「メディア」などのエンドポイントがあります。投稿一覧なら例えば次のような URL です。

https://あなたのサイト/wp-json/wp/v2/posts

ここで大事なのは 「別の WordPress サイトの URL を指定すれば、そのサイトの公開データを取れる」 ことです。自分の管理画面のサーバーから、別ドメインの WordPress にリクエストを飛ばして JSON をもらい、見せたいページで整形して出力、という流れがつくれます。

例えばこんなことができる

  • 採用サイトに、コーポレートサイトのブログの最新記事だけを置く(本文は各記事へリンク)
  • 複数メディアを WordPress で回しているなら、メインサイト以外に「今週のピックアップ」枠を設ける
  • デザインやサイト構成は分けたまま、記事データだけ共通化したいときの連携の足がかりにする

今回のサンプルはサムネイルなしで、タイトル・公開日・記事へのリンクだけを出す最小例にしています。

最新3件を取るURLの例

per_page で件数を指定できます。

https://example.com/wp-json/wp/v2/posts?per_page=3

特定の ID だけ欲しい場合は、include で ID を渡す方法もあります(必要になったらドキュメントや実際の JSON を見ながら足すイメージでよさそうです)。

実装手順(PHP・最小構成のイメージ)

大きな流れは次のとおりです。

  1. ブラウザや curl で JSON の形を確認する(キー名やネストを見る)
  2. PHP で wp_remote_get() を使って同じ URL に GET する
  3. is_wp_error() で通信エラーを見る
  4. wp_remote_retrieve_body() でレスポンス本文を取り出す
  5. json_decode( $body, true ) で配列にする
  6. foreach で1件ずつ、タイトル・リンク・日付を取り出して esc_html / esc_url しながら出力する

WordPress の投稿オブジェクトでは、タイトルは title.rendered、リンクは link、日付は date に入っていることが多いです。

<?php
$url      = 'https://example.com/wp-json/wp/v2/posts?per_page=3';
$response = wp_remote_get( $url );

if ( is_wp_error( $response ) ) {
	// ログや管理者向けメッセージなど、サイトに合わせて扱う
	return;
}

$body = wp_remote_retrieve_body( $response );
$posts = json_decode( $body, true );

if ( ! is_array( $posts ) ) {
	return;
}

foreach ( $posts as $post ) {
	$title_raw = $post['title']['rendered'] ?? '';
	$link      = $post['link'] ?? '';
	$date_raw  = $post['date'] ?? '';

	$title     = esc_html( wp_strip_all_tags( $title_raw ) );
	$link_esc  = esc_url( $link );
	$timestamp = strtotime( $date_raw );
	$date_disp = $timestamp
		? esc_html( date_i18n( 'Y.m.d', $timestamp ) )
		: '';

	echo '<p><a href="' . $link_esc . '">' . $title . '</a> <span>' . $date_disp . '</span></p>';
}

日付は **.(ドット)区切りの Y.m.d** でそろえています。サイトのタイムゾーン設定に合わせたい場合は date_i18n` が扱いやすいです。

注意事項

REST API は便利ですが、「外部のサーバーへのリクエスト」になるので、ハマりどころもあります。

  • 毎回リアルタイムで取りに行くと重くなりがちです。アクセスのたびに相手サイトに負荷もかかります。トラフィックが増えるサイトでは キャッシュ(Transient、オブジェクトキャッシュ、CDN など)を検討した方がよい、というのが個人的な感触です。
  • Basic 認証などで URL が守られている場合、そのままでは 401 になることがあります。追加のヘッダーや専用プラグイン・アプリパスワードなど、要件に合った対応が必要になります。
  • ログインが必要な下書きや非公開記事は、原則として取れません。出せるのは 公開されているデータ、と把握しておくと安全です。
  • フィールド名や返り方はテーマ・プラグイン・WordPress のバージョンで差が出ることがあるので、実装前に curl や REST API のレスポンスを一度眺めるのがおすすめです。

サイトを物理的にひとつにまとめなくても、**REST API を通すと「分けたままデータだけつなぐ」**ことができます。今回のように一覧だけ外部表示する用途では、まず JSON の形を確認 → 最小の GET → エスケープして出す の3点を押さえておくと、あとは要件に合わせてキャッシュや UI を足していけると思います。