WP REST APIで日付範囲指定 after before パラメータがシビアだったのでメモ

今年の書いた記事の分析をしようと思っていたらWP REST API(v2 beta15)で日付範囲指定 after・before パラメータがシビアだったのでメモしておきます。

やろうとしていたこと

以前、その年の取得をしたくてこのようにURLを叩いてました。

http://www.example.com/wp-json/wp/v2/posts?filter[posts_per_page]=100&filter[order]=ASC&filter[year]=2015

※ 以降、http://www.example.com はダミーです

これが、仕様が変わったのか、上手く取れなくなっていたので、再度リファレンスを読んで対応しようとしました。

Posts API Reference | WP REST API v2 Documentation

Post一覧はこのあたり。なんか結構変わってる気がする。

afterは特定のISO8601に準拠した日付の後に公開されたものに絞り込みます。

beforeは特定のISO8601に準拠した日付の前に公開されたものに絞り込みます。

カジュアルにやってみたらエラー連発

ISO8601かー。なるほど。という風に

あたりを参考に、Postmanで

http://www.example.com/wp-json/wp/v2/posts?page=1&order=asc&per_page=100&after=20141010T135040

と叩いたら、

{
  "code": "rest_invalid_param",
  "message": "無効なパラメーター: after",
  "data": {
    "status": 400,
    "params": {
      "after": "無効な日時です。"
    }
  }
}

となってエラーが出ました。

http://www.example.com/wp-json/wp/v2/posts?page=1&order=asc&per_page=100&after=2014-10-10

日付のみの指定もエラー。

http://www.example.com/wp-json/wp/v2/posts?page=1&order=asc&per_page=100&after=2014-10-10T13:50:40+9:00

タイムゾーンまわりかと思って入れてみてもエラー。

正解はこれだった

いろいろ試行錯誤したところ、これが正解でした。

http://www.example.com/wp-json/wp/v2/posts?page=1&order=asc&per_page=100&after=2014-10-10T13:50:40

ポイントは以下。

  • タイムゾーンはいらない(というか入れ方がまだよくわからない)
  • 日付部分はYYYY-MM-DDでハイフンで区切る。
  • 時間部分はHH:MM:SSの形にする、9時2分だとすると、09:22:00と指定する。

これでアクセスすると、

上手く表示されました。

Node.jsだとwpapiが便利

うむむ、日付指定、少々シビアだなと思ってたところ、Node.jsでやるときはwpapiが便利でした。

こんな風に書けます。

var WPAPI = require( 'wpapi' );
var wp = new WPAPI({ endpoint: 'http://www.example.com/wp-json/' });  // 自分のエンドポイントを入れる

wp.posts().perPage(100).page(1).after(new Date('2015-01-01')).before(new Date('2015-12-31')).then(function( data ) {
  // do something with the returned posts
  console.log(data._paging);
}).catch(function( err ) {
  // handle error
});

これを実行すると、

{ total: '5',
  totalPages: '1',
  links: { 'https://api.w.org/': 'http://www.example.com/wp-json/' } }

このように取得できます。日付の指定もDate関数の力を借りれるし、他にもいろいろと取得しやすい配慮がいろいろとなされているライブラリでありがたかったです。

おわりに

今回はISO8601の仕様での省略形や記法のブレでかなり惑わされましたが、なんとか見つけることができました。もう少し、ゆるい指定でも受け入れてくれるとうれしいですが、このあたりは慣れろというところかもしれませんね。

それでは、よきWordPress Lifeを!