Отключение писем об регистрации новых пользователей

16 авг. 2016 г., 20:47:10
Просмотры: 22.9K
Голосов: 5

Я хочу отключить письма, которые получает администратор при регистрации нового пользователя. Мы получаем много писем из-за новых регистраций (это легитимные регистрации), но я просто не хочу постоянно видеть уведомления о том, что кто-то зарегистрировался.

Я пробовал устанавливать плагины, но они не работают. (поддержка даже говорит, что они больше не работают). При поиске здесь единственный вопрос, который я смог найти, это Отключение писем администратору при регистрации новых пользователей, который был задан три года назад и, похоже, тоже не работает. Я попробовал этот код:

// Переопределение функции уведомления пользователя
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 в процессе решения проблемы)

Я пытаюсь быть максимально ясным. Я не хочу останавливать отправку писем пользователям, так как они должны их получать, но как мне остановить отправку писем администратору?

18
Комментарии

Вы пробовали поместить в папку plugins?

Jarod Thornton Jarod Thornton
16 авг. 2016 г. 21:47:18

Я не знал, поможет ли это, поскольку я редактировал pluggable.php напрямую. Это все, что мне нужно закомментировать?

rudtek rudtek
16 авг. 2016 г. 21:54:03

Упс. Хотел написать здесь. Не стоит редактировать файлы ядра. Для этого и существуют плагины. Вы можете вызывать pluggable из плагина, но если это не требуется (а это редко бывает нужно), можно просто поместить свой код в php-файл, загрузить в директорию плагинов и активировать.

Jarod Thornton Jarod Thornton
16 авг. 2016 г. 21:56:39

Я скоро вернусь в офис и помогу с этим, если смогу.

Jarod Thornton Jarod Thornton
16 авг. 2016 г. 21:57:49

Вы используете WPMU или standalone версию?

Jarod Thornton Jarod Thornton
17 авг. 2016 г. 02:13:30

Я тестировал на WPMU, но не смог воспроизвести проблему. Однако я настроил standalone версию и теперь понимаю, с чем мы имеем дело.

Jarod Thornton Jarod Thornton
17 авг. 2016 г. 02:47:43

я использую standalone

rudtek rudtek
17 авг. 2016 г. 02:53:50

Мне удалось остановить ВСЕ уведомления, но мы не хотим этого, однако это начало.

Jarod Thornton Jarod Thornton
17 авг. 2016 г. 02:54:34

Строка 350 в вашем pluggable.php — это где я сейчас копаюсь, к вашему сведению

Jarod Thornton Jarod Thornton
17 авг. 2016 г. 03:04:59

Они не хотят, чтобы мы могли это изменить, лол. Можно просто создать фильтры на уровне сервера в cPanel.

Фильтрация на уровне аккаунта и на уровне пользователя. Я уверен, что это нельзя исправить, лол.

Jarod Thornton Jarod Thornton
17 авг. 2016 г. 03:24:25

Ещё один вариант — сделать ваш сайт мультисайтовым и отключить это там.

Jarod Thornton Jarod Thornton
17 авг. 2016 г. 03:26:09

Хм, ужасно. Но всё равно спасибо за помощь!

rudtek rudtek
17 авг. 2016 г. 21:09:41

yw np

Вы также можете создать фиктивный адрес электронной почты и настроить фильтр для их удаления. Или изменить настройки в вашем почтовом клиенте, но это будет ограничено веб-сервисами, такими как Gmail, для поддержки нескольких устройств.

Первый вариант — это то, как я обрабатываю подобные уведомления.

Jarod Thornton Jarod Thornton
17 авг. 2016 г. 22:05:07

Давайте продолжим обсуждение в чате.

Jarod Thornton Jarod Thornton
17 авг. 2016 г. 22:17:22

Если не возражаете, примите ответ, который я написал. Это не совсем то, что вы искали, но он сработает. Буду очень признателен.

Jarod Thornton Jarod Thornton
18 авг. 2016 г. 06:58:55

Я поставил плюс, но не могу отметить как ответ, так как вы написали это в комментарии, а не в ответе?

rudtek rudtek
19 авг. 2016 г. 19:31:04

Он прямо под этими комментариями :)

