パーマリンク設定によって個別投稿の情報をREST APIで取得する方法が違うのかも(メモ)

公開日:2024(令和6)年4月5日/最終更新日:

WordPressのREST APIを使用してサイトをカスタマイズするための情報ページ

【景品表示法に基づく表記】ページ内のコンテンツには、商品プロモーションが含まれています



完全解釈しているわけではなく、実際にやってみてそうだったのでメモとして..。

REST API経由で個別投稿の情報を取得する場合、エンドポイントは以下のような違いがありました。

【パーマリンクがID(%post_id%)の場合】

ホームURL/wp-json/wp/v2/投稿タイプ(投稿の場合はposts)/ID

【パーマリンクがその他(文字列)の場合】

ホームURL/wp-json/wp/v2/投稿タイプ(投稿の場合はposts)?slug=〇〇

そして、パーマリンクがIDの場合はwp_remote_get()を使い、その他の場合はfile_get_contents()を使わないと、情報が取得できないことが分かりました。

これが分かるまでに相当の時間を費やしたのですが、これはWordPressの仕様なのかバグなのか..よくわかりません。

ちなみに、以下が実験して一応の完成を見たコード。パーマリンクが数字かどうかでざっくり分けて、アイキャッチ画像のIDを取得して、ショートコードで返ってきた値を出力するものです。

wp_remote_get()とfile_get_contents()で抽出する場合の変数も違いがあるので注意が必要かも。

function pwcn_rest_api_post_data_callback(){
/* 投稿でスラグが投稿ID(%post_id)の場合のサンプル */
    //$home_url = '〇〇'; // サイトのURL
    //$post_type = 'posts'; // 投稿タイプ
    //$slug = '△△'; // スラッグ

/* 投稿で文字スラグの場合のサンプル */
	$home_url = '〇〇';//末尾の「/」は入れない
	$post_type = 'posts';//投稿は「posts」
	$slug = '□□';//前後の「/」は入れない

/* カスタム投稿タイプ+文字列スラグの場合のサンプル */
	//$home_url = '〇〇';//末尾の「/」は入れない
	//$post_type = '◇◇';//投稿は「posts」
	//$slug = '□□';//前後の「/」は入れない

//誤入力の対処として$slugの先頭、$home_urlの末尾にある「/」を一応除去する
    $slug = ltrim($slug, '/');
    $home_url = rtrim($home_url, '/');

if (ctype_digit($slug)) {//スラグが数字だけの場合
	$post_url = $home_url . '/wp-json/wp/v2/' . $post_type . '/' . $slug;
	$response = wp_remote_get($post_url); // wp_remote_getを使用してREST APIからデータを取得

	$body = wp_remote_retrieve_body($response); // レスポンス本文を取得
	$data = json_decode($body, true); // JSONデータをデコード

	if (isset($data['featured_media'])) {
		$image_id = $data['featured_media'];
	} else {
		$image_id =  '画像が見つかりませんでした。';
	}

} else {//スラグが数字だけでない場合
	$post_url = $home_url . '/wp-json/wp/v2/' . $post_type . '?slug=' . $slug;
	
	//jsonデータを取得
		$json_data = file_get_contents($post_url);
		$decoded_data = json_decode($json_data, true);

// アイキャッチ画像のIDを取得
	if (isset($decoded_data[0]['featured_media'])) {
		$image_id = $decoded_data[0]['featured_media'];
	}else{
		$image_id = '画像が見つかりませんでした';
	}
}
	return $image_id;
}

function view_data(){
    $image_id = pwcn_rest_api_post_data_callback();
        return $image_id;
}
add_shortcode('test-post-view','view_data');

実際にパーマリンク構造がIDのサイトとその他のサイトを持っている方は試してみると「なるほど」となるかも知れません。

このページはWordPress6.5時点での検証結果で、他のバージョンでは振る舞いが違うかも知れませんし、環境に影響があるのかも知れないということを申し添えておきます。個人的な解のある方と意見を共有できたらうれしいです。

しかし..これが仕様だとすると結構混乱しますね...。



Lolipop ServerMoshimo Ad x-serverMoshimo Ad

WordPressのREST APIを使用してサイトをカスタマイズするための情報ページ
REST API経由で情報を取得して表示するショートコードを作る方法(例)