it-swarm.com.de

Erhöhen Sie die Seitengröße von WordPress REST API

Ein Client verwendet die JSON-API WordPress REST mit einigen WordPress-Datenmodellen. Wir müssen die WordPress-API vom Frontend aus aufrufen und einige hundert benutzerdefinierte Posts abrufen.

Wordpress hat ein festes Limit von 100 benutzerdefinierten Beiträgen .

Ich möchte diese Grenze für diesen Anwendungsfall in eine viel höhere Zahl ändern. Ich habe gelesen, dass man in PHP kein Affen-Patch machen kann.

Gibt es eine Möglichkeit, den Wert von per_page->maximum auf beispielsweise 10000 anzupassen?

2
robbintt

Sie können dieses Limit von 100 Posts pro Anforderung in WordPress für Standardanforderungen nicht überschreiten. Eine Möglichkeit, weiterhin alle Posts abzurufen, besteht darin, diese Schnittstelle abzufragen, bis Sie alle Posts haben. Ein anderer wäre ein benutzerdefinierter Endpunkt.

Wenn möglich, schlage ich vor, einen eigenen REST Endpunkt zu erstellen. Dies wird bereits funktionieren und alle Beiträge zurückgeben

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);
}

Weitere Informationen zum Erstellen eines eigenen Endpunkts finden Sie hier , wohingegen die Argumente von get_posts() hier erläutert werden.


Für eine reine JavaScript-Lösung im Frontend können Sie den Header x-wp-totalpages verwenden, der die Gesamtanzahl der Seiten angibt. Wenn diese Seite nicht erreicht wird, müssen wir eine erneute Abfrage durchführen. Eine grundlegende rekursive Version wie diese funktioniert also:

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