Выполнение моей функции один раз в определенное время


На нашем веб-сайте WordPress мы используем плагин Events Manager Pro. Это позволяет нам создавать события. Однако нам нужно каким-то образом отправить электронное письмо с благодарностью присутствующим людям через 1 день после даты окончания мероприятия.

Я уже написал это:

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);

    }
 ?>

Эта функция отправляет электронное письмо человеку всякий раз, когда он бронирует мероприятие. Однако я бы хотел, чтобы это произошло через 1 день после завершения мероприятия. Я много изучал CRON и wp_schedule_single_event(), но, похоже, не могу выясните, как правильно его использовать.

Если бы кто-нибудь мог пролить некоторый свет на это, мы были бы очень признательны

С уважением!

Author: butlerblog, 2016-09-26

1 answers

Итак, суть в том, что у вас есть ваша функция, вы подключаете ее к действию, а затем приказываете WordPress запустить это действие в определенное время по расписанию. Встроенные расписания, которые вам доступны, следующие:

  • hourly
  • twicedaily
  • daily

Если бы вы хотели запускать свое мероприятие каждый час, вы бы сделали что-то вроде этого:

<?php

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

Если вы хотите, чтобы задача выполнялась в определенное время, вы можете просто передать unix метка времени в качестве первого аргумента:

<?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');

Если у вас есть какие-либо аргументы, которые вы хотите передать своему действию, вы можете передать их в качестве четвертого аргумента.

Вы также можете указать время, когда вы хотели бы, чтобы выполнялось ваше действие - это первый аргумент. Однако, пожалуйста, имейте в виду, что cron WordPress для запуска зависит от людей, посещающих сайт, и не так точен, как настоящая работа cron; нет посетителей == нет запуска cron.

Однако один из способов обойти это - установить задание cron на вашем собственном сервере для запуска wp-cron.php вручную:

Взято из потрясающей статьи Тома Макфарлина о WordPress cron

// 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

Подробнее см. в https://codex.wordpress.org/Function_Reference/wp_schedule_event

 1
Author: FaCE, 2016-09-26 11:24:32