Benachrichtigungsmails für Admins abstellen

Für einen Kunden habe ich vor kurzem eine Tanzpartnerbörse mit BuddyPress gebaut. Nun ist die Website fertig und der Newsletter mit der Bekanntmachung wurde verschickt. Damit ich nicht mit Benachrichtigungsmails über neue Registrierungen überschwemmt werde (bei 70.000 potentiellen Mitglieder), habe ich nach einer Lösung gesucht, die Benachrichtigungen abzuschalten. Auf Stackexchange fand ich eine Lösung, die seit WordPress 4.6 ermöglicht nur den User zu benachrichtigen. Umso erstaunter war ich, als ich trotzdem Mails bekam …

Jetzt begann also die Suche. Warum bekomme ich die Mails trotzdem? Der Code war korrekt, wurde als MU-Plugin eingebunden und ausgeführt. Aber trotzdem verschickt WordPress die Mails. Schon in einem Kommentar auf Stackexchange wurde erwähnt, dass es Probleme mit BuddyPress gibt. Aber leider endet die Diskussion dort und der Grund wurde nicht mehr erörtert. Also musste ich selbst ran.

Die Stackexchange-Lösung ist möglich seit Ticket #36009, was mit WordPress 4.6 gefixt wurde.

Es fügt eine Option 'user' für den $notify-Parameter der wp_new_user_notification()-Funktion ein, um die E-Mails nur noch an den User zu schicken.

Die register_new_user()-Funktion enthält einen Action-Hook:

do_action( 'register_new_user', $user_id );

An diesen Action-Hook wird eine Funktion gehängt:

add_action( 'register_new_user', 'wp_send_new_user_notifications' );

Die Funktion selbst ruft dann wiederum nur eine Funktion auf. Und zwar mit dem $notify-Parameter auf „both“

function wp_send_new_user_notifications( $user_id, $notify = 'both' ) {
        wp_new_user_notification( $user_id, null, $notify );
} 

Dementsprechend ist die Lösung, diesen Funktionsauruf vom Action-Hook zu entfernen (per remove_action) und eine eigene Funktion zu schreiben, wo der Standardwert des $notify-Parameters auf „user“ steht.

add_action( 'init', function()
{
    remove_action( 'register_new_user',   'wp_send_new_user_notifications'         );
    add_action(    'register_new_user',   'wpse236122_send_new_user_notifications' );
} );

function wpse236122_send_new_user_notifications(  $user_id, $notify = 'user' )
{   
    wp_send_new_user_notifications( $user_id, $notify );    
}

Aber das scheint BuddyPress nicht zu beeinflussen. Also habe ich in BuddyPress mal nach dieser Funktion gesucht und habe dann die entscheidende Stelle in der Datei bp-members-functions.php gefunden:

		
/**
 * Maybe notify the site admin of a new user registration.
 *
 * @since 1.2.2
 *
 * @param bool $notification Whether to send the notification or not.
 */
if ( apply_filters( 'bp_core_send_user_registration_admin_notification', true ) ) {
	wp_new_user_notification( $user_id );
}

BuddyPress hat wohl offensichtlich nichts davon mitbekommen, dass WordPress-Core hier nun eine bessere Lösung mit Parametern hat. Die Funktion wird direkt aufgerufen, ohne den optionalen $notify-Parameter. Es wurde zwar mit dem Ticket #7597 ein Filter hinzugefügt, um den Funktionsaufruf auszuschalten, aber die mächtigere Steuerung, wie sie WordPress-Core vorsieht, wird nicht genutzt.

Um die Benachrichtigung zu deaktivieren benötige ich also noch den BuddyPress-Filter:

/**
 * Disable call in BuddyPress.
 *
 * @link https://github.com/buddypress/BuddyPress/blob/fe47890c1ab7e2cb24c005f1c35fb9c6c8c8ab7c/src/bp-members/bp-members-functions.php#L1891-L1900
 */
add_filter( 'bp_core_send_user_registration_admin_notification', '__return_false' );

Ein zusätzliches Problem ist, dass wp_new_user_notification als Standardwert „empty“ hat, also nur den Admin benachrichtigt. Wobei wp_send_new_user_notifications den Standardwert auf „both“ ändert. Was zum einfachen Verständnis des Ganzen Konstruktes nicht gerade beiträgt.

Hier ist die gesamte Lösung als Gist und zum Kopieren:

<?php
/**
 * Plugin Name: Turn off new user registration emails
 * Description: Turns off new user registration emails just for the admin. No other notifications are affected.
 * Plugin URI:  http://torstenlandsiedel.de
 * Version:     1.0
 * Author:      Torsten Landsiedel
 * Author URI:  http://torstenlandsiedel.de
 * Licence:     GPL 2
 * License URI: http://opensource.org/licenses/GPL-2.0
 */
if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}
/*
 * See: https://wordpress.stackexchange.com/questions/236122/turn-off-new-user-registration-emails
 */
add_action( 'init', function() {
	remove_action( 'register_new_user', 'wp_send_new_user_notifications' );
	add_action( 'register_new_user', 'wpse236122_send_new_user_notifications' );
} );
/**
 * Initiates email notifications related to the creation of new users.
 *
 * Notifications are sent just to the newly created user.
 *
 * @since 4.4.0
 * @since 4.6.0 Converted the `$notify` parameter to accept 'user' for sending
 *              notifications only to the user created.
 *
 * @param int    $user_id ID of the newly created user.
 * @param string $notify  Optional. Type of notification that should happen. Accepts 'admin'
 *                        or an empty string (admin only), 'user', or 'both' (admin and user).
 *                        Default 'both'.
 */
function wpse236122_send_new_user_notifications( $user_id, $notify = 'user' ) {
	wp_send_new_user_notifications( $user_id, $notify );
}
/**
 * Disable call in BuddyPress.
 *
 * @link https://github.com/buddypress/BuddyPress/blob/fe47890c1ab7e2cb24c005f1c35fb9c6c8c8ab7c/src/bp-members/bp-members-functions.php#L1891-L1900
 */
add_filter( 'bp_core_send_user_registration_admin_notification', '__return_false' );

Mal schauen, ob ich das auf dem kommenden Contributor Day in Würzburg mal angehen kann.

Habe ich etwas übersehen? Geht es einfacher? Oder weißt du wie man BuddyPress und WordPress-Core hier besser zusammenbringen kann? Dann ab damit in die Kommentare. Vielen Dank schon mal dafür.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.