Я пытаюсь настроить отдельные одноразовые события расписания в плагине. Что бы я ни делал, я не могу запустить события. Я использую плагин Cron View, чтобы увидеть, что находится в очереди, и события добавляются и удаляются полностью по расписанию. Однако я никогда не получаю электронное письмо, которое я установил для отправки в целевой функции действия (просто для того, чтобы проверить событие, позже там будет больше). Я протестировал функцию вне запланированных событий, она работает. Вот код:
GLOBAL $new_workshop_id;
$new_workshop_id = $wpdb->insert_id;
function send_reminders() {
GLOBAL $new_workshop_id;
wp_mail('my@emailaddress.tld', 'Automatic ID: '.$new_workshop_id, 'here it is!');
}
if (!wp_next_scheduled('send_reminder_emails_'.$new_workshop_id)) {
wp_schedule_single_event( time()+30, 'send_reminder_emails_'.$new_workshop_id );
}
do_action( 'send_reminder_emails_'.$new_workshop_id );
add_action( 'send_reminder_emails_'.$new_workshop_id, 'send_reminders' );
Единственное, что вызывает у меня подозрения, это размещение do_acton и самой функции, send_reminders()
. Вышеприведенный код находится в некоторых операторах if, проверяющих POST-переменные, поэтому возможно, что функция не может быть доступна заданию CRON — так где я должен поместить функцию? Я пробовал прямо в верхней части файла плагина. Из того, что я прочитал, do_action должен вызывать функцию и выполнять ее везде, где вы поместили do_action, но я думаю, мне нужно знать, куда поставить send_reminders()
в первую очередь, чтобы она была доступна либо заданием cron, либо do_action.
Спасибо заранее за любые данные!
Использование cron arg выглядит странно. Идентификатор вставки вернет мусор к моменту вызова вашей функции.
Точно так же я считаю, что лучше всегда планировать его с аргументом id при вставке, если это для ведения журнала. В противном случае вы будете дросселировать свои журналы, в основном.
Наконец, вы уверены, что wp_mail() работает?
Извините, мне трудно понять ваши первые два пункта… использование cron arg? журналы? Не могли бы вы уточнить/перефразировать? Я протестировал
send_reminders
функцию сам по себе, в том числеwp_mail
, так что да, я знаю, что это работает. Спасибо за ответ!Что касается первого вопроса, к моменту запуска cron ваша переменная больше не устанавливается (потому что это другой процесс) для того, с чем она использовалась. во-вторых, вы можете передавать аргументы функции wp_schedule_single_event(); дайте ему аргумент insert_id и передайте его своей функции. Вопреки тому, что говорит кодекс WP, фактическая подпись: wp_schedule_single_event($timestamp, $hook, $args = array()). (см. wp-includes/cron.php)
Ааа, это полезно — документация очень искажена в отношении передачи аргументов запланированному действию. Однако, даже когда я удаляю переменную из действия и просто использую жестко закодированный текст в электронном письме, оно все равно никогда не отправляет… любые идеи о том, что еще я могу использовать в этом действии, чтобы посмотреть, работает ли оно с чем-то другим, кроме
wp_mail
, возможно? Я также пробовалmail
.Для журналов я лично добавляю в файл…
Извините за задержку — я все еще не могу запустить функцию. У меня сама функция успешно пишет сообщение «завершено», но этого никогда не происходит, когда задача cron исчезает с монитора cron. Я попытался поместить функцию в файл моего плагина и в файл функций моей темы.