Использование 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);
}

Как всегда, большое спасибо за вашу помощь!

Author: butlerblog, 2011-04-22

2 answers

Я думаю, что у вас есть несоответствие в том, как вы передаете аргументы и как вы ожидаете, что это сработает. Вы передаете массив аргументов в расписание и ожидаете, что ваша подключенная функция получит идентичный массив аргументов. Это не тот случай.

События Cron обрабатываются do_action_ref_array(), который, в свою очередь, передает аргументы через call_user_func_array().

Таким образом, ваша подключенная функция не получает массив аргументов, она получает несколько аргументов - по одному для каждого элемента в вашем массиве.

Итак, вы вам нужно либо еще раз обернуть массив аргументов в массив, либо изменить свою функцию для обработки нескольких аргументов. Обратите внимание, что для письма вам также нужно будет изменить свой вызов add_action() так, чтобы передавалось необходимое количество аргументов вместо одного.

 13
Author: Rarst, 2011-05-11 22:35:03

Благодаря 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));
 15
Author: Thirlan, 2011-05-12 04:28:43