少し前に掲載した「WordPress 4.7のREST APIを使った記事閲覧プログラム」は、簡易版ということもあり、記事数は最大100件まで。これはREST APIの最大100件/回の制限からきたものだ。このBLOGだとまだ40件にも満たないので100件超えは数カ月後になるが、記事数無制限版に改良した。
ポイントはper_pageパラメータnの時に、何ページ分の記事があるかを知る方法と(=ajaxを実行する回数)、非同期でajaxを使う場合、Callbackの中でしか値を参照できず、ページ分ループし得た値をマージするにはちょっとしたコツが必要となる(同期でajaxを使う場合は普通のループで問題無い)。
主要部分のコードは以下の通り。キーは、レスポンスヘッダにあるX-WP-TotalPagesと、ファンクションの再帰呼出し(recursive call)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
var posts_per_page = 10; var url_base = 'http://blog.iwh12.jp/wp-json/wp/v2'; var url_posts = url_base + '/posts?per_page=' + posts_per_page; // get Posts function getPosts() { var posts_all = []; var max = 0; getPages(0); // get n page until max function getPages(n) { $.ajax({ type: 'get', url: url_posts + '&page=' + (n + 1), dataType: 'json' }) .done(function(data, textStatus, jqXHR) { Array.prototype.push.apply(posts_all, data); if (max == 0) max = parseInt(jqXHR.getResponseHeader('X-WP-TotalPages')); if (n + 1 == max) setDataTables(posts_all); else getPages(n + 1); }); } } |
コードから分かるように、全てのデータをマージするため、Callback内でgetPages()をページ数だけ再帰呼出ししている。また初めの一回目にレスポンスヘッダから最大ページ数を保存、その値と、カレントのページ数を比較して、同じになるまで配列のマージを繰り返し、同じになったらDataTablesに値をセットして戻る…といった感じだ。これで記事数が100件超えてもいくらでも読み込める(最大何件まで行けるかは不明)。
ただ以前のコードは、そもそもWPがJSONを組み立てるのが遅く(ショートコードやfunctions.phpも展開するため)、それを解決するのにcrontabへcurlを仕込み、ファイルでのやり取りをしていたが、この手が使えなくなってしまった。最初に全件ロードするのでそれなりに時間がかかるものの、一旦ロードすれば、後はオンメモリなので、動作は非常に速く快適に操作可能だ。
こうしてpostに関しては無制限になったが、category(子category未対応)とtagは最大100件のまま。これに引っかかることはあまり無いと思われるので省略した(同じ方法で対応は可能)。
改良版の記事閲覧プログラムはこちら。