web-dev-qa-db-fra.com

Augmenter la taille de la page du WordPress REST API

Un client utilise l'API JSON WordPress REST avec des modèles de données WordPress. Nous devons utiliser l'API WordPress à partir de l'interface et récupérer quelques centaines de messages personnalisés.

Wordpress a un limite stricte de 100 messages personnalisés .

Je voudrais changer cette limite à un nombre beaucoup plus élevé pour ce cas d'utilisation. J'ai lu que vous ne pouvez pas monkey patch en PHP.

Est-il possible d'ajuster la valeur per_page->maximum à, par exemple, 10000?

2
robbintt

Vous ne pouvez pas dépasser la limite de 100 publications par demande dans WordPress pour les demandes par défaut. Une façon de récupérer toutes les publications consiste à interroger cette interface jusqu'à ce que toutes les publications soient publiées. Un autre serait un point de terminaison personnalisé.

Si vous le pouvez, je suggère de créer votre propre noeud final REST. Cela fonctionnera déjà et renverra tous les messages

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

Vous trouverez plus d’informations sur créant votre propre noeud final ici , tandis que les arguments de get_posts() sont expliqués ici .


Pour une solution JavaScript pure dans le frontal, vous pouvez utiliser l'en-tête x-wp-totalpages qui indique le nombre total de pages. Si cette page n'est pas atteinte, nous savons que nous devons interroger à nouveau. Donc, une version récursive de base comme celle-ci fonctionne:

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