如何使WordPress的电子邮件保持同步

时间:2015-04-24 作者:Dominic P

我最近在我的网站上遇到了一个问题,电子邮件无法发送。这是一个问题,但更大的问题是,失败导致脚本超时,这对用户体验造成了很大影响。

我正在发布我的解决方案wp_mail 异步的,希望得到一些想法的反馈。这是一个好的解决方案吗?我会遇到什么陷阱?

1 个回复
最合适的回答,由SO网友:Dominic P 整理而成

自从wp_mail 是可插入的,我们可以有选择地覆盖它。我在通用功能插件中运行以下代码:

/**
 * Email Async.
 * 
 * We override the wp_mail function for all non-cron requests with a function that simply
 * captures the arguments and schedules a cron event to send the email.
 */
if ( ! defined( \'DOING_CRON\' ) || ( defined( \'DOING_CRON\' ) && ! DOING_CRON ) ) {

    function wp_mail() {

        // Get the args passed to the wp_mail function
        $args = func_get_args();

        // Add a random value to work around that fact that identical events scheduled within 10 minutes of each other
        // will not work. See: http://codex.wordpress.org/Function_Reference/wp_schedule_single_event
        $args[] = mt_rand();

        // Schedule the email to be sent
        wp_schedule_single_event( time() + 5, \'cron_send_mail\', $args );
    }
}
然后,我定义了以下函数来实际发送电子邮件。

/**
 * This function runs during cron requests to send emails previously scheduled by our
 * overrided wp_mail function. We remove the last argument because it is just a random
 * value added to make sure the cron job schedules correctly.
 * 
 * @hook    cron_send_mail  10
 */
function example_cron_send_mail() {

    $args = func_get_args();

    // Remove the random number that was added to the arguments
    array_pop( $args );

    call_user_func_array( \'wp_mail\', $args );
}

/**
 * Hook the mail sender. We accept more arguments than wp_mail currently takes just in case
 * they add more in the future.
 */
add_action( \'cron_send_mail\', \'example_cron_send_mail\', 10, 10 );

结束

相关推荐

wp-cron: freeze at "now"

抱歉问了这么愚蠢的问题。简单地说,我有一个wp(3.5.1版)博客,使用了一个经过大量修改的(我自己)主题。除了wp cron之外,其他一切都正常工作。列出的作业出现在(例如)crontrol中,时间流逝直到“现在”(这意味着作业应该开始)。无论如何,什么都没有发生:计划的后期冻结在“现在”,我的自定义函数冻结在“现在”,等等。如果我手动运行它,一切都正常(因此没有代码问题)。我尝试禁用wp cron(使用define(\'DISABLE_WP_CRON\', true); 并设置一个自定义wp cron