Вопрос или проблема
Я хочу отключить стандартное уведомление по электронной почте, которое отправляется при регистрации пользователя. Я использую плагин для проверки email User Verification By PickPlugins
, который отправляет письмо с подтверждающей ссылкой, но проблема в том, что по умолчанию WordPress также отправляет письмо через pluggable.php
:
function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ){...}
Я использую тему (которую расширяю с помощью дочерней темы), которая вызывает wp_create_user
. Я заменил эту функцию родительской темы, и в моем functions.php
я добавил:
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 );
}
Проблема в том, что все равно отправляются оба письма: от плагина и стандартное письмо WordPress для новой регистрации пользователя. Я не знаю, как отключить это письмо.
Если ваш код работает, просто поместите его в плагин. Тогда он должен заработать!
Перенесите параметр по умолчанию в функцию.
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 ){
wp_new_user_notification( $user_id, null, 'user' );
}
Изменена функция wpse236122_send_new_user_notifications, чтобы использовать wp_new_user_notification вместо действия напрямую. Хотя это работает, более вероятно, что это сломается при обновлении WordPress.
Я бы также отметил, что вместо удаления действия при init, используйте действие register_new_user и установите более низкий приоритет. В ядре WordPress используется 10 по умолчанию, поэтому установка вашего на 9 или ниже сработает.
add_action( 'register_new_user', function(){
remove_action( 'register_new_user', 'wp_send_new_user_notifications' );
}, 9);
Примерил несколько предложений, но они мне не подошли. Нашел кусок кода на SmartWP.com для отключения уведомления администратора и слегка изменил код, и этот наконец сработал отлично
function smartwp_disable_new_user_notifications() {
//Удаляем оригинальные письма о создании пользователя
remove_action( 'register_new_user', 'wp_send_new_user_notifications' );
remove_action( 'edit_user_created_user', 'wp_send_new_user_notifications', 10, 2 );
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 = 'admin' ) {
if ( empty($notify) || $notify == 'user' ) {
return;
}elseif( $notify == 'both' ){
//Отправить администратору их письмо, не пользователю
$notify = 'admin';
}
wp_send_new_user_notifications( $user_id, $notify );}
add_action( 'init', 'smartwp_disable_new_user_notifications' );
Ответ или решение
Чтобы отключить отправку стандартных email-уведомлений при регистрации новых пользователей в WordPress, важно учитывать особенности взаимодействия ядра WordPress и установленных плагинов. В представленном вами случае уже используется плагин для верификации пользователей, и, несмотря на предпринимаемые усилия, WordPress продолжает отправлять стандартные электронные письма. Давайте рассмотрим, как можно решить данную проблему, опираясь на принципы работы системы и ваш код с учетом теории, примера и применения.
Теория:
WordPress по умолчанию отправляет уведомления при регистрации нового пользователя с помощью функции wp_new_user_notification
, которая определена в файле pluggable.php
. Чтобы упростить задачу и избежать дублирования писем, необходимо корректно отключить эту штатную функциональность и при необходимости реализовать альтернативное решение.
Пример:
Предполагалось, что изменение кода в functions.php
позволит исправить ситуацию. В примере ниже применён более эффективный подход, решающий задачу отключения стандартной отправки email-уведомлений. Основным моментом является использование хуков register_new_user
и edit_user_created_user
для удаления функции отправки сообщений из цепочки обработки этих событий.
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);
// Добавляем собственную функцию отправки уведомлений, если нужно
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 = 'admin') {
if (empty($notify) || $notify == 'user') {
return; // Не отправляем уведомление пользователю
} elseif ($notify == 'both') {
// Отправляем уведомление только администратору
$notify = 'admin';
}
wp_send_new_user_notifications($user_id, $notify);
}
add_action('init', 'smartwp_disable_new_user_notifications');
Применение:
Этот пример показывает как правильно отключить стандартные уведомления о создании нового пользователя и обеспечить, чтобы уведомления отправлялись только при необходимости. Особое внимание следует уделить следующим моментам:
- Удаление стандартных хуков: Инициализация удаления стандартных функций отправки email уведомлений должна происходить на ранних этапах через
add_action('init', ...)
. - Использование кастомных функций: В этом примере предусмотрено использование собственной функции
smartwp_send_new_user_notifications
, которая позволяет гибко управлять уведомлениями. - Приоритет в хуках: Убедитесь, что добавление и удаление действий происходит с правильным приоритетом, чтобы гарантировать, что ваш код выполнится до стандартного функционала WordPress.
Подобный подход позволит вам эффективно управлять email-коммуникацией при регистрации новых пользователей, избегая дублирования и придерживаясь профессиональных стандартов настройки WordPress сайта.