LoginSignup
4

More than 3 years have passed since last update.

WordPressのREST APIで一気に大量の記事を取得したい

Posted at

はじめに

WordPressのREST APIで一気に大量の記事を取得したいことがあったので、そのときの対処法をメモしておきます。
だいたいは10件、20件ずつ取ると思うので、あまり普通の使い方の場合には当てはまらないと思いますが...

REST APIの公式ドキュメント

みなさんよくお使いになる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の昇順にするなどして対応してもらえれば回避できます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4