问题描述

我试图安排一个伪 cron 工作,在一段时间后使用 WordPress 插件发送电子邮件。到目前为止,当我将电子邮件地址和消息编码到’email_about_coupon’ 函数中时,我已经能够使此代码运行; 然而,当我尝试将参数发送到函数时,电子邮件永远不会被发送。通过使用 Cron GUI 插件 (http://wordpress.org/extend/plugins/cron-view/installation/),我可以看到即使使用参数也可以注册 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("rn",$headers) . "rn";

    // Send email
    wp_mail($args['email'], 'Renew Your Coupon Now!', $text, $h);
}

一如以往,非常感谢您的帮助!

最佳解决方案

我认为你在传递参数方面有不匹配,以及你期望如何工作。您传递参数数组以调度并期望您的挂钩函数接收相同的参数数组。不是这种情况。

Cron 事件由 do_action_ref_array()处理,do_action_ref_array()通过 call_user_func_array()传递参数。

所以你的 hooked 函数不接收数组的参数,它接收到多个参数 – 一个数组中的每个元素。

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

次佳解决方案

感谢拉尔斯特,这让现在更有意义的地狱。所以我更新了这篇文章,详细阐述了 Rarst 提到的和 upvote 他为这个发光的差异; )

基本上 wp_schedule_single_event 通过变量 arg 将参数传递给你的函数,如 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 。

所以沙丁鱼的问题可以通过一行改变来解决,第 7 行,

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

变成这样,

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

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。