Отключение писем об регистрации новых пользователей
Я хочу отключить письма, которые получает администратор при регистрации нового пользователя. Мы получаем много писем из-за новых регистраций (это легитимные регистрации), но я просто не хочу постоянно видеть уведомления о том, что кто-то зарегистрировался.
Я пробовал устанавливать плагины, но они не работают. (поддержка даже говорит, что они больше не работают). При поиске здесь единственный вопрос, который я смог найти, это Отключение писем администратору при регистрации новых пользователей, который был задан три года назад и, похоже, тоже не работает. Я попробовал этот код:
// Переопределение функции уведомления пользователя
if ( !function_exists('wp_new_user_notification') ) {
function wp_new_user_notification( $user_id, $plaintext_pass = '' ) {
$user = new WP_User($user_id);
$user_login = stripslashes($user->user_login);
$user_email = stripslashes($user->user_email);
$message = sprintf(__('Новая регистрация пользователя на вашем блоге %s:'), get_option('blogname')) . "rnrn";
$message .= sprintf(__('Имя пользователя: %s'), $user_login) . "rnrn";
$message .= sprintf(__('E-mail: %s'), $user_email) . "rn";
// @wp_mail(get_option('admin_email'), sprintf(__('[%s] Регистрация нового пользователя'), get_option('blogname')), $message);
if ( empty($plaintext_pass) )
return;
$message = __('Привет,') . "rnrn";
$message .= sprintf(__("Добро пожаловать на %s! Вот как войти:"), get_option('blogname')) . "rnrn";
$message .= wp_login_url() . "rn";
$message .= sprintf(__('Имя пользователя: %s'), $user_login) . "rn";
$message .= sprintf(__('Пароль: %s'), $plaintext_pass) . "rnrn";
$message .= sprintf(__('Если у вас возникнут проблемы, пожалуйста, свяжитесь со мной по адресу %s.'), get_option('admin_email')) . "rnrn";
$message .= __('До свидания!');
wp_mail($user_email, sprintf(__('[%s] Ваше имя пользователя и пароль'), get_option('blogname')), $message);
}
}
в functions.php моей темы (строка с @wp_mail закомментирована), и я даже пробовал закомментировать эту строку в wp-includes/pluggable.php
, но я все равно получаю письма.
Сейчас я использую WordPress 4.5.3. (Обновлено до 4.6 в процессе решения проблемы)
Я пытаюсь быть максимально ясным. Я не хочу останавливать отправку писем пользователям, так как они должны их получать, но как мне остановить отправку писем администратору?

Подход для WordPress 4.6+
Ознакомьтесь с патчем в тикете #36009, который был добавлен в WordPress версии 4.6.
Он добавляет опцию 'user'
для параметра $notify
в функции wp_new_user_notification()
, чтобы пропускать отправку этих писем администратору.
Как это работает
Функция register_new_user()
содержит эту часть:
do_action( 'register_new_user', $user_id );
Уведомления по электронной почте активируются с помощью:
add_action( 'register_new_user', 'wp_send_new_user_notifications' );
где callback-функция определена как:
function wp_send_new_user_notifications( $user_id, $notify = 'both' ) {
wp_new_user_notification( $user_id, null, $notify );
}
Обходное решение
Мы можем попробовать этот подход (не тестировался) с пользовательской callback-функцией и удалить стандартную:
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 );
}
где мы меняем значение по умолчанию с 'both'
на 'user'
.
Стоит упомянуть, что wp_send_new_user_notifications()
также подключена к этим действиям:
network_site_new_created_user
network_site_users_created_user
network_user_new_created_user
edit_user_created_user
Мы можем обработать их аналогичным образом, как описано выше.

Это выглядело потрясающе. Я обновился до версии 4.6 и попробовал, но уведомления о новых пользователях все равно приходят.

Это указано как патч и требует модульного тестирования. Неизведанные воды.

