[Script] - Interroger et manipuler Wordpress directement via un script PHP en crontab

WRInaute discret
Salut à tou(te)s,

Voilà, j'ai un projet de blog sous Wordpress, et j'ai un besoin assez particulier...

J'aimerais dans mon thème afficher une info présente dans un champ personnalisé "myKey".
Jusque là pas de soucis, il suffit a priori d'utiliser "get_post_meta()" avec "myKey" en paramètre, à l'endroit souhaité dans mon thème...

Par contre, j'aimerais que ce champ personnalisé soit mis à jour automatiquement toutes les nuits pour tous mes articles, avec des données récupérées via une API externe (de Google pour ne pas le nommer) qui me renvoie du JSON...

Je pensais donc faire un petit script unix, ajouté en crontab (j'ai vu que chez OVH en hébergement mutualisé c'était possible) pour mettre à jour mes champs personnalisés (avec "update_post_meta()")

Donc un truc du style :
Code:
#!/usr/local/bin/php
<?php

// 1 - Importer ce qu'il me faut pour pouvoir utiliser WP et manipuler sa BDD

// 2 - Récupérér la liste des IDs de tous mes articles (éventuellement d'un catégorie spécifique)

// 3 - Itération sur chaque ID d'article de la liste :

    // 3a - Appel API JSON et récupération de données à attacher à mon article

    // 3b - Mise à jour du champ personnalisé "myKey" de l'article avec les données récupérées : utilisation de "update_post_meta($post_id, $meta_key, $meta_value);"
?>

Pensez-vous que c'est possible ?

Si oui, comment réaliser toutes ces étapes (surtout 1 et 2 donc, puisque la 3 c'est plus mon domaine) ?

Merci par avance pour votre aide, je sais qu'il y en a "qui tâtent" avec Wordpress ici, donc j'espère que vous pourrez m'aider !
:)

Bonne journée et à bientôt !
 
WRInaute accro
Je ne vois pas trop ce que tu veux dire pour le "1", l'exemple du siteduzero me semble clair :)

1 - tu te connectes à la base de données (php de base)
2 tu fais ta sélection
select * from postmeta (comme ça tu as l'id, et tout)
Si éventuellement tu veux filtrer sur la catégorie, c'est un peu plus complexe il faut faire un left join sur postmeta.post_id et term_relationships.object_id , puis filtrer sur term_relationships.object_id

Ensuite tu fais directement un update dans la base de la ligne de postmeta, pour ce genre d'opération, si tu es sûr de tes sources de données (pas d'injection sql par exemple ^^) pas besoin de passer par les fonctions wordpress
 
WRInaute discret
... oui c'est sur je me complique peut être la tâche tu as raison...

Je voulais passer par les méthodes de WP par simplicité d'utilisation pour la connexion à ma base et éviter de faire des requêtes SQL directes sur ma base... donc éviter de faire des conneries, car je suis vraiment une bille en SQL ! :)

Bon après ce que je veux faire en effet doit pas être compliqué au niveau requêtes, c'est l'occasion de s'y mettre !

Mais en effet, charger la base de WP pour utiliser 2 pauvres fonctions de mise à jour des customFields, c'est peut être un peu "lourd" !

Merci pour ton retour en tout cas, je reviendrai poster éventuellement ici si j'ai des soucis ou des précisions à apporter !

A+
 
WRInaute accro
En fait tu confonds "charger la base" et "activer l'ensemble des fonctionnalités et classes wordpress"

Charger la base, c'est simplement le "connect"
 
WRInaute discret
Salut !

Bon, comme je suis vraiment une quiche en SQL, j'ai persévéré dans mon idée... comme quoi l'acharnement paie ! :)

J'ai en fait analysé le code de chargement de wordpress, et essayé avec ce qui me paraissait le plus "light" permettant de charger le "coeur" de Wordpress pour mes besoins

Il suffit donc d'importer le "wp-load.php" de Wordpress avant de pouvoir utiliser ses fonctions de manipulation.

PHP:
<span class="syntaxhtml"><br />#!/usr/local/bin/php<br /><span class="syntaxdefault"><?php<br />  </span><span class="syntaxcomment">// 1 - Importer ce qu'il me faut pour pouvoir utiliser WP et manipuler sa BDD<br /></span><span class="syntaxdefault">  require_once</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> dirname</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">__FILE__</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">.</span><span class="syntaxdefault"> </span><span class="syntaxstring">'/wp-load.php'</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  <br />  </span><span class="syntaxcomment">// 2 - Récupérér la liste des IDs de tous mes articles (éventuellement d'un catégorie spécifique)<br /></span><span class="syntaxdefault">  $args </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> array</span><span class="syntaxkeyword">(<br /></span><span class="syntaxdefault">      </span><span class="syntaxstring">'category_name'</span><span class="syntaxdefault">   </span><span class="syntaxkeyword">=></span><span class="syntaxdefault"> </span><span class="syntaxstring">'ma_categorie'</span><span class="syntaxkeyword">,<br /></span><span class="syntaxdefault">      </span><span class="syntaxstring">'post_type'</span><span class="syntaxdefault">       </span><span class="syntaxkeyword">=></span><span class="syntaxdefault"> </span><span class="syntaxstring">'post'</span><span class="syntaxkeyword">,<br /></span><span class="syntaxdefault">      </span><span class="syntaxstring">'post_status'</span><span class="syntaxdefault">     </span><span class="syntaxkeyword">=></span><span class="syntaxdefault"> </span><span class="syntaxstring">'publish'</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  $myposts </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> get_posts</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> $args </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  <br />  <br />  </span><span class="syntaxcomment">// 3 - Itération sur chaque ID d'article de la liste :<br /></span><span class="syntaxdefault">  foreach</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> $myposts as $post </span><span class="syntaxkeyword">){</span><span class="syntaxdefault">   <br />    </span><span class="syntaxcomment">// 3a - Appel API JSON et récupération de données à attacher à mon article<br /></span><span class="syntaxdefault">    </span><span class="syntaxcomment">// Récupération d'un customField de mon article saisi à la main et qui me sert de clé pour mon API<br /></span><span class="syntaxdefault">    $myApiKey </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> get_post_meta</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$post</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">ID</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'myApiKey'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> true</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    if</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> isset</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$myApiKey</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">){<br /></span><span class="syntaxdefault">      </span><span class="syntaxcomment">// Appel du webservice de l'API Google par exemple avec ma clé, et analyse du résultat JSON pour extraire ma donnée recherchée<br /></span><span class="syntaxdefault">      $dataAPI </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> getDataAPI</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$myApiKey</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">      </span><span class="syntaxcomment">// 3b - Mise à jour du champ personnalisé "myApiData" de l'article avec les données récupérées<br /></span><span class="syntaxdefault">      update_post_meta</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$post</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">ID</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'myApiData'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $dataAPI</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">  </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">?><br /></span></span>

Ca fonctionne pour mon besoin, et ça permet de faire pas mal de trucs sur Wordpress via un script.
Pour le moment j'ai juste testé "en ligne" via une exécution par URL (donc en commentant la première ligne).
Je vais essayer ce soir de le planifier dans mon manager OVH pour exécution via shell + crontab.

Je vous dirai si je confirme que ça fonctionne également...

A+
 
WRInaute discret
Pour info, testé hier soir d'ajouter mon script au planificateur de tâches OVH, et ça fonctionne nickel !

Attention, bien nommer son script "monscript.php" et donner le chemin complet depuis "www" dans le manager OVH.

Voilà, en espérant que ça pourra aider du monde un jour ! :)

Et merci à Marie-Aude pour ses conseils.
A+
 
Discussions similaires
Haut