WP_mail未在Cron内运行

时间:2019-12-03 作者:dc09

这个wp_mail() 在cron函数中计划时,函数未运行。我添加了以下功能:

add_filter( \'cron_schedules\', \'isa_add_every_one_minutes\' );
function isa_add_every_one_minutes( $schedules ) {
    $schedules[\'every_sixty_seconds\'] = array(
            \'interval\'  => 60,
            \'display\'   => __( \'Every 1 Minutes\', \'textdomain\' )
    );
    return $schedules;
}

// Schedule an action if it\'s not already scheduled
if ( ! wp_next_scheduled( \'isa_add_every_one_minutes\' ) ) {
    wp_schedule_event( time(), \'every_sixty_seconds\', \'isa_add_every_one_minutes\' );
}

// Hook into that action that\'ll fire every three minutes
add_action( \'isa_add_every_one_minutes\', \'only_debug_admin\' );


function only_debug_admin(){
    $message = "Test message";

wp_mail( \'[email protected]\', $message, $message );

update_option(\'default_role\',\'customer\');   
    }
当我通过wp-control插件手动运行cron时,我收到一封邮件,wp-mail工作正常。但是,当cron作业运行时。为了调试,我在mail函数下面添加了这一行:

update_option(\'default_role\',\'customer\'); 
我在WordPress设置中将默认角色设置为subscriber。在cron运行时,设置会更新为“customer”,但不会收到邮件。手动运行该功能时,会收到邮件。知道为什么会这样吗?

2 个回复
SO网友:butlerblog

这个有点让人困惑。我本来想说的是,你需要在邮件发送后确定是否有什么问题,因为你在下一次操作中受到了打击。但后来我重新阅读了它,捕捉到了手动运行时收到的电子邮件部分。

您需要做的是找出是否发生了错误。由于这不是一个手动过程,这不是很直接;但有办法做到这一点。这个答案不会特别solve 你遇到的问题,但它应该让你有办法确定这个问题到底是什么。

我会设置捕捉任何错误,然后记录它们。您可以通过确保WP已设置为调试并记录任何错误来实现这一点。确保wp配置中包含以下内容。php:

define( \'WP_DEBUG\', true );
define( \'WP_DEBUG_LOG\', true );
现在您可以使用WPerror_log() 函数将任何错误写入日志文件。

wp_mail() 运行时返回true | false布尔值。如果有任何错误,它将返回false。因此,我们可以根据结果写入日志。

因此,在函数中,根据返回的结果将写入错误日志。

function only_debug_admin(){
    $message = "Test message";

    $wp_mail_result = wp_mail( \'[email protected]\', $message, $message );

    if ( true === $wp_mail_result ) {
        error_log( \'wp_mail returned true!\' );
    } else {
        error_log( \'wp_mail had an error!\' );
    }
}
如果wp_mail() 错误(返回false),则您希望能够捕获phpMailer 看看这是否能让你明白为什么。

add_action( \'phpmailer_init\', \'my_log_phpmailer_init\' );
function my_log_phpmailer_init( $phpmailer ) {
    error_log( print_r( $phpmailer, true ) );
}
现在,当cron运行时,您可以检查错误日志(/wp-content/debug.log)以了解发生了什么。如果wp_mail() 返回true,该问题是发送主机或接收方(WP之外)的电子邮件问题。如果为false,请查看phpMailer中的错误(也应在日志中)。

这不是solve 你的问题,但它会让你走上正轨,弄清楚它到底是什么。

SO网友:zabatonni

这在使用CLI运行cron作业时非常常见(首选)。Wordpress使用PHPMailer,它尝试从未定义的$\\u服务器变量中获取服务器名称,然后尝试少量回调,导致电子邮件地址无效。我能想到的最简单的黑客补丁,例如在wp配置中定义它。php

if(empty($_SERVER[\'SERVER_NAME\'])) $_SERVER[\'SERVER_NAME\']=\'www.yourdomain.tld\';

相关推荐

Div-Wrap with Functions.php in ChildTheme Using Shorcode!

我只想为一个简单样式的DIV包装器创建一个短代码。在WordPress的网站上,我想添加如下内容:[quotehead]Headline text[/quotehead] ...a normal blockquote from wordpress... 输出应为:<div class=\"block_header\">Headline text</div> 我的内部功能functions.php (在childtheme中)包含以下内容:/**