Je voudrais récupérer tous les articles d'un blog via l'API XML-RPC de Wordpress.
Il y a les méthodes de blogger.getRecentPosts
et metaWeblog.getRecentPosts
qui - étant donné une valeur suffisamment élevée en nombre de posts (ou -1) en théorie, devraient renvoyer tous les posts.
Cependant, cela ne fonctionne pas pour les très gros blogs ou les serveurs très faibles qui ne peuvent pas garder la totalité du blog en mémoire. Dans ce cas, ces fonctions ne renverront rien au mieux ni ne jetteront une erreur dans le XML de réponse.
Une solution serait de récupérer des morceaux plus petits de, par exemple. 50, messages à la fois et mettre tout cela du côté de la réception. Pour que cela fonctionne, il faudrait spécifier un décalage pour les messages à obtenir. Je n'ai pas été en mesure de trouver un moyen de spécifier un tel décalage dans l'API documentée.
Existe-t-il un moyen de résoudre ce problème en spécifiant un décalage ou en utilisant une méthode autre que celles mentionnées ci-dessus?
Je ne cherche pas une description sur la façon d'écrire un plugin ou de modifier Wordpress lui-même. Je peux le faire, bien sûr, mais je parle de récupération autorisée des données de blogs Wordpress arbitraires.
Edit:J'ai ouvert un ticket de trac chez Wordpress avec une suggestion de solution: http://core.trac.wordpress.org/ticket/16316
Selon le sujet dans les forums officiels [xmlrpc] Comment obtenir des publications avec offset?
Les API XML-RPC existantes ne permettent pas vraiment de collecter toutes les données de publication à l'heure actuelle. (Joseph Scott)
Le sujet est un peu ancien et je ne sais pas s'il y a eu des changements depuis, mais à en juger par la source, cela ne semble pas être le cas.
Permettez-moi de m'excuser pour la question initiale que j'ai posée au sujet de vos motivations. Je vois beaucoup de questions "comment puis-je récupérer à distance tous les articles d'un autre blog" et je suppose immédiatement qu'il y a une intention néfaste, car, 9 fois sur 10, il y en a une. Cela dit, vos objectifs semblent très simples et respectables.
Actuellement, il n'existe aucun moyen de "fragmenter" le retour XML de l'une des trois demandes que vous avez mentionnées. Quand je me suis levé ce matin, cependant, j'ai vu que vous proposiez cela comme une amélioration de fonctionnalité via Trac . Cela n’arrivera certainement pas à Wordpress 3.1, vous allez donc probablement attendre quelques mois (ou plus) avant que les correctifs soumis ne le deviennent. Mais c'est un bon début.
En attendant, rappelez-vous que l'API XML-RPC est extensible. Bien qu'il n'y ait aucun moyen de recevoir des "morceaux" dans l'API existante, vous pouvez toujours ajouter votre propre méthode. C’est en fait le meilleur moyen d’obtenir un correctif dans le noyau: créez votre propre méthode, assurez-vous qu’elle fonctionne, puis renvoyez le correctif à Trac.
Je suppose que votre méthode serait très similaire à metaWeblog.getRecentPosts
, mais que son nom serait un peu mieux ... peut-être wp.getPagedPosts
. Vous pouvez accepter tous les mêmes paramètres, mais en ajouter un: "numéro de page". De cette façon, vous pouvez définir la demande de retour de 50 messages à la fois et parcourir progressivement la collection.
Pour ajouter votre méthode, vous raccordez le filtre xmlrpc_methods
:
function xml_add_method( $methods ) {
$methods['wp.getPagedPosts'] = 'wp_getPagedPosts';
return $methods;
}
add_filter( 'xmlrpc_methods', 'xml_add_method');
Ajoutez ensuite votre fonction de rappel:
function wp_getPagedPosts($args) {
// $this->escape($args); //<-- This is called by native XML-RPC methods to sanitize passed arrays for the database.
$blog_ID = (int) $args[0];
$username = $args[1];
$password = $args[2];
if ( isset( $args[3] ) )
$query = array( 'numberposts' => absint( $args[3] ) );
else
$query = array();
if ( !$user = $this->login($username, $password) )
return $this->error;
do_action('xmlrpc_call', 'wp.getPagedPosts');
//... get a list of posts and generate your XML-RPC return ...
}
N'oubliez pas qu'il s'agit d'un code que vous placeriez dans un fichier de plug-in externe ou dans un fichier functions.php
avec votre thème afin de prendre en charge la requête XML-RPC supplémentaire. Il n'y a aucune méthode existante pour gérer cela, vous êtes donc obligé d'écrire votre propre. Mais si vous le faites une fois, et le faites bien, et le renvoyez à Trac ... cela pourrait devenir Core, vous n'auriez pas à le refaire.
C'est facile. Juste utiliser metaWeblog.getRecentPosts ou mt.getRecentPostTitles et fixer la limite à PHP_INT_MAX. Si vous le définissez à il renvoie un maximum de messages que vous avez définis pour l'affichage sur la page d'accueil (10 habituellement). Ma Bibliothèque de contrôle à distance Wp le fait avec une grande facilité. Voir le Snippets de base.
// Getting all posts as full or light items
$all_posts = $wpapi->getRecentPosts(PHP_INT_MAX);
$all_post_titles = $wpapi->getRecentPostsList(PHP_INT_MAX);
Regards.
wp.getPosts offre maintenant la possibilité de demander un décalage.
http://codex.wordpress.org/XML-RPC_WordPress_API/Posts#wp.getPost
Un moyen simple de récupérer tous les articles est d’abord d’essayer d’exécuter la méthode getRecentPosts et de n’extraire qu’un seul article (le plus récent correspond à ce qui va être renvoyé), puis d’utiliser l’ID de cet article pour effectuer une boucle et récupérer chaque article consécutivement avec la méthode getPost. Si vous rencontrez des problèmes avec la quantité de données extraites en un appel, cela devrait résoudre votre problème. Vous pouvez même modifier ceci pour récupérer des morceaux en modifiant votre nombre de dollars en 5 ou 10 ou ce que vous avez.
Voici un exemple très dépouillé (en supposant que vous connaissiez les deux méthodes en PHP, espérons que vous en avez l'idée ..):
<?php
include('your_xmlrpc_functions_for_getRecentPosts_and_getPosts.php');
$count = 1;
$dataArray = getRecentPosts($appkey, $blogid, $user, $pass, $count);
$startID = $dataArray[0][postid];
for($i=$startID;$i>0;$i--) {
$postInfoArray[] = getPost($appkey, $blogid, $user, $pass, $i);
//add in whatever other functionality for each post here (maybe a time delay or something)
}
?>
J'espère que ça aide quelqu'un :)