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
À 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;
}
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.
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.
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
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 });
});
}
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:
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;
}
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
.
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 );