HervéRenault.fr

Logo de PHP Logo de WordPress

Bloquer les mails de WordPress sans installer d'extension

Ce n'est pas du pur PHP mais je range ça ici parce que c'est une solution simple et utile quand on déménage un site WordPress, qui ne nécessite pas d'installer une extension. Il est possible de bloquer les mails de deux manières.

Brutale : définir la fonction wp_mail avant qu'elle soit définie par WordPress

Ajouter dans wp-config.php :

function wp_mail()
{
    error_log("STOP ce mail dans wp-config.php :\n".print_r(func_get_args(), true));
    // si besoin de savoir ce qui envoie le mail :
    error_log("Backtrace :\n".print_r(debug_backtrace(), true));
}

Normale : utiliser le filtre WordPress pre_wp_mail

Cette façon de faire permet à d'autres fonctions (d'autres extensions) de s'exécuter normalement, par exemple pour enregistrer le mail dans la base de données.

Ajouter dans le functions.php du thème actif :

add_filter(
    hook_name: 'pre_wp_mail',
    callback: function () {
        error_log("STOP ce mail dans le filtre pre_wp_mail :\n".print_r(func_get_args(), true));
        return false;
    },
    accepted_args: 2
);
Note sur cette syntaxe : en utilisant les paramètres nommés, on s'évite de définir une priorité d'appel et c'est aussi plus lisible.

On peut aussi bloquer les mails selon le destinataire, le sujet, etc

Au lieu de simplement loguer avec func_get_args(), on peut définir les paramètres de la fonction de callback et retourner false selon ce qu'on veut faire. Exemple :

add_filter(
    hook_name: 'pre_wp_mail',
    callback: function (?bool $return, array $atts) {
        if ('foobar' == $atts['subject']) {
            error_log('STOP mail foobar pour '.$atts['to']);
            return false;
        }
        error_log('OK mail '.$atts['subject'].' pour '.$atts['to']);
        return $return;
    },
    accepted_args: 2
);