Как остановить функцию почты wp?
Я использую функцию фильтра wp_mail.
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 answers
Фильтр '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;
}
К сожалению, этот конкретный фильтр не проверяется после его использования. Вот как используется этот фильтр в ядре:
extract( apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) ) );
Таким образом, все, что делает фильтр, - это заполняет $to
, $subject
, $message
, $headers
, и $attechments
вариабли. Это не крючок для действий, поэтому, хотя вы, вероятно, могли бы запустить там какую-то операцию завершения, вам действительно не следует. В идеале вы могли бы вернуть false
из своей функции фильтрации, чтобы завершить операцию, но функция не настроена так путь.
Вместо этого я рекомендую подключиться к действию phpmailer_init
. Это последнее действие в функции wp_mail()
, и оно передает ссылку на фактический объект $phpmailer
, который выполняет рассылку.
Это непроверенный функция должна предотвращать отправку почты:
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), но если вам необходимо использовать хук, это один из способов сделать это.
Вместо того, чтобы цепляться за phpmailer_init
, почему бы просто не установить $query['to'] = '';
и return $query;
внутри крючка wp_mail
?
//не работай на меня: $phpmailer = new stdClass;
//для остановки функции wp_mail используйте: function my_action( $phpmailer )
{
if( condition )
{
$phpmailer->ClearAllRecipients();
}
}
add_action( 'phpmailer_init', 'my_action' );
Вы можете сделать это с помощью фильтра 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;
}
if(mycondition){
wp_mail(themail@youwant, $subject, $message)
}else{
// NOTHING SPECIAL
}