別のWordPressサイトの投稿を取得して表示させる方法

WordPressは、ウェブサイトの制作やブログの運営に広く利用されている、パワフルで柔軟なプラットフォームです。しかし、時には他のWordPressサイトから投稿データを取得して、自分のサイトに表示させたい場合があります。この記事では、そのようなシナリオに対処する方法を詳しく説明します。

スポンサーリンク

REST APIを使用する

REST APIは、異なるWordPressサイト間でデータを共有するための便利な方法です。REST APIを使用して他のWordPressサイトから投稿データを取得し、表示させる手順は以下の通りです。

REST APIを有効にする

まず、対象のWordPressサイトでREST APIを有効にする必要があります。WordPressダッシュボードにログインし、設定 > パーマリンクから「投稿名」を選択し、REST APIを有効にします。

REST APIエンドポイントのURLを取得

他のWordPressサイトからデータを取得するために、REST APIエンドポイントのURLを特定する必要があります。通常、https://example.com/wp-json/wp/v2/postsのような形式です。ここで、example.comは対象のWordPressサイトのURLです。

データを取得するためのコードを書く

WordPressテーマのファイルやプラグインで、PHPやJavaScriptを使用してREST APIからデータを取得するコードを書きます。下記は、PHPを使用した例です。

$api_url = 'https://example.com/wp-json/wp/v2/posts'; // 対象のWordPressサイトのREST APIエンドポイント
$response = wp_remote_get($api_url); // REST APIからデータを取得

if (is_wp_error($response)) {
    // エラーハンドリング
} else {
    $data = json_decode(wp_remote_retrieve_body($response)); // JSONデータをデコード

    // 投稿を表示
    foreach ($data as $post) {
        echo '<h2>' . esc_html($post->title->rendered) . '</h2>';
        echo '<div>' . wpautop(esc_html($post->content->rendered)) . '</div>';
    }
}

テンプレートに表示を追加

最後に、取得したデータを表示したい場所にコードを追加します。通常はテンプレートファイル内に追加されます。

これで、他のWordPressサイトから投稿データを取得して表示することができます。ただし、REST APIを有効にする必要があるため、対象のWordPressサイトの設定にアクセスできる必要があります。

よくある質問(FAQ)

Q. 外部WordPressサイトの記事をREST APIで取得するにはどうすればよいですか?
A. wp_remote_get()でREST APIを呼びます:$response = wp_remote_get("https://external-site.com/wp-json/wp/v2/posts?per_page=5"); $posts = json_decode(wp_remote_retrieve_body($response), true);。取得したJSONをforeachでループして表示します。
Q. 外部サイトのコンテンツ取得に失敗した場合の対処方法は?
A. wp_is_wp_error()でエラーチェックします。タイムアウトを調整するには第2引数に["timeout" => 15]を渡します。外部サイトがCORSを許可していない場合はサーバーサイドでフェッチします。トランジェントAPIでキャッシュすることで毎回APIを叩かずに済みます。
Q. 外部サイトのRSSフィードを取得して表示するにはどうすればよいですか?
A. fetch_feed()を使います:$feed = fetch_feed("https://external-site.com/feed/"); if(!is_wp_error($feed)){ $items = $feed->get_items(0, 5); foreach($items as $item){ echo "<a href=\"" . $item->get_permalink() . "\">" . $item->get_title() . "</a>"; } }