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

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark