wp_schedule_event Exemples + Plus • WPShout

By | septembre 10, 2019

WordPress pas cher

Il y a quelques semaines, nous avons parlé des «tâches cron» présentes dans WordPress et au-delà. Ce tutoriel sur les «tâches planifiées de WordPress» sont J'espère que vous avez bien compris certaines des choses que vous pourriez faire avec eux. Aujourd’hui, nous allons nous concentrer sur Comment vous utiliserez wp_schedule_event de les faire réellement. En d’autres termes, nous allons couvrir un certain nombre d’exemples de tâches WordPress cron.

À un niveau élevé, cela signifie que nous en viendrons à comprendre la wp_schedule_event fonction, et voir comment nous pouvons l’utiliser et quelques autres fonctions utiles pour utiliser WP-Cron dans un plugin WordPress. Nous examinerons également brièvement le plug-in très utile de WP cron pour savoir si / quand vos tâches planifiées pour WordPress seront exécutées. Allons-y.

Actualisation de notre compréhension de WP Cron for Plugins (et plus)

Avant d’arriver à notre exemple WordPress cron, un bref aperçu. Nous appelons la classe générale «résoudre les appels de fonctions» dans l'espace informatique le terme «cron». C'est pourquoi nous voyons souvent des gens se référer au système de planification WordPress comme «WP-Cron» même si ses fonctions membres font référence à Les «événements programmés» de WordPress. Ils concernent tous la même chose: planifier des événements sur un site WordPress.

Pour aider à rendre ce concret, voici quelques choses en utilisant wp_schedule_event sur WPShout lui-même en ce moment:

  • WordPress (noyau) nettoie les brouillons automatiques des articles qui ne doivent plus être conservés
  • Jetpack nettoie ses transitoires (variables temporairement mises en cache) selon un calendrier plus agressif que celui de WordPress.
  • WordPress (noyau) nettoyant les transitoires
  • Yoast SEO planifie quelque chose (je ne sais pas trop quoi) appelé onpage_fetch courir chaque semaine
  • Updraft Plus en cours d'exécution des sauvegardes sur Dropbox

Je pourrais continuer ou nommer un grand nombre d'autres choses similaires. Je pense que cela vous fait commencer à penser quand et pourquoi vous voudrez peut-être atteindre wp_schedule_event toi même. Allons-y donc, comment utilisez-vous cette fonction et les autres pour planifier les tâches exécutées dans WordPress?

Le crochet principal de WordPress Cron: wp_schedule_event

Nous commencerons donc par comprendre comment créer un «travail WP Cron» en comprenant la signature de fonction de wp_schedule_event. Ça ressemble à:

wp_schedule_event ($ timestamp, $ recurrence, $ hook, $ args);

Donc, ces paramètres plus en détail:

  1. $ horodatage est censé être la première fois que vous voulez que l'événement se produise. Donc, la valeur la plus commune soumise ici est l'heure actuelle. Vous obtenez cela en PHP avec le temps() une fonction.
  2. $ récurrence est une valeur de chaîne indiquant quand vous voulez que l'événement soit exécuté. Par défaut, WordPress attend les valeurs horaire, deux fois par jour ou du quotidien. Comme nous allons le montrer dans un instant, vous pouvez faire un wp_schedule_event Les événements enregistrés ont un calendrier différent de ceux-ci, mais ils sont de loin les plus courants.
  3. crochet $ sera la (nom de) la fonction que vous souhaitez que WordPress appelle lors de la réalisation de votre événement. Ceci est une chaîne comme 'updraft_backup' où votre fonction s'appelle updraft_backup.
  4. $ args tout argument que votre crochet $ fonction devra voir quand appelé. Je ne l’ai jamais utilisé, et nous ne le verrons dans aucun exemple, mais il est bon de savoir que vous pouvez les transmettre.

Making wp_schedule_event Daily Exécuter votre fonction

Maintenant que nous savons comment appeler wp_schedule_event, voyons qu’il est utilisé dans le contexte pour programmer une fonction que nous avons composée et appelée wpshout_do_thing courir tous les jours. Dans un plugin, cela pourrait ressembler à:

register_activation_hook (__FILE__, 'wpshout_plugin_activation');

fonction wpshout_plugin_activation () 
    if (! wp_next_scheduled ('wpshout_do_thing')) 
        wp_schedule_event (time (), 'daily', 'wpshout_do_thing');
    

Maintenant, vous pouvez exécuter votre code qui appelle wp_schedule_event un tas de façons. Mais l’un des meilleurs est de le lier à un événement ponctuel, comme l’activation du plug-in. C’est ce que nous faisons ici.

Ensuite, nous nous assurons qu’un événement pour nous n’est pas déjà programmé. Nous verrons cela plus en détail plus tard, mais c'est une bonne pratique pour vous assurer de ne pas organiser votre événement plusieurs fois car quelqu'un essayait, par exemple, votre plug-in et le désactivait de manière excessive. et plus.

Nettoyer après vous-même: wp_clear_scheduled_hook

Si vous avez choisi d’enraciner votre tâche programmée dans le plug-in activé, vous pouvez également vous assurer que votre tâche ne génère pas d'erreur si votre plug-in est désactivé (désactivé). Pour ce faire, vous pouvez supprimer votre événement prévu lorsqu'ils désactivent le plug-in. Cela ressemblerait à:

register_deactivation_hook (__FILE__, 'wpshout_plugin_deactivation');

fonction wpshout_plugin_deactivation () 
    wp_clear_scheduled_hook ('wpshout_do_thing');

Comme vous l'avez peut-être deviné, wp_clear_schedule_hook va juste annuler l'enregistrement du crochet $ ou «nom de la tâche» que vous avez programmé avec un appel à wp_schedule_event.

wp_schedule_event tous les jours à une heure précise

Disons que votre site Web génère le moins de trafic à 3h du matin. Et si vous voulez vos sauvegardes ne pas lorsque le plugin est activé initialement, mais à une heure précise. Dans cet exemple de code de wp_schedule_event, nous viserons 3 heures sur votre serveur. Je ferais ça comme ça:

wp_schedule_event (strtotime ('3 heures demain'), 'quotidien', 'wpshout_do_thing');

La fonction PHP peu de temps signifie "faire de cette chaîne dans un temps." Donc, il retourne le même genre de valeur que temps, mais nous permet d’utiliser une phrase plus anglaise-y. Donc, cette tâche débutera à 3 heures du matin demain matin et pas maintenant. Et puis, parce que nous avons défini le $ fréquence à 'du quotidien', cela devrait se répéter tous les jours à 3h du matin. Inconvénient à prendre en compte: si vos utilisateurs auront eu besoin / ont voulu que cela se produise tout de suite, vous voudrez qu'un autre système le fasse également pour eux. Qui pourrait être wp_schedule_single_event. Mais je veux couvrir un autre exemple avant d'y arriver…

wp_schedule_event toutes les minutes

Donc, WP-Cron a quelques intervalles par défaut vraiment utiles, mais «chaque minute» n’est pas celui qu’il offre. Il y a beaucoup de raisons à cela. Principalement ces deux:

  • Courir à la tâche chaque minute peut ajouter beaucoup de frais généraux sur votre serveur.
  • Exécuter une tâche chaque minute est un peu en contradiction avec le besoin de visites qui rend WP-Cron un peu peu fiable pour les sites à faible trafic. J'ai parlé un peu plus à ce sujet dans mon introduction aux tâches planifiées de WordPress.

Cela dit, il peut y avoir des raisons pour lesquelles vous souhaitez «toutes les minutes» ou un autre intervalle que WordPress ne prend pas en charge pour les intervalles cron prêts à l'emploi. Si vous vous trouvez dans cette situation, cet exemple de code devrait vous aider. D'abord, vous devez déclarer votre intervalle:

add_filter ('cron_schedules', 'wpshout_add_cron_interval');
fonction wpshout_add_cron_interval ($ plannings) 
    $ horaires['everyminute'] = tableau (
            'intervalle' => 60, // temps en secondes
            'display' => 'Every Minute'
    )
    renvoyer les horaires;

Alors voici le WordPress cron_schedules le filtre hook nous transmet un tableau de l'intervalle qu'il connaît. Et nous ajoutons au tableau passé notre intervalle, dans ce cas je l'ai nommé chaque minute.

Ensuite, nous utilisons simplement wp_schedule_eventsachant que notre intervalle, chaque minute, existe (même que le stock du quotidien on fait):

wp_schedule_event (time (), 'everyminute', 'wpshout_do_thing');

Ce système est exactement à quoi il ressemble pour faire toutes sortes d'intervalles personnalisés. Si vous êtes un vrai singe du chaos, vous pouvez même le faire (je ne le recommande pas):

add_filter ('cron_schedules', 'wpshout_add_weird_cron_interval');
fonction wpshout_add_weird_cron_interval ($ plannings) 
    $ horaires['wpshout_random'] = tableau (
            'intervalle' => rand (100, 9999999), // temps en secondes
            'display' => 'Random Interval'
    )
    renvoyer les horaires;

Mais cela créerait le chaos dans vos programmes cron WordPress, donc je ne le recommande pas vraiment.

WP Cron ne fonctionne pas: une préparation conceptuelle

Je l’ai déjà dit et je le répète: WP-Cron n’est pas un "vrai" cron. Il faut que votre site reçoive des visites sur lesquelles WordPress peut intégrer les fonctions que vous planifiez. À cette fin, si WP-Cron ne fonctionne pas comme prévu, vous devrez peut-être «transformer WordPress en un véritable cron». Ce petit tutoriel de SiteGround décrit en détail ce qui se passe.

D'autres puissances, comme Comment planifier une fois dans WordPress?

Jusqu'à présent, nous avons mentionné un certain nombre des principales fonctions de WP Cron, mais je voudrais passer rapidement en revue les autres que vous pouvez rencontrer ou que vous devez connaître un peu plus en profondeur.

Ce qui est wp_schedule_single_event?

Parfois, vous voudrez que votre code d’événement ou prévu ne se produise qu’une seule fois, et «pas maintenant». Comment planifiez-vous l’exécution d’une tâche une fois dans WordPress? Il y a une fonction appelée wp_schedule_single_event pour ça. Comme vous pouvez le deviner, cela vous permet de créer un «travail WordPress cron» qui est unique.

Comme vous pouvez le deviner, cela fonctionne assez wp_schedule_event. wp_schedule_single_event s'appelle juste comme ceci:

wp_schedule_single_event (strtotime ('3 heures demain'), 'wpshout_do_thing');

Vous remarquerez que cet exemple de code pour wp_schedule_single_event a l'air familier. Qu'est ce qui est different? Nous perdons le deuxième «intervalle de récurrence» que vous verrez sur wp_schedule_event. Ce qui est parfaitement logique, parce que _unique_ au nom de la fonction, il est assez clair qu'un $ intervalle n'a pas vraiment de sens. A part ça, tout est assez similaire dans wp_schedule_event et wp_schedule_single_event exemples de code.

DISABLE_WP_CRON?

Admettons donc que vous souhaitiez que WordPress n’exécute jamais ses «tâches cron» lors du chargement de la page. C’est là que le DISABLE_WP_CRON constante entre en jeu. Elle vous permet d’exécuter les tâches cron du site via un appel direct (avec boucle, un navigateur, etc.) à exemple.com/wp-cron.php effectuer les tâches, mais cela signifie qu’il n’ajoutera jamais de travail cron à un chargement de page. Cela rendra les réponses de page qui pourraient avoir été capturées par une tâche cron beaucoup plus rapide.

