08/11/2017 / Samuel

Dans ce tutoriel sur les tâches automatisées dans WordPress, on créera un plugin capable de récupérer les tweets populaires d’un hashtag et de les envoyer par mail chaque heure. On se servira de WP-Cron ainsi que de l’API Twitter.

Intro au WordPress Cron

Si le mot “cron” trouve ses origine dans la Grèce où il signifiait “le temps” (χρόνος) , c’est un terme fréquemment utilisé dans le monde des systèmes Unix. On l’utilise pour parler des tâches qu’on planifie pour s’exécuter à un moment donné dans le future. Généralement, une tâche cron se lance de manière périodique et répétitive, ce qui en fait une fonctionnalité propice aux tâches automatisées.

Dans WordPress, les tâches cron sont utilisées dans plusieurs cas tels que:

  • Vérifier les mises à jour des thèmes et plugins
  • Planifier la publication future des articles
  • Scanner automatiquement son site à la recherche de malware (cas de WordFence par exemple)

Sous le capot, les tâches automatisées utilisent les fonctions WordPress Cron, une ensemble de fonctions qu’on peut trouver dans wp-includes/cron.php. Et pour exécuter les tâches de manière repetitive, WordPress utilise son propre mécanisme pour imiter la fonctionnalité cron des systèmes Unix.

  • Quand un visiteur consulte votre site /wp-settings.php appelle la fonction wp_cron() et vérifie que la fonctionnalité WordPress Cron n’est pas désactivée.
  • Si WordPress Cron est bien activé, le fichier wp-cron.php fait le tour de chaque tâche planifiée et pour chaque tâche, compare le temps de sa prochaine exécution avec le temps actuel.
  • Si le temps de la prochaine exécution est passé ou s’il est égal au temps actuel alors WordPress lance la tâche.

Comme vous l’avez surement remarqué, le mécanisme de WP-Cron repose sur la consultation du site. Il peut être imprécis si l’interval de la tâche est trop court et que votre site recoit peu de visiteurs. Cependant, il existe plusieurs solutions telles que Cavalcade. Nous y reviendrons plus tard.

Maintenant que vous avez une idée générale du fonctionnement des tâches automatisées dans WordPress, commençons à créer notre plugin.

Créer un plugin

Pour le squelette de notre plugin, créez un dossier dans /wp-content/plugins et ajoutez un fichier php. Le nom du dossier doit être en minuscule et sans caractère spécial. Dans notre cas, le plugin aura pour nom Tweety Mail, son dossier tweety-mail et il contiendra un fichier index.php:


--/wp-content
------/plugins
----------/tweety-mail
-----------------/index.php

Ensuite, dans l’entête du fichier php insérez le bloc de commentaire ci-dessous. Pour faire simple, cette partie sera la “carte d’identité” de notre plugin et permettra à WordPress de l’identifier.

<?php
/**
 * Plugin Name: Tweety Mail
 * Plugin URI: https://github.com/samuelguebo/tweety-mail
 * Description: Cette extension récupère les tweets populaire d'un hashtag et les envoie par mail
 * Version: 0.0.1
 * Author: Samuel Guebo
 * Author URI: https://github.com/samuelguebo
 * Text Domain: tml
 * License: GPL3
 */
 ?>

 
Si vous avez correctement suivi les étapes précédentes, votre plugin devrait apparaître dans la liste des extensions de votre Tableau de bord WordPress.

Une tâche automatisée simple

Pour que notre tâche se répète périodiquement, nous devons créer une nouvelle action WordPress, et ensuite, y “accrocher” notre fonction qui récupère les tweets et envoie les mails. S’il vous faut une révision sur action_hooks dans WordPress, consultez mon précédent article sur les Action hooks dans WordPress.

Nous créons une nouvelle action et nous ajoutons notre fonction comme callback de cette action. On fait d’une pierre deux coups :


// On crée la nouvelle action 'tml_action' et on lui accroche la fonction tml_task() comme callback
add_action('tml_action', 'tml_task') ;

 
Maintenant ajoutons le code de notre fonction tml_task(). Pour l’instant la fonction tml_task envoie l’heure actuelle par e-mail à l’administrateur avec un simple objet. On utilisera cela comme squelette pour la phase suivante où l’heure actuelle sera remplacée par les tweets populaires.


// La fonction callback pour l'envoie du mail
function tml_task (){
        
	// On prépare le mail
    $object   = "Current time: " . date("h:i:s") ;
    $to  = get_bloginfo('admin_email');
	$headers[] = "From: " .get_bloginfo('title'). " <$to>";

	$message = "It's exactly : " . date("h:i:s");
	
	// On l'envoie avec la fonction wp_mail()
	wp_mail( $to, $object, $message, $headers );

        
}

 
Planifions notre tâche à présent


