別の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 'データの取得に失敗しました。';
}