Pour l'utiliser, vous allez mettre define ('DISABLE_WP_CRON', true); dans ton wp-config.php. Mais ne le fais pas sauf si vous trouvez une autre façon que WordPress peut faire des tâches cron. Si vous ne faites que désactiver cron et ne créez pas de tâche cron réelle (sous Unix, etc.), les tâches planifiées ne seront tout simplement pas exécutées sur votre site WordPress.

Quoi wp_next_scheduled Est-ce que

Nous en avons parlé plus tôt, mais pour récapituler wp_next_scheduled est un moyen de donner un nom à WordPress et de nous dire si ou quand cette tâche sera exécutée ensuite. C'est super utile pour nous de ne pas programmer un nouvel événement quand il y en a déjà un autre prévu pour nous. C’est pourquoi notre façon idéale d’utiliser wp_schedule_event est comme ça:

register_activation_hook (__FILE__, 'wpshout_plugin_activation');

fonction wpshout_plugin_activation () 
    if (! wp_next_scheduled ('wpshout_do_thing')) 
        wp_schedule_event (time (), 'daily', 'wpshout_do_thing');
    

(Parce que l’extrait de code WP-Cron ci-dessus est le même qu’auparavant, je ne l’expliquerai pas vraiment.) Même s’il est intéressant de noter que wp_next_scheduled nous donnera l'heure (époque Unix) à laquelle une tâche sera exécutée si elle se présentait. Donc, vous pouvez aussi l'utiliser pour faire quelque chose comme ça:

$ seconds_until_task_will_run =
    wp_next_scheduled ('wpshout_do_thing') - time (); 

Maintenant, vous pourriez obtenir une valeur négative si wpshout_do_thing n'est pas prévu. Mais je peux voir quelques raisons pour lesquelles vous faites cela. Encore une fois, cela sera obtenu lors de la planification de votre prochaine tâche (en secondes depuis le 1er janvier 1970), puis soustrayez l’heure actuelle.

Plus sur wp_clear_scheduled_hook

Comme ci-dessus, nous avons couvert wp_clear_scheduled_hook un peu déjà. En bref, c’est comme cela que vous vous assurez que vous avez bien nettoyé après vous-même et vos tâches cron du plugin WordPress. Donc, l'extrait de code pertinent d'en haut:

register_deactivation_hook (__FILE__, 'wpshout_plugin_deactivation');

fonction wpshout_plugin_deactivation () 
    wp_clear_scheduled_hook ('wpshout_do_thing');

Comme je l'ai dit, cela efface les tâches. Alors, n’utilisez-le que sur vos propres tâches planifiées, sauf si vous vraiment savoir ce que vous faites.

Afficher les tâches programmées

Une dernière chose importante: comment puis-je confirmer que j'ai utilisé avec succès wp_schedule_event planifier ma tâche dans WordPress?

Comme vous l'avez peut-être discerné, wp_next_scheduled pourrait être utilisé pour faire cela. Mais ce n’est pas le plus facile à utiliser. Au lieu de cela, j’ai beaucoup utilisé et apprécié le plugin WP Crontrol. Comme vous pouvez le deviner, il vous montre toutes les choses pertinentes liées à votre site WordPress. Ce qui facilite grandement le contrôle des tâches cron, ou vous assurez simplement que votre exemple de code WordPress cron a fonctionné. 🤓

Ce que nous avons appris sur wp_schedule_event et WP Cron Jobs en général

Nous espérons donc, avec ce que nous avons dit aujourd’hui, que vous maîtriserez bien les travaux WP cron, comment les planifier, ainsi que quelques autres variables et éléments pertinents dont vous avez besoin. wp_schedule_event est le coeur du système WP Cron. Et tout simplement, les sites WordPress ne fonctionneraient pas sans eux.