Использование wp запланировать одно событие с аргументами для отправки электронной почты
Я пытаюсь запланировать псевдо-задание cron для отправки электронного письма через определенное время с использованием плагина WordPress.
До сих пор мне удавалось запускать этот код, когда я жестко вводил адрес электронной почты и сообщение в функцию email_about_coupon()
. Однако, когда я пытаюсь отправить аргументы функции, электронное письмо никогда не отправляется.
Используя плагин графического интерфейса Cron, я могу видеть, что задание cron зарегистрировано даже с аргументами. Я верю, что Я делаю что-то неправильно, что не позволяет правильно использовать аргументы в функции во время ее запуска.
Вот что у меня есть:
function schedule_email_cron($post_id)
{
// Get the UNIX 30 days from now time
$thirty_days = time() + 60; // (30 * 24 * 60 * 60)
$post = get_post($post_id);
$email = get_the_author_meta('user_email', $post->post_author);
$args = array('email' => $email, 'title' => $post->post_title);
wp_schedule_single_event($thirty_days, 'email_about_coupon_action', $args);
}
add_action('save_post', 'schedule_email_cron', 1, 1);
add_action('email_about_coupon_action', 'email_about_coupon', 1, 1);
function email_about_coupon($args)
{
// Email text
$text = "<html><body><p>Your coupon titled, ".$args['title']." is expiring soon. Please visit <a href=\"\">".get_bloginfo('siteurl')."/registered/</a> ".get_bloginfo('siteurl')."/registered/ to renew your coupon.</p></body></html>";
// Email headers
$headers = array(
'From: '.get_bloginfo('name').' <'.get_bloginfo('admin_email').'>',
"Content-Type: text/html"
);
$h = implode("\r\n",$headers) . "\r\n";
// Send email
wp_mail($args['email'], 'Renew Your Coupon Now!', $text, $h);
}
Как всегда, большое спасибо за вашу помощь!
2 answers
Я думаю, что у вас есть несоответствие в том, как вы передаете аргументы и как вы ожидаете, что это сработает. Вы передаете массив аргументов в расписание и ожидаете, что ваша подключенная функция получит идентичный массив аргументов. Это не тот случай.
События Cron обрабатываются do_action_ref_array()
, который, в свою очередь, передает аргументы через call_user_func_array()
.
Таким образом, ваша подключенная функция не получает массив аргументов, она получает несколько аргументов - по одному для каждого элемента в вашем массиве.
Итак, вы вам нужно либо еще раз обернуть массив аргументов в массив, либо изменить свою функцию для обработки нескольких аргументов. Обратите внимание, что для письма вам также нужно будет изменить свой вызов add_action()
так, чтобы передавалось необходимое количество аргументов вместо одного.
Благодаря Rarst теперь это имеет гораздо больше смысла. Поэтому я обновил этот пост, чтобы уточнить различия, о которых упоминал Рарст, и поддержал его за то, что он пролил свет на это;)
В основном wp_schedule_single_event передает аргументы вашей функции через переменные args, как показано в кодексе . Эта переменная "args" должна быть массивом, потому что каждое значение в массиве будет сопоставлено с аргументом в вашем обратном вызове функция.
Пример:
add_action('example_action', 'example', 1, 3);
$args = array ( 2, 1, 3 );
wp_schedule_single_event(time(), 'example_action', $args);
function example($a, $b, $c)
{
}
2 пойдет в $a, 1 пойдет в $b и 3 пойдет в $c. Однако передача трех переменных возможна только из-за этой строки,
add_action('example_action', 'example', 1, 3);
Просматривая код для add_action, вы видите, что четвертый аргумент, 3, определяет, сколько аргументов передается функции обратного вызова. Значение по умолчанию равно 1.
Таким образом, этот пример также работает:
add_action('example_action', 'example');
$args = array ( array( 2, 1, 3 ) );
wp_schedule_single_event(time(), 'example_action', $args);
function example($a)
{
}
Итак, здесь массив (2, 1, 3) присваивается только $a.
Итак Проблема сардины может быть решена одним изменением строки, где строка 7,
$args = array('email' => $email, 'title' => $post->post_title);
Вместо этого становится этим,
$args = array(array('email' => $email, 'title' => $post->post_title));