Le but
Je souhaite utiliser wp_schedule_single_event( )
pour exécuter un événement unique qui m'envoie un e-mail 8 minutes après que l'utilisateur a soumis un formulaire.
Le problème
Le code suivant est dans mon functions.php
:
function nkapi_send_to_system( $args ) {
wp_mail( 'xxx', 'xxx', $args );
}
add_action( 'nkapi_send', 'nkapi_send_to_system' );
function schedule_event( $id ) {
wp_schedule_single_event( current_time( 'timestamp' ) + 480, 'nkapi_send', array( $id ) );
}
Et le code suivant est utilisé pour appeler schedule-event
:
schedule_event( $_SESSION['insert_id'] ); // the $_SESSION var contains an INT
Après avoir attendu plus de 8 minutes, il n'y avait pas d'e-mail dans ma boîte de réception.
Ce que j'ai essayé
Avec le plugin Core Control, il est possible de voir quels travaux cron sont planifiés.
Après quelques changements, j'ai réussi à les obtenir tout à fait correctement, et mieux, lorsque je clique sur "Exécuter maintenant", je reçois en fait un e-mail dans ma boîte de réception.
Mais pourquoi le cron ne s'exécute pas lorsque je visite mon site après 8 minutes. Qu'est-ce qui ne va peut-être pas avec ce code? Je dois dire que c'est la première fois que j'utilise WP Cron.
J'ai essayé plus
Après le commentaire de vancoder, j'ai décidé de tester si le code fonctionne si je mets le code suivant directement dans le functions.php
:
function schedule_event( $id ) {
wp_schedule_single_event( time(), 'nkapi_send', array( $id ) );
}
if ( isset( $_SESSION['insert_id'] ) ) {
if ( ! array_key_exists( 'insert_scheduled', $_SESSION ) || $_SESSION['insert_scheduled'] != $_SESSION['insert_id'] ) {
schedule_event( $_SESSION['insert_id'] );
$_SESSION['insert_scheduled'] = $_SESSION['insert_id'];
}
}
L'inconvénient de ce code est que l'utilisateur doit aller sur une autre page avant l'exécution de ce code. Mais d'un autre côté, cela ne fonctionne pas non plus, ce ne serait donc pas mon premier problème ...
schedule_event( $_SESSION['insert_id'] );
tiré?schedule_event( )
, disons en haut du fichier inclus chargé par le shortcode.Réponses:
Pouvez-vous d'abord confirmer que vous n'avez activé aucun plug-in de mise en cache? Les plugins de mise en cache peuvent interférer avec les tâches cron car vos visiteurs ne reçoivent pas une page en direct mais une version mise en cache de votre page.
Si un plugin de mise en cache est activé, vous pouvez choisir l'une de vos pages, ajouter une exclussion aux paramètres de votre plugin de mise en cache pour cette page afin qu'elle ne soit jamais mise en cache.
Ensuite, vous devrez créer manuellement un travail cron (en utilisant cpanel si vous êtes dans un environnement d'hébergement partagé ou depuis le terminal s'il s'agit d'un serveur VPS / dédié) qui visitera cette page toutes les quelques minutes.
J'espère que ça aide!
la source
Tout d'abord, définissez vos plannings de tâches cron personnalisés.
add_filter('cron_schedules', array($this, 'cron_schedules'));
Vous devez décider où et quand planifier réellement l'événement.
Voici juste un exemple d'extrait de code, qui effectue un appel à une méthode de classe personnalisée:
Voici le code qui planifie réellement l'événement:
Maintenant, tout ce que vous devez faire est d'appeler le nom de votre tâche cron personnalisée. Dans cet exemple, le nom de la tâche cron est
custom_imap_import
.add_action('custom_imap_import', array($this, 'do_imap_import'));
Donc, dans cet exemple,
$this->do_imap_import();
est appelé toutes les 30 minutes (en supposant que vous avez suffisamment de trafic vers votre site Web).Remarques
Nécessite une visite de la page pour que votre cron se déclenche aux bons moments.
Exemple: si vous avez planifié une tâche à des intervalles de 30 minutes, mais que personne ne visite votre site pendant 4 heures, votre tâche cron ne sera pas déclenchée tant que ce visiteur ne viendra pas sur votre site 4 heures plus tard. Si vous avez vraiment vraiment besoin que votre tâche soit exécutée toutes les 30 minutes, il est conseillé de configurer un travail cron légitime via votre fournisseur d'hébergement Web pour visiter votre site Web aux intervalles souhaités.
Les tâches cron WordPress ne ralentissent pas votre site Web!
Peut-être que vous pensez que si le cron-script prend beaucoup de temps pour être exécuté, les visiteurs devront-ils attendre que le script soit exécuté. Nan! Comment est-ce possible? Si vous regardez le
wp-cron.php
fichier, vous trouverez une ligneignore_user_abort(true);
C'est un
php.ini
configuration qui définit que si vous arrêtez de charger le site / script, le script ne cessera pas de s'exécuter.Si vous regardez le
wp-includes/cron.php
fichier, vous trouverez une ligne comme celle-ci:Cela signifie que WordPress attendra que 0,01 seconde pour déclencher l'exécution alors il abandonnera , mais que vous avez défini
ignore_user_abort
autrue
script sera l' exécution. Cette fonctionnalité est un énorme avantage pour exécuter de gros scripts dans des tâches cron WordPress.Fonctions disponibles pour l'aide:
wp_schedule_event
wp_schedule_single_event
wp_clear_scheduled_hook
wp_next_scheduled
wp_unschedule_event
wp_get_schedule
la source
WP_Cron
utilise GMT sous le capot, comme le reste de WP, il serait donc préférable de planifier le premier événement autime()
lieu decurrent_time()
.WordPress Cron vous permet de planifier des tâches, mais elles ne s'exécuteront qu'en cas de demande adressée au site. Pour chaque demande reçue par WordPress, il vérifiera s'il y a des tâches cron à traiter et, si tel est le cas, déclenche une demande
/wp-cron.php?doing_wp_cron
de traitement asynchrone de la tâche. Si le démarrage planifié d'un travail passe sans demande, le processus cron ne sera pas démarré.Comme vous pouvez voir et exécuter vos travaux planifiés, il est possible qu'aucune demande ne déclenche le démarrage du travail cron, surtout si vous utilisez un plug-in de mise en cache. La meilleure option pour décharger cela sur un calendrier plus régulier est de désactiver la vérification par défaut dans WordPress et de l'utiliser
crontab
.Tout d'abord pour désactiver la vérification par défaut (ce qui peut aider un peu avec les performances côté client), ajoutez ce qui suit à
wp-config.php
:Ensuite, vous créez une tâche pour récupérer la
wp-cron.php
page une fois par minute pour traiter les travaux sur le back-end, à partir de la ligne de commande, entrezcrontab -e
, puis ajoutez une ligne qui ressemble à ceci:la source
doing_wp_cron=$(date +\%s.\%N)
pour empêcher cela.Vérifiez que DISABLE_WP_CRON n'est pas défini dans votre configuration.
À défaut, essayez de désactiver tous les plugins (sauf le contrôle du cœur - bien que j'utiliserais wp-crontrol) et voyez si vos travaux principaux fonctionnent. S'ils le font, vous rencontrez des interférences de plugins quelque part.
De même, essayez de passer à un thème standard de vingt ans.
Si aucun de ces éléments ne fait la différence, il est probable que ce soit un problème d'hébergement.
la source
DISABLE_WP_CRON
installé monwp-config.php
, je vais essayer plus de choses et je reviendrai plus tardVérifiez tout plugin qui cache Wordpress.
Comment voir si c'est le problème?
+1. Ne croyez pas les plugins qui "vérifient si cron fonctionne" - par exemple, le plugin WP Cron status checker a montré que cron fonctionne. Mais en fait, ce n'était pas le cas.
Conclusion: s'il s'agit d'une erreur 404 - désactivez a) non seulement la mise en cache des plugins comme d'autres le suggèrent b) mais également tous les plugins qui cachent Wordpress.
la source