Desactivar correos de registro de nuevos usuarios
Me gustaría desactivar los correos que recibe el administrador cuando un nuevo usuario se registra. Estamos recibiendo muchos correos debido a nuevos registros (son registros legítimos) pero simplemente no quiero ver el correo que me avisa que alguien se ha registrado una y otra vez.
Hasta ahora he intentado instalar plugins pero no funcionan. (el soporte incluso dice que ya no funcionan). Al buscar por aquí la única pregunta que pude encontrar fue Desactivar correos del administrador para nuevos registros de usuarios que es de hace tres años y parece que tampoco funciona. Lo intenté con este código:
// Redefinir función de notificación de usuario
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(__('Nuevo registro de usuario en tu blog %s:'), get_option('blogname')) . "rnrn";
$message .= sprintf(__('Usuario: %s'), $user_login) . "rnrn";
$message .= sprintf(__('E-mail: %s'), $user_email) . "rn";
// @wp_mail(get_option('admin_email'), sprintf(__('[%s] Nuevo Registro de Usuario'), get_option('blogname')), $message);
if ( empty($plaintext_pass) )
return;
$message = __('Hola,') . "rnrn";
$message .= sprintf(__("¡Bienvenido a %s! Así puedes iniciar sesión:"), get_option('blogname')) . "rnrn";
$message .= wp_login_url() . "rn";
$message .= sprintf(__('Usuario: %s'), $user_login) . "rn";
$message .= sprintf(__('Contraseña: %s'), $plaintext_pass) . "rnrn";
$message .= sprintf(__('Si tienes algún problema, por favor contáctame en %s.'), get_option('admin_email')) . "rnrn";
$message .= __('¡Adiós!');
wp_mail($user_email, sprintf(__('[%s] Tu usuario y contraseña'), get_option('blogname')), $message);
}
}
en el functions.php de mi tema (tiene la línea @wp_mail comentada) e incluso he intentado comentar esa línea en wp-includes/pluggable.php
pero sigo recibiendo los correos.
Estoy usando WordPress 4.5.3 ahora mismo. (ACTUALIZADO a 4.6 como parte de este proceso)
Intento ser lo más claro posible. No quiero que se detenga el correo que va al usuario ya que ellos deberían seguir recibiéndolo, pero ¿cómo puedo hacer que se detenga el correo al administrador?

Enfoque para WordPress 4.6+
Revisa el parche en el ticket #36009 que fue fusionado en la versión 4.6 de WordPress.
Agrega la opción 'user'
para el parámetro de entrada $notify
de wp_new_user_notification()
, para omitir el envío de esos correos electrónicos al administrador.
Cómo funciona
La función register_new_user()
contiene esta parte:
do_action( 'register_new_user', $user_id );
Las notificaciones por correo electrónico se activan con:
add_action( 'register_new_user', 'wp_send_new_user_notifications' );
donde el callback está definido como:
function wp_send_new_user_notifications( $user_id, $notify = 'both' ) {
wp_new_user_notification( $user_id, null, $notify );
}
Solución alternativa
Por lo tanto, podríamos intentar este enfoque (no probado) con un callback personalizado y eliminar el predeterminado:
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 );
}
donde cambiamos el valor predeterminado de 'both'
a 'user'
.
Vale la pena mencionar que wp_send_new_user_notifications()
también está enganchado en estas acciones:
network_site_new_created_user
network_site_users_created_user
network_user_new_created_user
edit_user_created_user
Podríamos manejarlos de manera similar a lo descrito anteriormente.

esto parecía increíble. Actualicé a la versión 4.6 y lo probé, pero todavía me sigue enviando la notificación de nuevo usuario.

Está listado como un parche y requiere pruebas unitarias. Aguas inexploradas.

Acabo de probar esto en una instalación limpia sin plugins y con el tema por defecto, pero sin éxito.

@Jarmerson Gracias por probarlo, acabo de notar un pequeño problema con mi fragmento de código, lo arreglaré ;-) PD: la prueba unitaria fue agregada aquí.

@rudtek Acabo de actualizar la respuesta, corregí un error tipográfico. Lo probé y parece funcionar ahora en mi instalación de prueba.

Gracias por tu comentario @wired. Probé esto con éxito en una instalación limpia, como un plugin, si recuerdo correctamente. ¿Recibiste algún error PHP del código? Asume PHP 5.3+.

Lo tengo en un sitio en producción con BuddyPress y muchos plugins, así que podría haber un conflicto, no lo sé. Simplemente no funciona. No puedo probarlo localmente.

Ha pasado un tiempo desde que usé BuddyPress, así que no lo he probado allí, pero los plugins siempre pueden interferir. @wired

