使用带有参数的wp_Schedule_Single_Event发送电子邮件

时间:2011-04-22 作者:tollmanz

我正在尝试安排一个伪cron作业,以便使用WordPress插件在设定的时间后发送电子邮件。

到目前为止,当我将电子邮件地址和消息硬编码到email_about_coupon() 作用但是,当我尝试向函数发送参数时,电子邮件从未发送。

通过使用Cron GUI plugin, 我可以看到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 个回复
最合适的回答,由SO网友:Rarst 整理而成

我认为您在传递参数的方式和预期的工作方式上存在不匹配。将参数数组传递给schedule,并期望挂钩函数接收相同的参数数组。事实并非如此。

Cron事件由do_action_ref_array(), 然后通过call_user_func_array().

因此,挂钩函数不接收参数数组,它接收多个参数-数组中的每个元素一个参数。

所以您需要再次将参数数组包装到数组中,或者修改函数以处理多个参数。请注意,对于信函,您还需要修改add_action() 调用,以便传递所需数量的参数,而不是只传递一个参数。

SO网友:Thirlan

多亏了Rarst,现在这一切才变得更有意义。因此,我更新了这篇文章,详细阐述了拉斯特提到的差异,并对拉斯特的观点进行了升级,以阐明这一点;)

大体上wp_schedule_single_event 通过变量args将参数传递给函数,如图所示in the codex. 此变量“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);
查看codex for 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。

所以沙丁鱼的问题可以通过更换一条线路来解决,

$args = array(\'email\' => $email, \'title\' => $post->post_title);
变成了这个,

$args = array(array(\'email\' => $email, \'title\' => $post->post_title));

结束

相关推荐

WP-cron.php-如何删除WP的Cron瞬变?

我有一个Wordpress网络,我的任务是禁用WP Cron并将其替换为Apache Cron。我已经设置了一个PHP脚本,当Apache Cron调用该脚本时,它将在网络下的所有站点中循环,并向该站点的wp Cron发出请求。php页面,从而执行其cron。我想使用Wordpress的瞬态特性来限制我的PHP脚本,因为Wordpress限制了自己的cron。然而,当我深入研究代码时,我看到doing\\u cron瞬态已设置(在cron.php#217中),但从未取消设置。瞬态是否一直未设置,或者Wor