• TOP
  • PHP
  • 別のWordPressサイトからREST APIを使って投稿を取得する

別のWordPressサイトからREST APIを使って投稿を取得する

親サイトの投稿を子サイトから取得して表示したい時に、訳あってマルチサイトなどに出来ない場合にREST APIを使って対応するケースがあったのでまとめます。

JSでも表示出来るのですが、テンプレートとJSが分かれるとややこしくなるので、PHP側で書くパターンで作成しております。

取得用の関数を指定

第一引数にクエリパラメータを渡すことで幅広く対応します。

function get_rest_posts_data($args = array(), $endpoint = 'posts')
{
  // WordPressのREST APIエンドポイントのURL
  $api_url = 'https://example.com/wp-json/wp/v2/' . $endpoint . '/';

  // パラメーターをURLに追加
  $api_url = add_query_arg($args, $api_url);

  // HTTPリクエストを送信してレスポンスを取得
  $response = wp_remote_get($api_url);

  // HTTPステータスコードの取得
  $httpCode = wp_remote_retrieve_response_code($response);
  // HTTPステータスコードのチェック
  if ($httpCode < 200 || $httpCode >= 300) {
    // エラーレスポンスがJSON形式の場合
    $errorResponse = wp_remote_retrieve_body($response);
    $errorResponse = json_decode($errorResponse);
    if ($errorResponse && isset($errorResponse->message)) {
      echo "エラーメッセージ: {$errorResponse->message}\n";
    }
    // その他のエラー処理を行うこともできます
    return false;
  }
  // エラーチェック
  if (is_wp_error($response)) {
    // エラーが発生した場合の処理
    $error_message = $response->get_error_message();
    echo "API取得エラー: $error_message\n";
    return false;
  }

  // 取得したデータをデコードして返す
  return json_decode(wp_remote_retrieve_body($response), true);
}

受け取った投稿データをループさせて表示

WP_queryなどで使用するパラメータとは異なるので注意が必要です。

// 使用例
$args = array(
  'per_page' => 3,
  'page' => 2,
  'orderby' => 'date',
  'order' => 'desc',
  // 'search' => 'キーワード',
  // '_fields' => 'id,title,content,date,link,excerpt,categories,tags,author,featured_media,meta',
  // '_embed' => true,
);

$posts = get_rest_posts_data($args);

if ($posts) {
  // 取得したデータをループして投稿情報を表示
  foreach ($posts as $post) {
    echo '<h2>' . $post['title']['rendered'] . '</h2>';
    // echo '<p>' . $post['content']['rendered'] . '</p>';
  }
} else {
  // エラーが発生した場合の処理
  echo 'データの取得に失敗しました。';
}
ブログ一覧へ

ご依頼・お問い合わせはこちらからcontact

WordPressサイト・テーマカスタマイズ、既存サイトの改修・ページの追加、ランディングページ制作、ECサイト(WordPress・Shopfy・その他カートASP)等の制作を承っております。

まだどんなホームページを作るか決まってない状態でのご相談でも大丈夫です、一緒に考えて行きましょう!

お問い合わせフォームへ