Я только что попробовал это на чистой установке без плагинов и с темой по умолчанию, но безрезультатно.

@Jarmerson Спасибо за тестирование, я только что заметил небольшую проблему в моем сниппете, я исправлю её ;-) P.S.: юнит-тест был добавлен здесь.

@rudtek Я только что обновил ответ, исправил опечатку. Только что протестировал, и теперь вроде работает на моей тестовой установке.

Спасибо за ваш комментарий, @wired. Я успешно протестировал это на чистой установке, как плагин, если я правильно помню. Вы получали PHP ошибку от кода? Код предполагает PHP 5.3+.

У меня это на работающем сайте с BuddyPress и множеством плагинов, так что может быть конфликт, я не знаю. Просто не работает. Не могу протестировать локально.

Прошло много времени с тех пор, как я использовал BuddyPress, так что я не тестировал это там, но плагины всегда могут вмешиваться. @wired

Универсальный подключаемый подход для WordPress < 4.6 (см. ответ @birgire для версий > 4.6)
Подключаемые функции — это одно из более печальных наследий прошлого WordPress, сопровождающееся множеством сложностей. Тот факт, что прямое изменение основного файла (что крайне не рекомендуется, как упомянул @Jarmerson в комментариях) не сработало, заставляет меня предположить, что другой плагин в вашей установке мог переопределить подключаемую функцию.
Файл wp-includes/pluggable.php
загружается после активных плагинов и mu-плагинов, но до активной темы; это означает, что «Подключаемые функции» могут быть переопределены только объявлениями в плагине.
Модификация, которую вы обнаружили в другом ответе, относится к более старой версии WordPress. В процессе замены любой подключаемой функции следует начинать с оригинальной функции, как она существует в версии вашей установки (в вашем случае, v4.5.3). При этом решение принимает следующий вид (комментарии опущены; строки не добавлены, только удалены):
function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) {
if ( $deprecated !== null )
_deprecated_argument( __FUNCTION__, '4.3.1' );
if ( 'admin' === $notify || ( empty( $deprecated ) && empty( $notify ) ) )
return;
global $wpdb, $wp_hasher;
$user = get_userdata( $user_id );
$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
$key = wp_generate_password( 20, false );
do_action( 'retrieve_password_key', $user->user_login, $key );
if ( empty( $wp_hasher ) ) {
require_once ABSPATH . WPINC . '/class-phpass.php';
$wp_hasher = new PasswordHash( 8, true );
}
$hashed = time() . ':' . $wp_hasher->HashPassword( $key );
$wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user->user_login ) );
$message = sprintf(__('Имя пользователя: %s'), $user->user_login) . "\r\n\r\n";
$message .= __('Для установки пароля посетите следующий адрес:') . "\r\n\r\n";
$message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . ">\r\n\r\n";
$message .= wp_login_url() . "\r\n";
wp_mail($user->user_email, sprintf(__('[%s] Информация о вашем имени пользователя и пароле'), $blogname), $message);
}
Я опустил традиционную проверку if( !function_exists() )
, которая обычно инкапсулирует переопределение подключаемой функции, потому что в этом случае ошибка дублирующего объявления желательна — она укажет на то, что другой плагин уже переопределил функцию wp_new_user_notification()
до вас, и, следовательно, ваша попытка сделать это полностью игнорируется.
Рекомендую разместить эту функцию в mu-плагине, так как это снижает вероятность того, что другой плагин опередит вас. В любом случае, не изменяйте основной файл wp-includes/pluggable.php
указанным выше кодом.

Я попробовал это и получил ошибку: Fatal error: Cannot redeclare wp_new_user_notification() (ранее объявлена в /home/tdh/public_html/wp-includes/pluggable.php:1709) в /home/tdh/public_html/wp-content/themes/tdh/functions.php на строке 71

Эта ошибка возникает из-за того, что функция wp_new_user_notification()
уже объявлена. Вам нужно переопределить её, добавив проверку function_exists()
вокруг объявления.
Если вы включите эту проверку, ваша функция получит приоритет над ядром WordPress.

