PluginWordPress

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

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts