最近、別ドメインの 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・最小構成のイメージ)
大きな流れは次のとおりです。
- ブラウザや
curlで JSON の形を確認する(キー名やネストを見る) - PHP で
wp_remote_get()を使って同じ URL に GET する is_wp_error()で通信エラーを見るwp_remote_retrieve_body()でレスポンス本文を取り出すjson_decode( $body, true )で配列にする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 を足していけると思います。