Enfoque genérico de funciones pluggables para WordPress < 4.6 (Ver la respuesta de @birgire para versiones > 4.6)
Las funciones pluggables son uno de los vestigios más desalentadores del pasado de WordPress y vienen con una serie de complejidades. Que la modificación directa del archivo núcleo (lo cual es totalmente desaconsejable, como mencionó @Jarmerson en los comentarios) no funcionó me hace sospechar que otro plugin en tu instalación podría estar sobrescribiendo la función pluggable.
El archivo wp-includes/pluggable.php
se carga después de los plugins activos y los mu-plugins, pero antes del tema activo; esto significa que las "Funciones Pluggables" solo pueden ser reemplazadas por declaraciones en un plugin.
La modificación que descubriste en la otra respuesta aplica a una versión mucho más antigua de WordPress. En el proceso de reemplazar cualquier función pluggable, deberías comenzar con la función original tal como existe en la versión de tu instalación (en tu caso, v4.5.3). Al hacerlo, la solución se convierte en lo siguiente (omitiendo comentarios; sin líneas agregadas, solo eliminadas):
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(__('Nombre de usuario: %s'), $user->user_login) . "\r\n\r\n";
$message .= __('Para establecer tu contraseña, visita la siguiente dirección:') . "\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] Información de tu nombre de usuario y contraseña'), $blogname), $message);
}
He omitido la verificación tradicional if( !function_exists() )
que normalmente encapsula una sobrescritura pluggable porque en este caso un error de declaración duplicada es deseable - indicaría que otro plugin ha sobrescrito la función wp_new_user_notification()
antes que tú, y por lo tanto tu intento de hacerlo está siendo completamente ignorado.
Recomendaría colocar esta función en un mu-plugin ya que disminuye la posibilidad de que otro plugin te gane de mano. En cualquier escenario, no modifiques el archivo núcleo wp-includes/pluggable.php
con el código anterior.

Intenté esto y obtuve este error: Error fatal: No se puede redeclarar wp_new_user_notification() (previamente declarado en /home/tdh/public_html/wp-includes/pluggable.php:1709) en /home/tdh/public_html/wp-content/themes/tdh/functions.php en la línea 71

Ese error se debe a que la función wp_new_user_notification()
ya está declarada. Lo que debes hacer es sobrescribirla incluyendo la verificación function_exists()
con la que está envuelta.
Si incluyes esto, creo que tu función tendrá prioridad sobre el núcleo de WP.

@Jarmerson la verificación function_exists() no sobrescribe nada - simplemente omite por completo tu declaración de la función en caso de que la función ya haya sido declarada. Todo lo que hace es suprimir un error fatal de colisión ignorando tu código.

@rudtek parece que colocaste mi solución en tu tema. Debe estar en un plugin - las anulaciones de funciones pluggables en un tema siempre fallarán.

Está en un sitio independiente. Sin embargo, acabo de probar tu código en una instalación nueva y ¡FUNCIONA!!! :D
@rudtek ve a tu carpeta de plugins y simplemente crea un nuevo archivo, por ejemplo disable-admin-notices.php
y pega esto justo después de la etiqueta de apertura /*
Plugin Name: Disable Admin Email Notices
*/
luego pega el código de bosco y actívalo desde plugins. A mí me funcionó.

@Jarmerson un "mu-plugin" es un "plugin de uso obligatorio" - los plugins colocados en una carpeta especial hacen que siempre permanezcan "activados" y se carguen antes que otros plugins. No tiene relación con WPMU ;)

Por supuesto que no, jaja. Todavía estoy aprendiendo... Gracias.

Para WordPress 6.1+
Existen hooks que puedes utilizar para manejar los correos electrónicos básicos que se envían:
add_filter('wp_send_new_user_notification_to_admin', '__return_false');
add_filter('wp_send_new_user_notification_to_user', '__return_false');
Esto evitará que la instalación envíe correos electrónicos con el patrón de asunto "[NOMBREDELSITIO] Registro de nuevo usuario".

Después de investigar, determiné que puedes desactivar todos los correos de notificación, excepto los que se envían al administrador.
En respuesta a tu pregunta original, puedo ofrecer algunos consejos sobre cómo manejar los correos de notificación no deseados del registro de usuarios en WordPress y los correos de restablecimiento de contraseña.
Suponiendo que tienes un entorno cPanel ejecutando tu instalación, simplemente sigue estos pasos y habrás eliminado efectivamente esos correos en particular.
Accede a Filtrado a Nivel de Cuenta desde el administrador de cPanel. En esta área puedes administrar filtros para tu cuenta principal. Quieres Crear Filtro y proceder a crear un Nuevo Filtro para Todos los Correos en Tu Cuenta.
En el campo Regla, selecciona Para y es igual a. Nota: También puedes crear filtros para otras condiciones. El último campo es un área de texto donde ingresas la dirección de correo con la que estás trabajando. Debajo del área de reglas es donde ocurre la magia. Selecciona Descarta el Mensaje. También hay otras opciones disponibles.
Siempre he creado una dirección de correo que sé que no se usará y he creado el filtro usándola.
Podría continuar hablando sobre los hooks pluggables de WordPress y demás, pero no hay nada que haga exactamente lo que te gustaría. Qué pena...

Esto funcionó para mí. https://gist.github.com/someguy9/b24866f521ec3eb20b13feb4c72a6afd#file-disable-wordpress-admin-new-user-notification-php
<?php
//Deshabilitar la notificación de nuevo usuario enviada al administrador del sitio
function smartwp_disable_new_user_notifications() {
//Eliminar los correos electrónicos originales de creación de usuario
remove_action( 'register_new_user', 'wp_send_new_user_notifications' );
remove_action( 'edit_user_created_user', 'wp_send_new_user_notifications', 10, 2 );
//Agregar nueva función para encargarse de la creación de correos electrónicos
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' ){
//Solo enviar el correo electrónico al nuevo usuario, no al administrador
$notify = 'user';
}
wp_send_new_user_notifications( $user_id, $notify );
}
add_action( 'init', 'smartwp_disable_new_user_notifications' );
