WP-APIとwp_remote_getで「他所のWordPressの投稿」を取得する
WP-APIをwp_remote_getで取得する方法についてざっとまとめました。 WP-APIが実装されているWordPressサイトであればほぼ全て、このやり方で投稿データを引っこ抜ける(はず)です。 とりあえず完成 […]
目次
WP-APIをwp_remote_getで取得する方法についてざっとまとめました。
WP-APIが実装されているWordPressサイトであればほぼ全て、このやり方で投稿データを引っこ抜ける(はず)です。
とりあえず完成品
今回はいきなり完成品からです。
functions.phpに関数として定義しておくことで、フックなりテーマ直書きなりで自由に使えるかなと思います。
functions.phpに記述するコード
[php]
function get_wp_api(){
//取得するWP-APIを設定
$url = "https://example.com/wp-json/posts";
$wp_api_posts = wp_remote_get($url);
//WP-APIが取得できなかった場合の処理
if($wp_api_posts[‘response’][‘code’] != 200){
echo "APIを取得できませんでした。";
return false;
}
$wp_api_posts = json_decode($wp_api_posts[‘body’]);
$html = "<dl>";
foreach ($wp_api_posts as $k => $v){
$id = $v->ID;
$title = $v->title;
$link = $v->link;
$excerpt = $v->excerpt;
//ここで出力するHTMLを整形する。
$html .= "<dt><a href='{$link}’>{$title}</a></dt><dd>{$excerpt}</dd>";
}
$html .= "</dl>";
echo $html;
}
[/php]
表示させたい場所に書くコード
functions.phpに書いたものだけでは動作しませんので、使いたい場所で関数を呼び出します。
テーマで使用する場合は以下のようなコードを足せばOKです。
[php]
<?php get_wp_api();?>
[/php]
ショートコードで使うなら
どうせならショートコードで使えたほうが良いよねってことで、さくっと作ってみました。
functions.phpに記述するコード
[php]
add_shortcode(‘wpapi’, ‘sample_echo_posts’);
function sample_echo_posts($attr){
$baseurl = get_home_url();
extract(shortcode_atts(array(
‘url’ => $baseurl,
‘type’ => ‘posts’
), $attr));
//ここにfilterのクエリを書く
$q = "filter[order]=DESC&filter[orderby]=date&filter[posts_per_page]=5";
$url = "{$url}/wp-json/{$type}?{$q}";
var_dump($url);
$html = sample_get_api($url);
return $html;
}
function sample_get_api($url){
$wp_api_posts = wp_remote_get($url);
if($wp_api_posts[‘response’][‘code’] != 200){
return "<dl class=’wpapi’><dt>読み込みに失敗しました。</dt></dl>";
}
$wp_api_posts = json_decode($wp_api_posts[‘body’]);
$html = "<dl class=’wpapi’>";
foreach ($wp_api_posts as $k => $v){
$id = $v->ID;
$title = $v->title;
$link = $v->link;
$excerpt = $v->excerpt;
$html .= "<dt><a href='{$link}’>{$title}</a></dt><dd>{$excerpt}</dd>";
}
$html .= "</dl>";
return $html;
}
[/php]
表示させたい場所に書くコード
投稿内ではこんな感じで使います。
[html]
[wpapi url="https://example.com" type="posts"]
[/html]
filterの指定時に[]を使う関係で、queryを引数にそのまましようとすると事故る模様orz
それぞれ引数を作って適用させていくのが無難なのかもです・・・
そんなわけでプラグイン
せっかくいろいろ試したので、ショートコードとウィジェットでWP-APIのデータを取得できるようにプラグイン化してみました。
作った勢いで公式ディレクトリにも申請中なので、通れば公式ディレクトリからダウンロードできます。
追記(2015/03/27)
ネットワークトラブルで「wp_remote_get」の値がfalseまたはWP_Errorになることがあり、上記のコードではその際にエラーで死ぬとの指摘を頂きました。
宮内さんありがとうございますm(_ _)m
レスポンスコードの確認を行う前に「is_wp_error」でそれらを処理する必要があるそうです。
[php]
function get_wp_api(){
//取得するWP-APIを設定
$url = "https://example.com/wp-json/posts";
$wp_api_posts = wp_remote_get($url);
//WP-APIが取得できなかった場合の処理
if(is_wp_error($wp_api_posts))}
echo "ネットワークエラーが発生しました。";
return false;
} elseif($wp_api_posts[‘response’][‘code’] != 200){
echo "APIを取得できませんでした。";
return false;
}
$wp_api_posts = json_decode($wp_api_posts[‘body’]);
$html = "<dl>";
foreach ($wp_api_posts as $k => $v){
$id = $v->ID;
$title = $v->title;
$link = $v->link;
$excerpt = $v->excerpt;
//ここで出力するHTMLを整形する。
$html .= "<dt><a href='{$link}’>{$title}</a></dt><dd>{$excerpt}</dd>";
}
$html .= "</dl>";
echo $html;
}
[/php]
とりあえずの修正のためエラーテキストをベタ打ちにしていますが、WP_Errorを使ってメッセージを出したりすることもできそうです。
こういうエラー処理の見落としを防ぐ方法やエラーハンドリングについてなどをもっと詳しく知りたい方は「WordPressプラグインバイブル」を見ながら作業するのが良さそうです。
中途半端に読んでたので、いい加減ユニットテスト・WP-CLI・WP_Errorあたりのデバッグ系の章読みますorz