如何停止wp_mail函数?

时间:2012-05-29 作者:Chella Durai

我正在使用wp\\u邮件过滤器功能。

add_filter(\'wp_mail\',\'check_the_mail_content\');

如果我的条件满足,那么邮件应该发送,否则我需要停止,我的功能是

add_filter(\'wp_mail\',\'check_the_mail_content\');
function check_the_mail_content($query){
    if(mycondition){
         //mail should go.
    }
    else{
        //stop the mail.
   }
}

6 个回复
最合适的回答,由SO网友:fuxia 整理而成

滤器\'phpmailer_init\', 不\'wp_mail\'. 要防止发送邮件,请重置PHPMailer对象。

原型(未测试):

add_action( \'phpmailer_init\', \'wpse_53612_conditional_mail_stop\' );

function wpse_53612_conditional_mail_stop( $phpmailer )
{
    ! my_condition() and $phpmailer = new stdClass;
}

SO网友:EAMann

不幸的是,该特定过滤器在使用后没有得到验证。以下是核心过滤器的使用方法:

extract( apply_filters( \'wp_mail\', compact( \'to\', \'subject\', \'message\', \'headers\', \'attachments\' ) ) );
所以过滤器所做的就是填充$to, $subject, $message, $headers, 和$attechments 变量。它不是一个动作挂钩,所以虽然您可能可以在其中抛出某种终止操作,但您确实不应该这样做。理想情况下,您可以返回false 从过滤函数到终止操作,但函数不是这样设置的。

相反,我建议挂到phpmailer_init 行动这是wp_mail() 函数,并将引用传递给实际$phpmailer 进行邮件处理的对象。

untested 功能应阻止邮件发送:

class fakemailer {
    public function Send() {
        throw new phpmailerException( \'Cancelling mail\' );
    }
}

if ( ! class_exists( \'phpmailerException\' ) ) :
class phpmailerException extends Exception {
    public function errorMessage() {
        $errorMsg = \'<strong>\' . $this->getMessage() . "</strong><br />\\n";
        return $errorMsg;
    }
}
endif;

add_action( \'phpmailer_init\', \'wpse_53612_fakemailer\' );
function wpse_53612_fakemailer( $phpmailer ) {
    if ( ! /* condition */ ) 
        $phpmailer = new fakemailer();
}
这应该取代$phpmailer 对象的一个实例。此假类仅包含Send() 方法立即引发类型为的异常phpmailerException. 这个wp_mail() 函数将捕获此异常并返回false 默认情况下。

不是世界上性能最好的解决方案。。。你应该在打电话之前检查一下情况wp_mail() (正如@Zaidar所建议的),但如果你必须使用钩子,这是一种方法。

SO网友:Elliot

而不是phpmailer_init, 为什么不直接设置$query[\'to\'] = \'\';return $query; 内部wp_mail

SO网友:Jérome Obbiet

//不要为我工作:
$phpmailer = new stdClass;

//对于停止wp\\U邮件功能,请使用:
function my_action( $phpmailer ) { if( condition ) { $phpmailer->ClearAllRecipients(); } } add_action( \'phpmailer_init\', \'my_action\' );

SO网友:user56929

您可以使用wp_mail 通过返回空消息进行筛选。WordPress不会发送电子邮件。

add_filter(\'wp_mail\',\'check_the_mail_content\');

function check_the_mail_content($args){
 if(!mycondition){ 
  $args["message"]="";//Don\'t send the email
 }
 return $args;
}

SO网友:JeanDavidDaviet
if(mycondition){
    wp_mail(themail@youwant, $subject, $message)
}else{
    // NOTHING SPECIAL
}
结束

相关推荐