web-dev-qa-db-fra.com

Exécuter ma fonction une fois à une heure précise

Sur notre site WordPress, nous utilisons le plugin Events Manager Pro. Cela nous permet de créer des événements. Cependant, nous devons en quelque sorte envoyer un courrier électronique de remerciement aux personnes présentes un jour après la date de fin de l'événement.

J'ai déjà écrit ceci:

add_action( 'em_bookings_added', 'mail_after_completion' );
function mail_after_completion (){

global $wpdb;

/*Get the email of who booked */
$person_id = $wpdb->get_var("SELECT person_id FROM mbc_em_bookings ORDER BY booking_date DESC LIMIT 1");
$person_email = $wpdb->get_var( $wpdb->prepare("SELECT user_email FROM mbc_users WHERE ID = %s",$person_id));

/*Get the event finish date */
$event_id = $wpdb->get_var("SELECT event_id FROM mbc_em_bookings ORDER BY booking_date DESC LIMIT 1");
$event_end_date = $wpdb->get_var( $wpdb->prepare("SELECT event_end_date FROM mbc_em_events WHERE event_id = %s",$event_id));


/*Send E-mail to the person who just booked */


    $to = '$person_email';  
    $subject = "Thank you for attending";
    $content = "Thank you for attending the event at $event_end_date";
    $status = wp_mail($to, $subject, $content);

    }
 ?>

Cette fonction envoie un courrier électronique à une personne chaque fois qu'elle réserve un événement. Cependant, j'aimerais que cela se produise un jour après la fin de l'événement. J'ai beaucoup étudié CRON et wp_schedule_single_event() mais je n'arrive pas à comprendre comment l'utiliser correctement.

Si quelqu'un pouvait nous éclairer, cela serait grandement apprécié.

Sincères amitiés!

1
Rick Spanjers

En résumé, vous avez votre fonction, vous la rattachez à une action, puis vous dites à WordPress de déclencher cette action à un moment déterminé. Les horaires intégrés qui vous sont disponibles sont:

  • hourly
  • twicedaily
  • daily

Si vous vouliez déclencher votre événement toutes les heures , vous feriez quelque chose comme ceci:

<?php

wp_schedule_event(time(), 'hourly', 'em_bookings_added');

Si vous souhaitez qu'une tâche soit exécutée à une heure spécifique , vous pouvez simplement passer un horodatage Unix comme premier argument:

<?php

$future_time = mktime(10,0,0,30,9,2016); // 2016-09-30 10:00:00 UTC
wp_schedule_event($future_time, 'hourly', 'em_bookings_added');

Si vous avez des arguments à transmettre à votre action, vous pouvez les transmettre en tant que quatrième argument.

Vous pouvez également spécifier une heure que vous souhaitez exécuter votre action - c'est le premier argument. Toutefois, sachez que WordPress cron repose sur les personnes visitant le site pour s'exécuter et qu'il n'est pas aussi précis qu'un vrai travail cron; aucun visiteur == aucun cron en cours d'exécution.

Une solution consiste à définir un travail cron sur votre propre serveur pour déclencher wp-cron.php manuellement:

Extrait de l'article génial de Tom McFarlin sur WordPress

// wp-config.php
define('DISABLE_WP_CRON', true);  

// in your crontab
/15 * * * wget -q -O - http://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Plus d'informations sur https://codex.wordpress.org/Function_Reference/wp_schedule_event

1
FaCE