不幸的是,该特定过滤器在使用后没有得到验证。以下是核心过滤器的使用方法:
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所建议的),但如果你必须使用钩子,这是一种方法。