Tun Sie etwas, nachdem Sie eine E-Mail gesendet haben

11

Ich möchte etwas tun, nachdem WordPress eine E-Mail gesendet hat. Zum Beispiel nach dem Senden der E-Mail "Passwort zurücksetzen" mit der wp_mail()Funktion.

Ameer Mousavi
quelle

Antworten:

14

Verwenden der PHPMailer-Klasse mit einem Aktionsrückruf:

Ich habe mich ein wenig mit der PHPMailerKlasse befasst und festgestellt, dass sie eine benutzerdefinierte Aktion unterstützt .

So wird der Rückruf mit der doCallback()Methode in der Klasse aktiviert .

Es gibt auch einen PHPMailer Test auf GitHub, bei dem diese Funktion über den callbackAction()Rückruf verwendet wird.

Wir können es in WordPress einrichten mit:

$phpmailer->action_function = 'wpse_mail_action';

Wo wpse_mail_action()ist der Aktionsrückruf?

Hier ist ein Beispiel, wie wir dies anwenden können:

/**
 * Custom PHPMailer action callback
 */
function wpse_mail_action( $is_sent, $to, $cc, $bcc, $subject, $body, $from )
{
    do_action( 'wpse_mail_action', $is_sent, $to, $cc, $bcc, $subject, $body, $from );
    return $is_sent; // don't actually need this return!
}

/**
 * Setup a custom PHPMailer action callback
 */
add_action( 'phpmailer_init', function( $phpmailer )
{
    $phpmailer->action_function = 'wpse_mail_action';
} );

Jetzt haben wir Zugriff auf den wpse_mail_actionHaken.

Wir könnten dann unseren eigenen Mail-Logger hinzufügen und prüfen, ob die Mails erfolgreich gesendet wurden oder nicht.

Beispiel:

Hier ist ein (ungetestetes) Beispiel, wie wir etwas tun können, nachdem "Password Reset" -Postings gesendet wurden:

/**
 * Do something after the "Password Reset" post has been successfully sent:
 */
add_action( 'wpse_mail_action', function( $is_sent, $to, $cc, $bcc, $subject, $body, $from )
{
    if( $is_sent && false !== stripos( $subject, 'Password Reset' ) )
        // do stuff

}, 10, 7 );

Hier könnten wir einige weitere Einschränkungen hinzufügen und bei Bedarf andere Aktionen wie den retrieve_passwordHook ausführen .

Birgire
quelle
Vielen Dank überhaupt. Ich habe gerade das Plugin erstellt und es ist jetzt über das WordPress-Plugin-Verzeichnis zugänglich: wordpress.org/plugins/telegram-for-wp
Ameer Mousavi
1
Gern
geschehen
Es liegt ein Konflikt mit dem Contact Form 7-Plugin vor. Das Ergebnis des Sendens kann nicht empfangen werden. Sein Ajax-Lader dreht sich schon immer. auch wenn die E-Mail erfolgreich gesendet wurde.
Ameer Mousavi
2
Ich habe diese Methode mit dem CF7 getestet und sie hat wie erwartet funktioniert. Wenn sich der Ajaxloader für immer dreht, kann dies auf nicht verwandte Javascript / PHP / Server-Fehler hinweisen und daher wp_mail()möglicherweise nie in CF7 aufgerufen werden. Beachten Sie, dass Plugins von Drittanbietern hier in WPSE nicht zum Thema gehören. @AmirMousavi
Birgire