Créer vos tâches cron dans WordPress

Lancer les tâches cron de WordPress

Dans cet article nous allons voir comment lancer ses propres taches via le cron de WordPress. Mais avant, il peut être utile d’affiner la manière dont le CMS les lance.

Il existe de nombreux articles sur le net au sujet du cron de WordPress. Ils expliquent tous très bien comment paramétrer correctement WordPress. Le sujet de l’article étant la création de tâches cron et non leurs lancements, vous aurez ici simplement la version courte. Si vous souhaitez approfondir le sujet, je vous conseille notamment Le Cron WordPress : Problèmes Et Solutions de @100son_net qui est très bien.

Par défaut, WordPress cherche à chaque visite si une tâche de cron doit être réalisée. Si c’est le cas il la lance. Nous allons stopper ça pour ne lancer les tâches seulement sur appel spécifique du cron.

Pourquoi désactiver le système automatique ?

L’intérêt est multiple :

  • Dans le cas où vous avez peu (très peu) de visites, les tâches sont tout de même exécutées à temps.
  • Si au contraire vous avez un grand nombre de visiteur, la charge du serveur se trouve allégée puisqu’il ne se concentre plus que sur les requêtes utilisateurs.
  • Dans certains cas, cela permet d’éviter les erreurs de publication des articles planifiés (panification manquée)

Le paramétrage WordPress

Pour une install WP classique

define('DISABLE_WP_CRON', true);

A placer dans le wp-config.php, cette commande désactive l’exécution automatique du cron de WordPress.

Pour une install Bedrock

DISABLE_WP_CRON=true

A mettre dans le .env. La surcouche Bedrock créera la constante DISABLE_WP_CRON pour WordPress.

Le paramétrage serveur

On peut appeler le cron WP de deux façons : via une requête http(s) ou en exécutant un script php. Dans les 2 cas il suffit d’ajouter une tâche cron sur le serveur.

Via une requête http(s)

*/10 * * * * user wget https://example.org/wp-cron.php > /dev/null

Vous pouvez bien sûr utiliser curl à la place de wget.

Via l’exécution php

*/10 * * * * user php /path/to/wp-cron.php > /dev/null

L’exécution des scripts en utilisant directement php sans passer par apache ou Nginx permet souvent de s’affranchir des timeouts et autres restrictions exécutions pour les tâches un peu exigeantes.

Les deux exemples lancent les tâches toutes les 10 minutes avec l’utilisateur système user. Il peut être intéressant de lancer les tâches avec l’utilisateur apache ou Nginx (www-data) pour éviter les conflit de droits d’écriture de fichiers.

Ajouter une tâche au cron de WordPress

L’ajout d’une tâche passe par 2 étapes. La première est la mise en place d’un hook exécuté pérodiquement. La seconde et l’ancrage de notre script sur ce hook.

Création du hook

L’enregistrement de notre hook doit être fait une seule fois. Le CMS s’en souviendra. Le plus simple est d’utiliser les hooks d’activation et de désactivation des plugins.

register_activation_hook(__FILE__, 'registerMyPlugin');

ou, si vous utilisez une classe :

register_activation_hook(__FILE__, array($this, 'register'));

On va ensuite utiliser les fonctions wp_next_scheduled et wp_schedule_event respectivement pour vérifier la présence de notre cron et son activation.

if (!wp_next_scheduled('my_cron_task')) {
            wp_schedule_event( time(), 'hourly', 'my_cron_task' );
        }

Il y a 3 fréquences de lancement proposées par défaut dans le CMS :

  • hourly
  • daily
  • twicedaily

Mais vous pouvez paramétrer les vôtres pour plus de finesse.

Enfin, Il faut penser à supprimer cette exécution quand elle n’est plus désirée. Ici à la désactivation du plugin :

register_deactivation_hook(__FILE__, 'unregisterMyPlugin'));

function unregisterMyPlugin() {
        // de-register cron task
        if (wp_next_scheduled('mp_cron_import')) {
            $timeStamp = wp_next_scheduled('my_cron_task');
            wp_unschedule_event( $timeStamp, 'my_cron_task');
        }
    }

Utilisation du hook

Là c’est super simple (si vous connaissez les hook WordPress). Il suffit « d’accrocher » votre fonction au hook.

add_action('my_cron_task', 'myCronTask' );

ou, si vous utilisez une classe :

add_action('my_cron_task', array($this, 'myCronTask'));

Plugin de démo

Et donc, ce que vous attendez depuis le début de l’article : le code complet de création de tâches WordPress.

Il est présenté sous forme de plugin pour avoir un script fonctionnel. Il suffit de copier ou de forker tout ça et c’est parti. Bon dev !

Une petite mise en garde qui peut vous faire gagner du temps

Attention à WP_Query !

Attention, pour une raison que je n’explique pas, WP_Query fonctionne bizarrement. En particulier, les requêtes utilisant les posts metas renvoient des valeurs incohérentes. Mais seulement lors de l’appel via la tache cron. La solution pour régler le problème : Utilisez get_posts() à la place.

Bon dev !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *