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 ?
-
Blog : http://www.geekpress.fr
- Twitter : @geekpressfr
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
- Vérifier si l’exécution de la tâche n’est pas planifiée avec wp_next_scheduled() .
- 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' );
}
}
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' );
}
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;
}
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 );
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
-
Blog : http://www.geekpress.fr
- Twitter : @geekpressfr
- Slides : http://bit.ly/1m5dp2s
Prenez le Crontol des tâches planifiées
By Jonathan Buttigieg
Prenez le Crontol des tâches planifiées
- 10,329