APIを叩いて何かを出力する..ということにちょっと慣れてきたので、今回はWordPress.org APIのプラグインデータを取得して、いろいろな情報を表示させてみようと思います。
これ自体の使い道は、プラグインの紹介ページなどで最新情報を取得して表示する..位しか思いつかないですが、APIの使い方の勉強の一環として、やってみてはいかがでしょうか?
他のサイトの投稿などを引っ張ってきて表示したいという方は、こちらでいろいろと掲載していますので、興味のあるページを参照ください。
コードを使用する前に、ここをクリックして注意事項をご確認ください
本ページで掲載しているコードは、以下に了承した上で使用ください
- コードは商用・非商用問わず自由に使っていただいて構いませんが、コード追加による不具合やトラブルが発生しても当方では一切責任を負いません
- コードは有効化しているテーマのfunctions.php、style.cssなどへ追加することで機能します。それらのファイルへの変更を行うことに不安のある方は使用しないでください
- コードは本ページの公開日時点で私の環境において動作したものです。WordPressバージョン他環境の違いによって動作しないことがあります
- コードは、セキュリティ、コードの正確さなどにおいて完全なものではありません。中には紹介するコードを簡略化するために省略している部分があるものもありますので、ご自身でコードを十分に検証し、必要な部分の編集を行った上で使用するようにしてください
- 掲載しているのは参考コードです。自身の環境に合わせるための編集はご自身で対応いただく必要があります(コメント欄等から質問いただいても基本回答は致しません)
- 掲載しているコードの転載を禁じます(SNSで紹介いただいたり、本ページへのリンクを張っていただくことは大歓迎です)
情報を取得してショートコードで出力する
完成形のサンプルプログラム
前置きなしていきなりですが以下が完成コードです。以下をfunctions.phpへ追加してください。
/*** 公式情報の表示 ***/
/* 値の取得とキャッシュの管理 */
function pwcn_get_wp_plugin_data_callback($pwcn_wp_plugin_slug){
// プラグインのスラッグ(ショートコードから取得)
$plugin_slug = $pwcn_wp_plugin_slug;
// プラグインごとにキャッシュキーを区別する
$cache_key = 'pwcn_wordpress_org_plugin_json_data_' . $plugin_slug;
// キャッシュの有効期間(秒)
$cache_duration = 604800;//1週間
// タイムアウト時間(秒)
$timeout = 1;
// リトライ回数
$retry_count = 3;
// リトライ間隔(秒)
$retry_delay = 1;
// キャッシュからデータを取得
$cached_data = get_transient($cache_key);
//データの取得
if (false === $cached_data) {
// キャッシュがないか有効期限切れの場合、リトライしつつ新しいデータを取得
$args = array(
'timeout' => $timeout,
'retry' => array(
'retries' => $retry_count,
'delay' => $retry_delay
)
);
// タイムアウト時間を含む生データの取得
$request = wp_remote_get(
'https://api.wordpress.org/plugins/info/1.0/' . $plugin_slug . '.json',
$args
);
// エラーが発生した場合の処理(エラー出なかったら続行)
if (is_wp_error($request)) {
return '情報の取得中にエラーが発生しました。';
}
//生データから本文のみを取得
$body = wp_remote_retrieve_body($request);
//本文のデータを連想配列としてデコード
$data = json_decode($body, true);
// 新しいデータをキャッシュに保存
set_transient($cache_key, $data, $cache_duration);
} else {
$data = $cached_data;
}
return $data;
}
/*** バージョン情報を出力するショートコード ***/
function pwcn_wp_plugin_version_sc( $atts ){
$atts = shortcode_atts(
array(
'slug' => '',
),$atts);
//公式サイトのスラグ
$slug = $atts['slug'];
if(!empty( $slug )){
$pwcn_wp_plugin_slug = $slug;
}else{
$pwcn_wp_plugin_slug = '';
}
// コールバック関数を呼び出してデータを取得
$data = pwcn_get_wp_plugin_data_callback($pwcn_wp_plugin_slug);
//データの種類を設定
$data_name = $data['version'];
//データを出力
if (isset($data_name)) {
$output = '<span>'.$data_name.'</span>';
} else {
$output = '';
}
if (!empty($output)) {
return $output;
} else {
return '<span>情報はありません(リロードすると再試行します)</span>';
}
}
add_shortcode('wp-plugin-version','pwcn_wp_plugin_version_sc');
/*** プラグイン名を出力するショートコード ***/
function pwcn_wp_plugin_name_sc( $atts ){
$atts = shortcode_atts(
array(
'slug' => '',
),$atts);
//公式サイトのスラグ
$slug = $atts['slug'];
//公式ページのリンク
if(isset($slug)){
$link = 'https://ja.wordpress.org/plugins/'.$slug.'/';
}else{
$link = '';
}
if(!empty( $slug )){
$pwcn_wp_plugin_slug = $slug;
}else{
$pwcn_wp_plugin_slug = '';
}
// コールバック関数を呼び出してデータを取得
$data = pwcn_get_wp_plugin_data_callback($pwcn_wp_plugin_slug);
//データの種類を設定
$data_name = $data['name'];
//データを出力
if (isset($data_name)) {
$output = '<a href="'.$link.'" target="_blank" rel="nofollow noopener">'.$data_name.'</a>';
} else {
$output = '';
}
if (!empty($output)) {
return $output;
} else {
return '<span>情報はありません(リロードすると再試行します)</span>';
}
}
add_shortcode('wp-plugin-name','pwcn_wp_plugin_name_sc');
これで、投稿などに以下のショートコードを挿入すると、バージョンと名前が表示できます。
バージョン情報のショートコード
[wp-plugin-version slug="ultimate-member"]
プラグイン名情報のショートコード
[wp-plugin-name slug="ultimate-member"]
上記はUltimate Memberというプラグインの情報を取得しています。「slug」パラメーターを変更することで、そのプラグインの情報を表示できます。
プラグイン公式ページの末尾(Ultimate Memberプラグインなら「https://ja.wordpress.org/plugins/ultimate-member/」の赤字の部分)の文字列を「slug」パラメーターで指定します。
コードの簡易解説
このコードは以下の3つのユーザー定義関数で作られていますので、それぞれについて簡単に説明します。
コード中にたくさんコメント入れてありますので、各所ご自身で確認ください
pwcn_get_wp_plugin_data_callback()関数
このユーザー定義関数では、ショートコードからスラグを受け取り、そのスラグを含んだAPIのエンドポイント(URL)へ接続して情報を取得し、再びショートコードへ返すという処理をしています。
「APIを叩く」なんて表現される通り、接続相手(情報元)のサイトで提供されているデータへアクセスして情報を取得するため、少なからず相手のサーバーに負荷をかけてしまいますし、取得できる速度も接続相手の状況次第になってしまうので、ショートコードが複数挿入されていても叩きからかす?ことがないよう、取得したデータは7日間キャッシュするようにしています。
キャッシュ?という方のために補足しておくと、データベースのoptionsテーブルに取得したデータを一定期間保存して、キャッシュがあればキャッシュのデータを使う(つまり接続相手には接続しない)ようにし、キャッシュがない、または期限切れの時は再び取得してキャッシュに保存するという処理をすることで、相手になるべく迷惑をかけず、かつ、相手の状態に左右されないようにする手法のことを言います。
前述したように、キャッシュは基本的にサイトのデータベース内にあるoptionsテーブルに保存されるので、このページに関して言えば、プラグインの数だけデータ行が増えることにはなりますが、よほど多くの行が追加されなければ、サイトのパフォーマンスへの影響はないでしょう。
ちなみにキャッシュデータは「_transient…」というデータ行と「_transient_timeout…」という値がセットで保存されており、今回のケース以外でもたくさん保存されていますから、興味があればoptionsテーブルを覗いてみてくださいね。
世の中にはいろいろなAPIがありますが、この関数が基本的なデータ取得の流れとしていろいろと使えると思います。
pwcn_wp_plugin_version_sc()とpwcn_wp_plugin_name_sc()関数
これらのユーザー定義関数はショートコードで情報を出力するためのもので、ショートコードで指定した「slug」パラメーターをpwcn_get_wp_plugin_data_callback()へ渡し、返ってきたデータ(キャッシュのデータまたは再取得したデータ)から情報を引き出して表示させるという役割を果たしています。
どの情報を出力するかは、例えばpwcn_wp_plugin_version_sc()では以下の行で定義されています。
//データの種類を設定
$data_name = $data['version'];
情報の取得とショートコードの出力をまとめることもできるのですが、そうすると、共通で使える情報取得の部分のコードを重複して使うことになり、全体のコードが長くなるので、今回は情報取得とショートコードの関数を分けるようにしました。この点はどのようにデータを扱うかで考えるといいと思います。
プラグインのAPIから取得できる情報
以下のコードを追加して「plugin-api-data」ショートコードを挿入すると、そのプラグインから取得できる情報が下図のようにずらっと表示できます。
function pwcn_plugin_api_array_data_sc(){
// スラッグ
$slug = 'ultimate-member';
//データの取得
$rest_url = 'https://api.wordpress.org/plugins/info/1.0/'.$slug.'.json';
//jsonデータを取得
$json_data = file_get_contents($rest_url);
// JSONデータをデコード
$data = json_decode($json_data, true);
//jsonデータを見やすく整形
$formatted_api_data =
esc_html(
json_encode($data,
JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES
));
// JSONデータを出力
$result_html = '';//初期値をセット
$result_html .= '<div class="post-json" style="overflow: scroll;">';
$result_html .= '<pre>' .$formatted_api_data . '</pre>';
$result_html .= '</div>';
$result_html .= '<style>.post-json a {text-decoration: none;}</style>';
return $result_html;
}
add_shortcode('plugin-api-data','pwcn_plugin_api_array_data_sc');
「$slug = ‘ultimate-member‘;」の赤字の部分を目的のプラグインのスラグに変えれば、その情報が取得できます。
このプログラムはテスト用です。表示に時間がかかったり、エラーで転んだりする可能性があります。
このサイトで動かしていないので以下表示サンプルを画像で掲載しておきます。

先ほどのショートコードプログラムでは、このうちの「name」と「version」の情報を取得して表示させているということになりますから、その他の情報も別のショートコードプログラムを作れば自在に表示できるようになりますね。
以下が現在引き出すことができるデータです。
階層のあるものは[‘階層1’][‘階層2’]という風に指定すれば引き出せます(まあ、プラグイン公式ページに掲載されている情報はだいたい取得できます)。
階層1 | 階層2 | データの内容 |
---|---|---|
name | 正式名称 | |
slug | スラグ | |
version | 最新バージョン | |
author | 作者情報(リンクタグ付き) | |
author_profile | 作者サイト(外部) | |
requires | WordPressの必須バージョン | |
tested | 作者がテスト済のバージョン | |
requires_php | PHPの必須バージョン | |
requires_plugins | 共に使う必要のあるプラグイン | |
rating | ? | |
ratings | 5 | 評価「5」が付いた件数 |
ratings | 4 | 評価「4」が付いた件数 |
ratings | 3 | 評価「3」が付いた件数 |
ratings | 2 | 評価「2」が付いた件数 |
ratings | 1 | 評価「1」が付いた件数 |
num_ratings | 評価の合計 | |
support_threads | 質問の数 | |
support_threads_resolved | 解決済の質問の数 | |
downloaded | ダウンロード数 | |
last_updated | 最終更新日時 | |
added | 初回リリース日 | |
homepage | ホームページ(外部) | |
sections | description | 説明文 |
sections | installation | インストール方法 |
sections | faq | よくある質問 |
sections | changelog | 更新履歴 |
sections | screenshots | スクリーンショット |
download_link | ダウンロードリンクURL | |
screenshots | ※画像分だけ存在 | スクリーンショットの画像URL |
tags | ※タグ文字列分存在 | wordpress.org上のタグ |
versions | ※バージョン分存在 | 過去バージョンのダウンロードURL |
contributors | ※協力者分存在 | 開発協力者 |
コメントを残す