web-dev-qa-db-ja.com

WordPressのページサイズを大きくする REST API

クライアントがWordPress REST JSON APIを一部のWordPressデータモデルで使用しています。フロントエンドからWordPress APIにアクセスして、数百のカスタム投稿を取得する必要があります。

Wordpressには カスタム投稿数が100の厳しい制限があります

このユースケースでは、この上限をもっと大きい数値に変更したいと思います。私はあなたがPHPでモンキーパッチをすることはできないと読んだ。

per_page->maximum値を10000に調整する方法はありますか?

2
robbintt

あなたはデフォルトの要求のためにWordPressで要求ごとの100のポストのその制限を乗り越えることができません。それでもすべての投稿を取得する1つの方法は、すべての投稿が表示されるまでそのインターフェイスを照会することです。もう1つはカスタムエンドポイントです。

可能であれば、独自のRESTエンドポイントを作成することをお勧めします。これはすでに機能し、すべての投稿を返します

add_action('rest_api_init', 'my_more_posts');

function my_more_posts() {
    register_rest_route('myplugin/v1', '/myposts', array(
        'methods' => 'GET',
        'callback' => 'my_more_posts_callback',
    ));
}

function my_more_posts_callback( WP_REST_Request $request ) {
    $args = array(
        'posts_per_page' => -1,
    );
    return get_posts($args);
}

あなた自身のエンドポイントを作成することに関するより多くの情報はここで見つけることができます 、一方get_posts()引数はここで説明されています


フロントエンドの純粋なJavaScriptソリューションでは、総ページ数を示すx-wp-totalpagesヘッダーを利用できます。このページにたどり着かない限り、我々は再び問い合わせる必要があることを知っています。したがって、このような基本的な再帰バージョンは機能します。

var allPosts = [];

function retrievePosts(opt) {
  if (typeof opt === 'undefined')
    opt = {};

  var options = $.extend({
    per_page: 100,
    page: 1
  }, opt);
  var url = 'https://example.com/wp-json/wp/v2/posts';
  var uri = url + '?per_page=' + options.per_page + '&page=' + options.page;

  $.getJSON(uri, function(data, status, jqXHR) {
    var totalpages = jqXHR.getResponseHeader('x-wp-totalpages');

    allPosts = allPosts.concat( data );

    // here the magic happens
    // if we are not done
    if (options.page < totalpages) {
      // request again, but for the next page
      retrievePosts({
        per_page: options.per_page,
        page: options.page + 1
      });
    } else {

      // WE ARE DONE
      // posts are in allPosts

    }
  });
};
retrievePosts();
1
kero