Desactivar correos de registro de nuevos usuarios

16 ago 2016, 20:47:10
Vistas: 22.9K
Votos: 5

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?

18
Comentarios

¿Has intentado colocarlo en la carpeta de plugins?

Jarod Thornton Jarod Thornton
16 ago 2016 21:47:18

No sabía si ayudaría ya que edité directamente el pluggable.php. ¿Es esto todo lo que debería comentar?

rudtek rudtek
16 ago 2016 21:54:03

Ups. Quería publicar aquí. No debes editar archivos del núcleo. Por eso usamos plugins. Puedes llamar a pluggable desde el plugin, pero si no es necesario, y rara vez lo es, simplemente puedes colocar tu código en un archivo php, subirlo a tu directorio de plugins y activarlo.

Jarod Thornton Jarod Thornton
16 ago 2016 21:56:39

Volveré a mi oficina pronto y ayudaré con esto si puedo.

Jarod Thornton Jarod Thornton
16 ago 2016 21:57:49

¿estás usando WPMU o stand alone?

Jarod Thornton Jarod Thornton
17 ago 2016 02:13:30

He estado probando en un WPMU sin poder replicarlo. Sin embargo, configuré un stand alone y veo con lo que estamos trabajando.

Jarod Thornton Jarod Thornton
17 ago 2016 02:47:43

estoy usando standalone

rudtek rudtek
17 ago 2016 02:53:50

Logré detener TODOS los avisos, pero no queremos eso, aunque es un comienzo.

Jarod Thornton Jarod Thornton
17 ago 2016 02:54:34

La línea 350 en tu pluggable.php es donde estoy investigando, para tu información

Jarod Thornton Jarod Thornton
17 ago 2016 03:04:59

No quieren que podamos cambiar eso jaja. Podrías simplemente crear filtros a nivel del servidor en cPanel.

Filtrado a nivel de cuenta & Filtrado a nivel de usuario. Estoy convencido de que no hay solución para esto jaja

Jarod Thornton Jarod Thornton
17 ago 2016 03:24:25

Otra opción es convertir tu sitio en Multisite y desactivarlo allí.

Jarod Thornton Jarod Thornton
17 ago 2016 03:26:09

Mmm, qué mal. ¡Gracias por toda tu ayuda de todos modos!

rudtek rudtek
17 ago 2016 21:09:41

yw np

También podrías crear una dirección de correo electrónico ficticia y configurar un filtro para eliminarlos. O ajustar la configuración en tu cliente de correo, pero eso estaría limitado a servicios de correo basados en web como Gmail para soportar múltiples dispositivos.

La primera solución es cómo manejo ese tipo de notificaciones.

Jarod Thornton Jarod Thornton
17 ago 2016 22:05:07

Continuemos esta discusión en el chat.

Jarod Thornton Jarod Thornton
17 ago 2016 22:17:22

Si no te importa, acepta la respuesta que escribí. No es exactamente lo que estabas buscando, pero funcionará. Realmente lo agradecería.

Jarod Thornton Jarod Thornton
18 ago 2016 06:58:55

Agregué un voto positivo, pero no puedo seleccionarlo como respuesta ya que lo publicaste como un comentario, no como una respuesta.

rudtek rudtek
19 ago 2016 19:31:04

Está justo debajo de estos comentarios :)

Jarod Thornton Jarod Thornton
19 ago 2016 21:16:37

Esto te llevará al enlace. Lo aprecio. Seguiré trabajando para encontrar una solución a esto, pero por ahora no veo luz al final del túnel.

Jarod Thornton Jarod Thornton
19 ago 2016 22:23:18
Mostrar los 13 comentarios restantes
Todas las respuestas a la pregunta 5
11

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.

18 ago 2016 15:45:23
Comentarios

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.

rudtek rudtek
19 ago 2016 19:44:40

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

Jarod Thornton Jarod Thornton
19 ago 2016 21:18:05

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

Jarod Thornton Jarod Thornton
19 ago 2016 22:21:07

Voy a estar pendiente de esto, porque tiene mucho sentido

rudtek rudtek
19 ago 2016 23:18:21

@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í.

birgire birgire
19 ago 2016 23:26:35

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

birgire birgire
19 ago 2016 23:31:30

El código anterior no funciona para mí en WP 4.6.1.

wired wired
29 sept 2016 21:13:18

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+.

birgire birgire
29 sept 2016 23:23:40

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.

wired wired
2 oct 2016 03:26:48

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

birgire birgire
2 oct 2016 12:58:18

Creo que por alguna razón no engancha la acción, porque tu snippet DEBERÍA funcionar. He revisado wp_send_new_user_notifications y wp_new_user_notification en user.php y pluggable.php.

gdfgdfg gdfgdfg
6 feb 2019 00:36:47
Mostrar los 6 comentarios restantes
8

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.

18 ago 2016 09:23:40
Comentarios

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

rudtek rudtek
19 ago 2016 21:30:24

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.

Jarod Thornton Jarod Thornton
19 ago 2016 22:13:52

@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.

bosco bosco
19 ago 2016 22:29:39

@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.

bosco bosco
19 ago 2016 22:29:52

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ó.

Jarod Thornton Jarod Thornton
19 ago 2016 22:31:21

@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 ;)

bosco bosco
19 ago 2016 22:35:26

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

Jarod Thornton Jarod Thornton
19 ago 2016 22:36:25

Esto funcionó. Lo estaba poniendo como un plugin. ¡Gracias @Bosco! ¡Gracias también @Jamerson!

rudtek rudtek
19 ago 2016 23:17:24
Mostrar los 3 comentarios restantes
0

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".

17 ene 2024 16:50:38
0

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...

16 ago 2016 21:56:02
0

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' );
16 oct 2022 20:18:32