// On vérifie que tml_action n'est pas déja planifié
if( !wp_next_scheduled( 'tml_action' ) ) {

	// On planifie tml_action pour se repéter chaque heure
	wp_schedule_event( time(), 'hourly', 'tml_action' );
}

 

On s’est servi de wp_next_scheduled() pour s’assurer que c’est la première fois qu’on planifie notre tâche. Quand ça c’est vérifié, on procède à la planification avec la fonction wp_schedule_event(). wp_schedule_event() prend plusieurs paramètres:

  • int $timestamp: le moment où la tâche sera planifiée. On a utilisé time() pour avoir le timestamp de l’heure actuelle.
  • string $recurrence: c’est l’interval pour la répétition de la tâche. Par default WordPress offre les valeurs suivantes: hourly (chaque heure), twicedaily (chaque 12 heures) et daily (quotidiennement).
  • string $hook: l’action hook à exécuter. On indique tml_action, l’action hook qu’on a défini plus tôt

 

Améliorer le code

    Au point où nous en sommes, notre code est fonctionnel mais pas optimal. Quelques problèmes peuvent survenir:

  • Si le plugin est désactivé, la tâche sera toujours enregistrée. Elle ne se lancera pas mais ça gaspillera tout de même de la ressource.
  • Vous l’avez probablement remarqué, à chaque fois le plugin vérifie si notre action hook est planifié. C’est aussi du gaspillage de ressources.

On peut apporter quelques améliorations:

  • Retirer automatiquement la tâche cron quand le plugin est désactivée pour économiser de la ressource:
  • Vérifier et plannifer notre tâche une fois pour toute au moment où le plugin est activé, au lieu de faire cette opération à chaque chargement de la page.

Il nous faut créer deux fonctions tml_activation() et tml_deactivation(). Comme leur nom le suggère, ce sont des fonctions que nous appellerons respectivement lors de l’activation du plugin et lors de sa désactivation. Ensuite, il nous faudra accrocher ses deux fonctions aux actions WordPress register_action_hook() et register_deactivation_hook().


// Les action hooks pour l'activation et la désactivation du plugin
register_activation_hook( __FILE__ , 'tml_activation' );
register_deactivation_hook( __FILE__ , 'tml_deactivation' );

// Callback quand le plugin est activé
function tml_activation() {
    if( !wp_next_scheduled( 'tml_task' ) ) {
    	wp_schedule_event( time(), 'hourly', 'tml_task' );
	}
}

// Callback quand le plugin est désactivé
function tml_deactivation() {
	// Action when the plugin deactivated
    wp_clear_scheduled_hook( 'tml_task');
}

 

Le code complet

 

<?php
/**
 * Plugin Name: Tweety Mail
 * Plugin URI: https://github.com/samuelguebo/tweety-mail
 * Description: Cette extension récupére les tweets populaire d'un hashtag et les envoie par mail
 * Version: 0.0.1
 * Author: Samuel Guebo
 * Author URI: https://github.com/samuelguebo
 * Text Domain: tml
 * License: GPL3
 */
 
 
// Les action hooks pour l'activation et la désactivation du plugin
register_activation_hook( __FILE__ , 'tml_activation' );
register_deactivation_hook( __FILE__ , 'tml_deactivation' );

// Callback quand le plugin est activé
function tml_activation() {
    if( !wp_next_scheduled( 'tml_task' ) ) {
    	wp_schedule_event( time(), 'hourly', 'tml_task' );
	}
}

// Callback quand le plugin est désactivé
function tml_deactivation() {
	// Action when the plugin deactivated
    wp_clear_scheduled_hook( 'tml_task');
}

// La fonction callback pour l'envoie du mail
function tml_task (){
        
	// On prépare le mail
    $object   = "Current time: " . date("h:i:s") ;
    $to  = get_bloginfo('admin_email');
	$headers[] = "From: " .get_bloginfo('title'). " <$to>";

	$message = "It's exactly : " . date("h:i:s");
	
	// On l'envoie avec la fonction wp_mail()
	wp_mail( $to, $object, $message, $headers );

        
}
?>

 
C’est bon pour cette première partie. Vous pouvez activer votre plugin.
 

Consulter et gérer les tâches cron

Pour vérifier que votre tâche a été planifiée avec succès vous pouvez installer l’extension WP-Control plugin. Ce outil très pratique permet de consulter toutes les tâches planifiées de votre site WordPress. Vous pouvez facilement les modifier ou les supprimer.

 

Conclusion

Désormais, vous savez comment mettre en place une tâche automatisée simple dans WordPress en utilisant WP-Cron. Dans la prochaine partie de ce tutoriel on enrichira notre code en utilisant l’API Twitter pour récupérer les tweets populaires à partir d’un hashtag. Dans le cadre de ce tutoriel, le code du plugin est disponible sur Github.

Facebook Comments