はじめに
WordPressのREST APIで一気に大量の記事を取得したいことがあったので、そのときの対処法をメモしておきます。
だいたいは10件、20件ずつ取ると思うので、あまり普通の使い方の場合には当てはまらないと思いますが...
みなさんよくお使いになるget_posts
関数では、全件を取得する場合は、posts_per_page
に-1
を入れればOKですが、WP-REST-APIではそうはいきません。
WP-REST-APIだと、per_page
というパラメーターになりますが、2020年3月現在、最大100件までしか取得できず、100以上の数値を入れるとエラーとなります。
今回はページネーション機能を利用して、100件以上ある場合もすべて取得したいと思います。
コード
※Vue.jsで書いてあったコードをjavascript, jQueryで書き換えたので、動作確認はしてません。
※固定ページを取得しています。
var nowPage = 1
var totalPage = 1
init()
async function init() {
while(1) {
count++
await getAllPages()
nowPage++
//トータルのページ数より多くなったら、終わり
if(nowPage > totalPage) {
break
}
}
}
async function getAllPages() {
await $.ajax({
url: 'your-url/wp-json/wp/v2/pages', //投稿を取得したい場合は、postsにしてください
type: 'GET',
data: {
per_page: 50,
page: nowPage,
}
}).done( (data, status, xhr) => {
//トータルのページ数を取得
totalPage = parseInt(xhr.getResponseHeader('x-wp-totalpages'))
//なんか処理
})
.fail( (data) => {
console.log(data)
})
}
ハマったところ
今回、100件以上ある固定ページを50件ずつ取得しようとしたのですが、デフォルトだと、並び順は作成日時の降順になっています。
固定ページの自動生成をして、一気に作ったページの場合は、日時が重複していたので、ちょうどページの変わり目に重複した日時の記事が来たときに、2件取得される記事と1件も取得されない記事がありました。
そういう場合は、IDの昇順にするなどして対応してもらえれば回避できます。