web-dev-qa-db-fra.com

Wordpress REST API V2 renvoie tous les articles

Il me manque la fonction pour obtenir TOUS les messages (ou CPT) en utilisant 

example.com/wp-json/wp/v2/country/?per_page=-1

ou tout semblable. La documentation donne autant d’informations que celle-ci: 

per_page: nombre maximal d'éléments à renvoyer dans le jeu de résultats.

Défaut: 10

Et dans une autre question à propos de per_page, nous apprenons que la plage autorisée est comprise entre 1 et 100.

Dans mon cas, il me faudra un nombre limité de postes, mais ce sera autour de 200-300. Existe-t-il des solutions de contournement pour les obtenir tous autrement que de tout récupérer page par page et de l'assembler?

Informations supplémentaires si cela a de l'importance: j'utilise angular.js

10
Jerry

À partir de WP 4.7, vous pouvez augmenter la limite supérieure des demandes d'API WP REST en vous connectant au filtre suivant:

rest_{$this->post_type}_collection_params

Cet extrait devrait faire l'affaire pour posts:

add_filter( 'rest_post_query', 'se35728943_change_post_per_page', 10, 2 );

function se35728943_change_post_per_page( $args, $request ) {
    $max = max( (int) $request->get_param( 'custom_per_page' ), 200 );
    $args['posts_per_page'] = $max;    
    return $args;
}

Remarque: vous ne pouvez pas utiliser l'argument standard per_page (avec une valeur supérieure à 100) dans la requête - wp api répondra immédiatement avec une erreur (le crochet ne servira donc pas). C’est dans le code ci-dessus que nous utilisons custom_per_page (vous pouvez utiliser n’importe quel autre mot).

Filtre similaire pour taxonomies: rest_{$this->taxonomy}_query

Exemple:

add_filter( 'rest_tags_query', 'se35728943_change_terms_per_page', 2, 10 );

function se35728943_change_terms_per_page( $prepared_args, $request ){
    $max = max( 200, (int) $request->get_param( 'custom_per_page' ) );

    $prepared_args['number'] = $max;
    return $prepared_args;
}
4
jgangso

Impossible d'obtenir plus de 10 avec cette syntaxe. Essayé http://example.com/wp-json/wp/v2/posts?per_page=100 et travaillé jusqu'à 100.

3
brunouno

La méthode des soufflets a fonctionné pour moi. J'ai pu récupérer les messages d'un site avec 79 246 messages. J'ai utilisé paramètres de pagination . Dans une boucle, de 1 à TotalPages disponibles. Voir le lien pour doc.

http://mydomain/wp-json/wp/v2/posts?_embed&per_page=100&page=793

per_page = 100: signifie que 100 messages maximum seront récupérés par page

page = 793: signifie que j'ai 793 pages avec 100 messages par page. la dernière page n'avait que 46 posts

Une boucle peut alors être utilisée dans la langue de votre choix.

2
daniel rubambura

Si vous envisagez de le faire avec d'autres paramètres, vous pouvez également ajouter des catégories, etc. PAR EXEMPLE:

https://www.website.com/wp-json/wp/v2/posts?categories=61&per_page=100
0
vr_driver

Une méthode plus simple, conforme au protocole, consiste à collecter toutes les réponses, en séquence, Et à effectuer un appel single setState (). Comme suit: (gestion des erreurs omise pour la lisibilité)

composantDidMount () {

var uri = "http://your-server";
var totalPages = 0;
var allResults = [];

fetch(uri)
.then(response => {
  totalPages = response.headers.get('X-WP-TotalPages');
  return response.json()})
.then(results => {
  allResults = results;
  //console.log('Got results from server', results.length); 
  for (let i = 2; i <= totalPages ; i++){
    fetch(uri + "?page=" + i)
    .then(response => {return response.json()})
    .then( moreresults => {
      allResults = allResults.concat( moreresults ); 
     });
  }
  this.setState({responses: allResults });
});

}

0
Mulli

Il est vraiment possible d’obtenir plus de 100 articles ou termes (tags, catégories).
Vous devriez utiliser rest_{$this->post_type}_query hook (pour les publications) ou rest_{$this->taxonomy}_query hook pour les termes.
Mais vous devez savoir, qu'il est impossible de passer un per_page arg dans votre demande GET avec plus de 100 valeurs. WP API va lancer une erreur immédiatement (le hook ne va pas aider): per_page must be between 1 (inclusive) and 100 (inclusive) (avec un statut de 400 http).
Pour résoudre ce problème, vous devez passer une valeur per page dans un autre argument get. Et après cela, tracez cette valeur dans votre crochet.
Le code est donc: 

Pour les postes

add_filter( 'rest_post_query', 's976_rest_post_per_page', 2, 10 );
function s976_rest_post_per_page( array $args, WP_REST_Request $request ) {
    $post_per_page = $request->get_param('s976_per_page') ? $request->get_param('s976_per_page') : 10;
    $args['posts_per_page'] = $post_per_page;
    return $args;
}

Pour les termes

add_filter( 'rest_category_query', 's976_rest_cats_per_page', 2, 10 );
function s976_rest_cats_per_page( array $prepared_args, WP_REST_Request $request ){
    $cats_per_page = $request->get_param('s976_per_page') ? $request->get_param('s976_per_page') : 10;
    $prepared_args['number'] = $cats_per_page;
    return $prepared_args;
}

Bien sûr, pour que cela fonctionne, vous devez passer l'argument s976_per_page (avec une valeur telle que 500, 99999) dans la requête GET.

0
s976

Dans WordPress 4.9.6, je devais utiliser rest_{$this->post_type}_query

/* change amount of posts returned by REST API to 100 */
function rest_posts_per_page( $args, $request ) {
    $max = max( (int)$request->get_param( 'per_page' ), 100 );
    $args['posts_per_page'] = $max;
    return $args;
}
add_filter( 'rest_post_query', 'rest_posts_per_page', 10, 2 );
0
Mr. Me