avr 12
Poster automatiquement sur Wordpress avec PHP
Non ce blog n’est pas mort, seulement je suis occupé à d’autres projets en ce moment. C’est pourquoi l’article d’aujourd’hui sera bref, mais j’espère pourra vous être utile.
Il arrive parfois qu’on ait des besoins particuliers comme par exemple automatiser la publication de d’articles sur Wordpress qui ont besoin de manipulations côtés serveur avant d’être postées. Par exemple récupérer l’horoscope du jour.
Pour cela, plutôt que d’utiliser une batterie d’extensions qui vont faire mouliner encore un peu plus le bestiau, il peut être judicieux d’utiliser les fonctions XML-RPC de Wordpress, combinées à quelques lignes de PHP !
Pour cela, rien de plus simple : il faut d’abord activer la publication par XMLRPC dans l’administration de votre blog wordpress ; cette option se présente sous la forme d’une case à cocher dans la page Ecriture de la section Réglages (pour les francophones).
Dans un deuxième temps je vous recommande de créer un utilisateur spécial pour se connecter à votre blog via le XMLRPC ; afin de pouvoir poster des articles il devra avoir au moins des droits d’auteur.
Plus délicat, les fonctions XMLRPC de PHP doivent être activées dans votre php.ini. Malgré ce qu’en dit la documentation PHP, chez moi le module XML-RPC n’était pas actif par défaut et j’ai même dû le récupérer et redémarrer Apache avant de pouvoir utiliser les fonctions XMLRPC, sur une debian ça donne ceci (vous devez être identifiés en tant que root) :
/etc/init.d/apache2 restart
Mettons que ça ait fonctionné et que votre configuration PHP soit maintenant à jour, voici une petite fonction qui vous permet de poster sur votre blog wordpress avec le login et password de l’utilisateur que vous avez créé précédemment :
{
$title = htmlentities($title,ENT_NOQUOTES,$encoding);
$keywords = htmlentities($keywords,ENT_NOQUOTES,$encoding);
$content = array(
‘title’=>$title,
‘description’=>$body,
‘mt_allow_comments’=>0, // 1 pour autoriser les commentaires
‘mt_allow_pings’=>0, // 1 pour autoriser les trackbacks
‘post_type’=>‘post’,
‘mt_keywords’=>$keywords,
‘categories’=>array($category)
);
$params = array(0,$username,$password,$content,true);
$request = xmlrpc_encode_request(‘metaWeblog.newPost’,$params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_URL, $rpcurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
$results = curl_exec($ch);
curl_close($ch);
return $results;
}
Petite explication des paramètres de la fonction wpPostXMLRPC
- $title : le titre de l’article
- $body : le corps de l’article en HTML
- $rpurl : l’URL du moteur XMLRPC de votre blog, en général http://blog_url/xmlrpc.php
- $username : le login de l’utilisateur qui va poster (il doit avoir les permissions adéquates)
- $password : le mot de passe de l’utilisateur qui va poster
- $category : le nom de la catégorie dans laquelle sera classé l’article
- $keywords : les tags (mots clés) associés à l’article sous forme d’une chaine vide si il n’y en a pas, ou d’une liste de mots séparés par des virgules sinon
- $encoding : l’encodage, par défaut UTF-8 mais vous pouvez le modifier en fonction des paramètres de votre blog
Par défaut dans cette fonction, les commentaires et les pings sont désactivés, mais comme indiqué en commentaire, vous pouvez les activer en remplaçant les valeurs à 0 par des 1.
Voilà voilà, en éspérant que ce modeste script pourra faire patienter les fans !

6 juillet 2009 @ 11:35
Bonjour,
Je suis tombé sur votre article (très intéressant) et je souhaiterai avoir d’avantage d’information le concernant.
- Vous ne dites pas ou doit être intégré cette fonction ? Est-ce dans le xmlrpc.php ?
- La variable « $rpurl » n’est pas intégré dans votre code, c’est justement cela qui me fais douter de l’emplacement de cette fonction.
- Vous dites que la variable « $category » définit le nom de la catégorie, mais est-il possible de jouer sur plusieurs catégories ? Avec un « array() » par exemple !? Sinon, faut-il mettre réellement le nom ou l’ID de la categorie ?
- La variable « mt_keywords » dans le tableau, permet de définir le meta-field « keyword », je suppose ? Est-ce utilisable pour d’autre meta-fields, tel que mt_blabla1, mt_blablabla2, etc…?
6 juillet 2009 @ 14:33
Autant pour moi: « $rpurl » est bien indiqué dans le script, il avait échappé au moteur de Chrome. Toutefois, les autres questions restes sans réponses. Merci d’avance pour votre réponse.
6 juillet 2009 @ 14:56
désolé j’ai oublié de répondre
en fait $rpurl en general c’est ton_blog/xmlrpc.php
je suis pas certain, bien que j’adore ton pseudo, que tu ais tout bien saisi sinon : il n’y a rien a modifier dans le code de ton wordpress hein.
concernant les categories, c’est evident que oui on peut en passer plusieurs puisque dans le script je passe un array($category), il faut juste modifier un peu la fonction si on veut pouvoir passer plusieurs categories (soit on passe direct le tableau, soit par exemple une chaine de caracteres avec les cats separees par des virgules)
pour mt_keyword non cela n’a rien a voir avec la balise meta mais correspond aux tags wordpress associes a un article. apres tu peux toujorus avoir un plugin qui les fout en balise meta keyword aussi, mais ca c’est autre chose.
6 juillet 2009 @ 19:38
Ok, merci de ta réponse
Tu aime mon pseudo comme j’aime ton ndd (domaine)
C’est bien un pseudo veridique, en fait c’est le nom de l’un de mes projet xXX, donc pas de soucis la dessus, je ne suis pas un spammer fou.
En fait, c’est la première fois que j’utilise CURL et je viens de me rendre compte que Dreamhost mon hosting ne permet pas de l’utiliser en mutualisé (enfin j’attend encore leur confirmation). SNIF!!!
Tu ne connaitrerais pas une autre solution pour envoyer un contenu dans la bdd de wordpress.
En fait le truc c’est que j’ai un projet (un peu à la manière d’un moteur de recherche « bot ») qui devrait préalablement crawler des données sur Internet, pour ensuite les insérées dans la bdd pour ensuite être affiché.
J’ai essayé de le faire en PHP, mais impossible d’envoyer des variables en POST sans CURL. Et quand bien même pour cela faudrait connaitre les écritures SQL que Wordpress fait, une fois le formulaire (new post) envoyé.
Pour bien faire faudrait que je puisse connecter mon scripts PHP directement à wordpress, mais pour cela faudrait que je dispose de ces commande SQL et savoir quoi insérer et ou, tu me suis ?
Une idée ? (si tu as compris mon charabia
)
7 juillet 2009 @ 4:39
curl n’est pas la seule facon d’envoyer un formulaire par post en php, il y a aussi fsockopen ou tu peux utiliser les fonctions fopen et autres avec un stream_context… Voir la doc sur le site PHP…
17 juillet 2009 @ 4:04
Does anyone have any ideas on how to use this code to post values to custom fields? I’m using the following code, and everything works perfectly except for my custom fields: $link and $discount-type.
$title,
‘description’=>$body,
‘mt_allow_comments’=>1, // 1 to allow comments
‘mt_allow_pings’=>1, // 1 to allow trackbacks
‘post_type’=>’post’,
‘mt_keywords’=>$keywords,
‘categories’=>array($category),
‘discount-type’=>$discounttype,
‘link’=>$link
);
$params = array(0,$username,$password,$content,true);
$request = xmlrpc_encode_request(’metaWeblog.newPost’,$params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_URL, $rpcurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
$results = curl_exec($ch);
curl_close($ch);
return $results;
}
?>
19 août 2009 @ 8:43
Please help me explanation for more clearly about these parameter
$rpcurl, $category or please give me some sample
Thanks,
Viet Name
27 septembre 2009 @ 13:27
Intéressant. Merci de l’astuce. T’as un problème avec ton rss, nan?
27 septembre 2009 @ 13:33
Edit: y a un problème si ça vient de mon google reader^^?
5 janvier 2010 @ 15:34
Merci pour un tres bon article, c’est vraiment un bon fonction.
6 janvier 2010 @ 9:44
[...] sure that the CURL and standard xmlrpc libraries are activated on your server first: –> Initial Source (in French) –> in English (but less [...]
9 février 2010 @ 7:31
hey…
earlier I was able to work it properly but after changed my hosting it ’s not working..
it’s showing faultCode 403 faultString Bad login/pass combination.
there is all detail is correct I dont’ know wht’s prob there
Can you help me out??
you can contact me on vora.aslam1 AT Gmail DoT com
13 février 2010 @ 6:19
I’ve got error:
Fatal error: Call to undefined function xmlrpc_encode_request() in posting.php on line 24
28 février 2010 @ 15:20
ça marche mieux en remplaçant les guillemets simples chez moi:
function wpPostXMLRPC($title,$body,$rpcurl,$username,$password,$category,$keywords,$encoding)
{
$title = htmlentities($title,ENT_NOQUOTES,$encoding);
$keywords = htmlentities($keywords,ENT_NOQUOTES,$encoding);
$content = array(
« title »=>$title,
« description »=>$body,
« mt_allow_comments »=>0, // 1 pour autoriser les commentaires
« mt_allow_pings »=>0, // 1 pour autoriser les trackbacks
« post_type »=> »post »,
« mt_keywords »=>$keywords,
« categories »=>array($category)
);
$params = array(0,$username,$password,$content,true);
$request = xmlrpc_encode_request( »metaWeblog.newPost »,$params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_URL, $rpcurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
$results = curl_exec($ch);
curl_close($ch);
return $results;
}