REST API経由で情報を取得して表示するショートコードを作る方法(例)

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

,
About WP REST API | Personal WP Customization Notes (PWCN)

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



いろいろと検索していると、「REST API経由で他サイトの情報を取得して表示させるのが便利」だということは結構語られていますが、具体的にどうしたらいいの?となるものが多いと感じるので、例として、WordPressの公式プラグインページで公開されているREST APIの情報(エンドポイント)から情報を取得して、ショートコードで表示させる具体例を紹介しておきます。

本ページで掲載しているコードは、以下に了承した上で使用ください

  • コードは商用・非商用問わず自由に使っていただいて構いませんが、コード追加による不具合やトラブルが発生しても当方では一切責任を負いません
  • コードは有効化しているテーマのfunctions.php、style.cssなどへ追加することで機能します。それらのファイルへの変更を行うことに不安のある方は使用しないでください
  • コードは本ページの公開日時点で私の環境において動作したものです。WordPressバージョン他環境の違いによって動作しないことがあります
  • コードは、セキュリティ、コードの正確さなどにおいて完全なものではありません。中には紹介するコードを簡略化するために省略している部分があるものもありますので、ご自身でコードを十分に検証し、必要な部分の編集を行った上で使用するようにしてください
  • 掲載しているのは参考コードです。自身の環境に合わせるための編集はご自身で対応いただく必要があります(コメント欄等から質問いただいても基本回答は致しません)
  • 掲載しているコードの転載を禁じます(SNSで紹介いただいたり、本ページへのリンクを張っていただくことは大歓迎です)

以下が具体的なコードです。

function pwcn_rest_plugin_data_name(){
$plugin_slug = 'akismet'; // 「Akismet」プラグインのURLスラグ
$request_url = 'https://api.wordpress.org/plugins/info/1.0/' . $plugin_slug . '.json';

// タイムアウト時間を秒単位で指定
$context = stream_context_create(array(
    'http' => array(
        'timeout' => 10 
    )
));

$response = file_get_contents($request_url, false, $context);

if ($response !== false) {
    $plugin_info = json_decode($response, true); // JSON データを配列に変換
    return 'プラグイン名: ' . $plugin_info['name'];
} else {
    return '情報を取得できませんでした。';
}
}
add_shortcode('plugin-name','pwcn_rest_plugin_data_name');

コードは「Akismet Anti-spam: Spam Protection」プラグインの「名前」を「plugin-name」というショートコードを挿入した場所へ「プラグイン名:〇〇(この場合は「Akismet Anti-spam: Spam Protection」)」と表示させるものです。

以下がコードの流れです。

公式ページURLは「https://wordpress.org/plugins/akismet/」なので、スラグである「akismet」を$plugin_slug変数に格納します。

そして、WordPressプラグインページ共通のREST API URLである「https://api.wordpress.org/plugins/info/1.0/」と$plugin_slugを連結させて完全なURLにしたものを$request_urlへ格納しています。

一応いつまでたっても取得できない状況を考えて、タイムアウト時間を設け、「file_get_contents」で、REST API URL(この場合はAkismetプラグインのAPIエンドポイント)から情報を抽出して、$response変数へ格納し、レスポンスがあれば「json_decode」で配列(値が1つ1つバラバラに保存され羅列された状態)にしたものを$plugin_info変数へ格納しています。

最後にこの中の「name(名前)」の情報を取得して「プラグイン名:」という文字列と共にreturnで返すということをしています。

例えばプラグインの紹介をするようなページを作っていて、公式の最新情報を表示したい..といった場合に便利だと思います。

また、プラグインのスラグ($plugin_slug)を各投稿のカスタムフィールドなどに追加しておけば、$plugin_slugの定義を以下のように書き換えることで、そのページのカスタムフィールドにあるスラグを基に自動で情報を取得して表示させるなんてこともできます。

$plugin_slug = get_post_meta(get_the_ID(),'プラグインのスラグが入っているカスタムフィールド名',true);

また、上記のコードでは、タイムアウト時間のみを指定していますが、以下のようにすることで、タイムアウト(下記コードでは2秒に設定)したら〇回(下記コードでは3回に設定)繰り返して取得させるということもできます。

タイムアウト処理だけの時と比べて、短時間で失敗したかを判断してリトライされるので、ずっと待ってたのに結局取得できなかったというケースが減る分実用的かも知れません。

function pwcn_rest_plugin_data_name(){
$plugin_slug = 'akismet'; // 取得したいプラグインのスラッグを指定
$request_url = 'https://api.wordpress.org/plugins/info/1.0/' . $plugin_slug . '.json';

// 最大リトライ回数
$max_retries = 3; 
$retry = 0;

do {
	$context = stream_context_create(array(
		'http' => array(
			'timeout' => 2 // タイムアウト時間を秒単位で指定
		)
	));

	$response = @file_get_contents($request_url, false, $context);

	if ($response !== false) {
		$plugin_info = json_decode($response, true); // JSON データを配列に変換
			return 'プラグイン名: ' . $plugin_info['name'];

			 break; // レスポンスが成功した場合はループを終了
	} else {
		$retry++;
	}
} while ($retry < $max_retries);

if ($response === false) {
    return '情報を取得できませんでした。';
}
}
add_shortcode('plugin-name','pwcn_rest_plugin_data_name');

ここまでWordPress公式のプラグインページからの情報取得をしてきましたが、最後に、別のサイトの投稿から10件取得してタイトルを表示させるというコードを紹介しておきます。

以下のコードを追加後、「サイトのURL」の部分を変えて保存し、表示させたい場所へ「post-title」ショートコードを追加すると、目的のサイトのタイトルが10件表示されます。

function pwcn_api_posts_title(){
    // 取得したいWordPressサイトのURLを指定します
    $api_url = 'サイトのURL/wp-json/wp/v2/posts?per_page=10'; 

    $response = wp_remote_get( $api_url );

    if ( is_wp_error( $response ) ) {
        // エラーハンドリング
    } else {
        $body = wp_remote_retrieve_body( $response );
        $data = json_decode( $body );

        // 取得した投稿を処理する
        $result = '';
        foreach ( $data as $post ) {
            $post_title = $post->title->rendered;
            $post_content = $post->content->rendered;
            // 他の必要な情報を取得する
            $result .= $post_title . '<br>';
        }
        return $result;
    }
}
add_shortcode('post-title','pwcn_api_posts_title');

...これでタイムアウトやリトライさせる..など工夫してみてくださいね。

最後にここまで言及してきませんでしたが、このようにして、サイトの投稿内容などを引っ張れるのが利点のREST APIですが、これを知っていたら他人のサイトの内容も悪い言い方すれば搾取できてしまうということで、ひょっとするとあなたのサイトも何かしらの被害に遭っているかも知れません(悪いことをする人はどこにでもいます)。

必要のないところからサイトのREST APIを叩かれてもエラーとなるよう制限しておくことで回避できますので、REST APIなんて使っていないという方や、使うけど範囲を限定したいという方は以下のページを参考に制限をしておくといいと思います。

, , , , , , ,



Lolipop ServerMoshimo Ad x-serverMoshimo Ad

WordPress Create Shortcodes | Personal WP Customization Notes (PWCN)
カスタムフィールドに保存した値を投稿本文内へショートコードで呼び出すコード