Как остановить функцию почты 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.
   }
}
 1
Author: Pieter Goosen, 2012-05-29

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;
}
 1
Author: fuxia, 2013-06-22 11:01:42

К сожалению, этот конкретный фильтр не проверяется после его использования. Вот как используется этот фильтр в ядре:

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), но если вам необходимо использовать хук, это один из способов сделать это.

 3
Author: EAMann, 2017-05-25 08:30:51

Вместо того, чтобы цепляться за phpmailer_init, почему бы просто не установить $query['to'] = ''; и return $query; внутри крючка wp_mail?

 2
Author: Elliot, 2014-07-24 14:27:32

//не работай на меня:
$phpmailer = new stdClass;

//для остановки функции wp_mail используйте:
function my_action( $phpmailer ) { if( condition ) { $phpmailer->ClearAllRecipients(); } } add_action( 'phpmailer_init', 'my_action' );

 2
Author: Jérome Obbiet, 2016-04-22 14:15:09

Вы можете сделать это с помощью фильтра 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;
}
 1
Author: user56929, 2016-10-03 14:37:15
if(mycondition){
    wp_mail(themail@youwant, $subject, $message)
}else{
    // NOTHING SPECIAL
}
 -1
Author: JeanDavidDaviet, 2012-05-29 14:52:46