@Jarmerson проверка function_exists() ничего не переопределяет - она полностью пропускает ваше объявление функции в случае, если функция уже была объявлена. Всё, что она делает - подавляет фатальную ошибку коллизии, игнорируя ваш код.

@rudtek похоже, вы поместили моё решение в вашу тему. Оно должно быть размещено в плагине — переопределения pluggable-функций в теме всегда будут давать сбой.

У него автономная установка. Однако я только что протестировал ваш код на чистой установке, и ОН РАБОТАЕТ!!! :D
@rudtek зайдите в папку плагинов и просто создайте новый файл, например disable-admin-notices.php
, вставьте это сразу после открывающего тега /*
Plugin Name: Disable Admin Email Notices
*/
, затем вставьте код bosco и активируйте через плагины. У меня сработало.

@Jarmerson "mu-plugin" — это "must-use plugin" (обязательный плагин) — плагины, помещённые в специальную папку, остаются всегда "активированными" и загружаются раньше других плагинов. Не имеет отношения к WPMU ;)

Для WordPress 6.1 и новее
Существуют хуки, которые можно использовать для управления базовыми отправляемыми письмами:
add_filter('wp_send_new_user_notification_to_admin', '__return_false');
add_filter('wp_send_new_user_notification_to_user', '__return_false');
Это остановит отправку писем с темой вида "[НАЗВАНИЕ_САЙТА] Регистрация нового пользователя".

После некоторых исследований я определил, что можно отключить все уведомительные письма, кроме тех, которые отправляются администратору.
Отвечая на ваш первоначальный вопрос, я могу дать несколько советов о том, как отключить нежелательные уведомительные письма от WordPress, связанные с регистрацией пользователей и сбросом пароля.
Предполагая, что у вас установка работает в среде cPanel, просто выполните следующие шаги, и вы эффективно удалите эти конкретные письма.
Войдите в Фильтрацию на уровне аккаунта из админки cPanel. В этом разделе вы можете управлять фильтрами для вашего основного аккаунта. Вам нужно Создать фильтр и перейти к созданию Нового фильтра для Всех писем в вашем аккаунте.
В поле Правило выберите Кому и равно. Примечание: Вы также можете создать фильтры для других условий. Последнее поле — это текстовое поле, в которое вы вводите email-адрес, с которым работаете. Ниже области правил происходит магия. Выберите Отбросить сообщение. Есть и другие варианты.
Я всегда создаю email-адрес, который, как я знаю, не будет использоваться, и создаю фильтр с его помощью.
Я мог бы продолжить о хуках WordPress и тому подобном, но нет ничего, что сделало бы именно то, что вам нужно. Печально...

Это сработало для меня. https://gist.github.com/someguy9/b24866f521ec3eb20b13feb4c72a6afd#file-disable-wordpress-admin-new-user-notification-php
<?php
//Отключение уведомления о новом пользователе, отправляемого администратору сайта
function smartwp_disable_new_user_notifications() {
//Удаление оригинальных email-уведомлений о создании пользователя
remove_action( 'register_new_user', 'wp_send_new_user_notifications' );
remove_action( 'edit_user_created_user', 'wp_send_new_user_notifications', 10, 2 );
//Добавление новой функции для обработки отправки email
add_action( 'register_new_user', 'smartwp_send_new_user_notifications' );
add_action( 'edit_user_created_user', 'smartwp_send_new_user_notifications', 10, 2 );
}
function smartwp_send_new_user_notifications( $user_id, $notify = 'user' ) {
if ( empty($notify) || $notify == 'admin' ) {
return;
}elseif( $notify == 'both' ){
//Отправлять email только новому пользователю, но не администратору
$notify = 'user';
}
wp_send_new_user_notifications( $user_id, $notify );
}
add_action( 'init', 'smartwp_disable_new_user_notifications' );
