Prenez le crontrol des tâches planifiées


Jonathan Buttigieg

Qui suis-je ?


  • Consultant et formateur WordPress.
  • Co-fondateur du plugin de cache WP Rocket.
  • Auteur du mémento "WordPress : Programmation".


Où me trouver ?

Qu'est-ce qu'un cron ?



Un cron est un programme qui permet d’exécuter périodiquement un script.



donc

Un cron est une tâche planifiée.

Les crons par défaut


WordPress possède sa propre mécanique  interne pour exécuter des tâches planifiées.


Vous les utilisez déjà sans le savoir pour : 

  •  la planification d’un article.
  •  les notifications de mises à jour du core, des thèmes et des extensions.
  • envoyer les pingbacks.
  • et plus...


Autres Exemples d'utilisations



On peut imaginer des tâches planifiées comme :

  • Articles auto-générés à l'aide d'un flux RSS.
  • Envoyer une newsletter.
  • Email de relance pour les commandes en attente.
  • Partager les anciens articles sur Twitter.
  • Backup des fichiers et de la BDD.

Comment ça fonctionne ? #1



L'API Cron de WordPress utilise 2 fichiers :

  • wp-includes/cron.php,
    contient l'API.
  • wp-cron.php,
    lance les crons.

Comment ça fonctionne ? #2


Quand un visiteur se rend sur votre site...

  • wp_cron() est lancée depuis le hook init.
  • wp_cron() fait appel à la fonction spawn_cron() pour lancer les crons à déclencher.
  • spawn_cron() vérifie que les crons de WordPress ne sont pas désactivés.
  • spawn_cron() appel le fichier wp-cron.php qui déclenche les crons.

L'api cron de Wordpress


Les fonctions à retenir :

Créer UNE TÂCHE Récursive #1




  1. Vérifier si l’exécution de la tâche n’est pas planifiée avec wp_next_scheduled() .
  2. Si aucune tâche n’est programmée, on lance le mécanisme avec wp_schedule_event().

CRÉER UNE TÂCHE RÉCURSIVE #2




wp_schedule_event() prend 4 arguments :

  • la date à laquelle le script sera exécuté pour la première fois.
  • l’intervalle de temps entre chaque planification.
  • le nom du hook associé à la tâche.
  • les arguments à passer dans le hook

CRÉER UNE TÂCHE RÉCURSIVE #3




Vérification & lancement de la tâche :

if ( ! wp_next_scheduled( 'cron_hook' ) ) {
      wp_schedule_event( time(), 'daily', 'cron_hook' );
}
(code à insérer dans un mu-plugin ou dans le fichier functions.php du thème)

CRÉER UNE TÂCHE RÉCURSIVE #4


Possibilité de lancer la tâche à partir de 3 hooks :
  • init : front & back-end
  • wp : front-end
  • admin_init : back-end

Exemple : une tâche déclenchée uniquement en admin :
add_action( 'admin_init', '__admin_schedule_cron' );
function __admin_schedule_cron() {
    if ( ! wp_next_scheduled( 'cron_hook' ) ) {
        wp_schedule_event( time(), 'daily', 'cron_hook' );
    }
}
(code à insérer dans un mu-plugin ou dans le fichier functions.php du thème)

CRÉER UNE TÂCHE RÉCURSIVE #5



Associer la tâche à une action pour que WordPress puisse déclencher son exécution. 


add_action( 'cron_hook', '__do_cron_script' );
function __do_cron_script() {
      // On insère ici le code qui sera automatiquement exécuté par le cron.
} 
(code à insérer dans un mu-plugin ou dans le fichier functions.php du thème)


PROGRAMMER UNE TÂCHE unique



Remplacer la fonction wp_schedule_event() par wp_schedule_single_event().

if ( ! wp_next_scheduled( 'cron_hook' ) ) {
      wp_schedule_single_event( time(), 'cron_hook' );
}
(code à insérer dans un mu-plugin ou dans le fichier functions.php du thème)

déprogrammer une occurence



wp_unschedule_event() permet d'annuler la prochaine occurrence d'une tâche.

// Get the timestamp for the next event.
$timestamp = wp_next_scheduled( 'cron_hook' );

wp_unschedule_event( $timestamp, 'cron_hook' );

Déprogrammer une tâche



wp_clear_schedule_hook() permet de déprogrammer toutes les occurrences d'une tâche planifiée.

// If you previously added for example
// wp_schedule_single_event( time(), 'cron_hook' );

wp_clear_scheduled_hook( 'cron_hook' );

Les intervalle de temps




Par défaut, il existe que 3 intervalles de temps :

  • une fois par jour
  • deux fois par jour
  • toutes les heures

CRÉER SON PROPRE INTERVALLE DE TEMPS


Utiliser le hook cron_schedules.

Exemple :  une fois par semaine
add_filter( 'cron_schedules', '__add_weekly_cron_schedule' );
function __add_weekly_cron_schedule( $schedules ) {
    $schedules['weekly'] = array(
        'interval' => 604800, // 1 week in seconds
        'display'  => __( 'Once Weekly' ),
    );
 
    return $schedules;
}
(code à insérer dans un mu-plugin ou dans le fichier functions.php du thème)

Les constantes des crons


  • DISABLE_WP_CRON : Permet de désactiver les crons de WordPress.

  • ALTERNATE_WP_CRON : Utilisé quand les articles planifiés ne sont pas publiés en temps voulu.

  • WP_CRON_LOCK_TIMEOUT : Intervalle minimum entre 2 crons WordPress.

  • DOING_CRON : Permet d'indiquer qu'un cron est en cours d'exécution.

Commande cron de WP-CLi



La commande cron de WP-CLI contient 3 sous-commandes  :
  • event
  •  schedule
  • test

Pour plus d'informations : http://wp-cli.org/commands/cron/

Lancer manuellement les crons



Deux possibilités pour lancer les crons manuellement :

  • Utiliser la fonction spawn_cron().
  • Visiter la page wp-cron.php avec l'argument doing_wp_cron
    (ex: geekpress.fr/wp-cron.php?doing_wp_cron).

Les plugins utiles






WordPress est un faux cron.


WTF ?




Un cron est une commande unix.

Mettre en place un cron unix


1- Désactiver les crons de WordPress.

 define( 'DISABLE_WP_CRON', true );
(à insérer dans le fichier wp-config.php)

2- Lancer les commandes 

$ crontab -e$ /15 * * * wget -q -O - http://YOURWEBSITE.COM/wp-cron.php?doing_wp_cron

Différence entre unix et wordpress #1




Ordre d'exécution avec UNIX :

  • Une action se produit à un temps X.
  • La tâche exécute l'action à ce moment là.

Différence entre unix et wordpress #2




Ordre d'exécution avec WordPress :

  • Un visiteur arrive sur le site.
  • WordPress vérifie les tâches planifiées existantes.
  • WordPress exécute les tâches avec une date expirée.

Les avantages de l'api


  • Simple à utiliser.
  • Une API complète.
  • Monotiring possible grâce à des plugins.


Les inconvénients de l'api


  • Déclenchement  qui dépend des visites sur le site.
  • Peut avoir des conséquences sur le temps de chargement du site.




Merci pour votre écoute