Jarod Thornton Jarod Thornton
19 авг. 2016 г. 21:16:37

Это перенесёт вас по ссылке. Я ценю это. Я продолжу работать над решением этой проблемы, но сейчас не вижу света в конце туннеля.

Jarod Thornton Jarod Thornton
19 авг. 2016 г. 22:23:18
Показать остальные 13 комментариев
Все ответы на вопрос 5
11

Подход для 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

Мы можем обработать их аналогичным образом, как описано выше.

18 авг. 2016 г. 15:45:23
Комментарии

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

rudtek rudtek
19 авг. 2016 г. 19:44:40

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

Jarod Thornton Jarod Thornton
19 авг. 2016 г. 21:18:05

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

Jarod Thornton Jarod Thornton
19 авг. 2016 г. 22:21:07

Я буду следить за этим, потому что это так логично

rudtek rudtek
19 авг. 2016 г. 23:18:21

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

birgire birgire
19 авг. 2016 г. 23:26:35

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

birgire birgire
19 авг. 2016 г. 23:31:30

Приведенный выше код не работает для меня в WP 4.6.1.

wired wired
29 сент. 2016 г. 21:13:18

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

birgire birgire
29 сент. 2016 г. 23:23:40

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

wired wired
2 окт. 2016 г. 03:26:48

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

birgire birgire
2 окт. 2016 г. 12:58:18

Думаю, по какой-то причине он не зацепляет действие, потому что ваш сниппет ДОЛЖЕН работать. Я проверил wp_send_new_user_notifications и wp_new_user_notification в user.php и pluggable.php.

gdfgdfg gdfgdfg
6 февр. 2019 г. 00:36:47
Показать остальные 6 комментариев
8

Универсальный подключаемый подход для 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 указанным выше кодом.

18 авг. 2016 г. 09:23:40
Комментарии

Я попробовал это и получил ошибку: 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

rudtek rudtek
19 авг. 2016 г. 21:30:24

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

Если вы включите эту проверку, ваша функция получит приоритет над ядром WordPress.

Jarod Thornton Jarod Thornton
19 авг. 2016 г. 22:13:52

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

bosco bosco
19 авг. 2016 г. 22:29:39

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

bosco bosco
19 авг. 2016 г. 22:29:52

У него автономная установка. Однако я только что протестировал ваш код на чистой установке, и ОН РАБОТАЕТ!!! :D

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

Jarod Thornton Jarod Thornton
19 авг. 2016 г. 22:31:21

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

bosco bosco
19 авг. 2016 г. 22:35:26

Конечно, нет, лол. Я всё ещё учусь... Спасибо.

Jarod Thornton Jarod Thornton
19 авг. 2016 г. 22:36:25

Это сработало. Оно добавлялось как плагин. Спасибо, @Bosco! И тебе спасибо, @Jamerson!

rudtek rudtek
19 авг. 2016 г. 23:17:24
Показать остальные 3 комментариев
0

Для 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');

Это остановит отправку писем с темой вида "[НАЗВАНИЕ_САЙТА] Регистрация нового пользователя".

17 янв. 2024 г. 16:50:38
0

После некоторых исследований я определил, что можно отключить все уведомительные письма, кроме тех, которые отправляются администратору.

Отвечая на ваш первоначальный вопрос, я могу дать несколько советов о том, как отключить нежелательные уведомительные письма от WordPress, связанные с регистрацией пользователей и сбросом пароля.

Предполагая, что у вас установка работает в среде cPanel, просто выполните следующие шаги, и вы эффективно удалите эти конкретные письма.

Войдите в Фильтрацию на уровне аккаунта из админки cPanel. В этом разделе вы можете управлять фильтрами для вашего основного аккаунта. Вам нужно Создать фильтр и перейти к созданию Нового фильтра для Всех писем в вашем аккаунте.

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

Я всегда создаю email-адрес, который, как я знаю, не будет использоваться, и создаю фильтр с его помощью.

Я мог бы продолжить о хуках WordPress и тому подобном, но нет ничего, что сделало бы именно то, что вам нужно. Печально...

16 авг. 2016 г. 21:56:02
0

Это сработало для меня. 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' );  
16 окт. 2022 г. 20:18:32