
Si administras varios sitios, o uno con muchos usuarios, conoces la sensación: la bandeja llena de «Se ha cambiado la contraseña de X», «Algunos plugins se han actualizado» y «Confirma que el correo de administración sigue siendo correcto». Entre tanto ruido, el correo que sí importaba (un error crítico, una actualización fallida) pasa desapercibido.
Esta guía hace un mapa de lo que envía WordPress y te da el código para dejar solo lo útil.
Esto controla qué correos se envían. Si tus correos no llegan o caen en spam, eso es un tema de envío (SMTP, SPF, DKIM), que vimos en otra guía.
El mapa: qué envía WordPress y a quién
Al administrador o administradora del sitio:
- Un usuario nuevo se registró.
- Un usuario cambió su contraseña.
- Resultado de las actualizaciones automáticas (núcleo, plugins y temas).
- Error crítico detectado (modo de recuperación).
- Comentarios nuevos y comentarios pendientes de moderación.
- Cada seis meses, la verificación del correo de administración (esta aparece al entrar al escritorio, no por correo).
A cada usuario:
- Bienvenida con el enlace para crear su contraseña.
- Restablecimiento de contraseña (cuando lo pide).
- Aviso de que su contraseña o su correo cambiaron.
Sin código: los comentarios
En Ajustes → Comentarios, sección Enviarme un correo electrónico cuando, desmarca Alguien publique un comentario y, si no moderas, Un comentario está pendiente de moderación.
El mu-plugin
Guárdalo como wp-content/mu-plugins/cwp-correos.php y borra las secciones que no quieras aplicar:
<?php
/**
* Plugin Name: Correos de WordPress bajo control (Curso WordPress)
*/
// 1. No avisar al admin cada vez que un usuario cambia su contraseña.
remove_action( 'after_password_reset', 'wp_password_change_notification' );
// 2. No avisar al admin de cada registro nuevo (el usuario sí recibe su bienvenida).
remove_action( 'register_new_user', 'wp_send_new_user_notifications' );
add_action( 'register_new_user', function ( $user_id ) {
wp_new_user_notification( $user_id, null, 'user' );
} );
// 3. Actualizaciones automáticas: avisar solo si algo falla.
add_filter( 'auto_core_update_send_email', function ( $enviar, $tipo ) {
return in_array( $tipo, array( 'fail', 'critical' ), true );
}, 10, 2 );
add_filter( 'auto_plugin_update_send_email', 'cwp_solo_si_falla', 10, 2 );
add_filter( 'auto_theme_update_send_email', 'cwp_solo_si_falla', 10, 2 );
function cwp_solo_si_falla( $enviar, $resultados ) {
foreach ( (array) $resultados as $resultado ) {
if ( empty( $resultado->result ) || is_wp_error( $resultado->result ) ) {
return true;
}
}
return false;
}
// 4. Verificación del correo de administración: cada año en vez de cada 6 meses.
add_filter( 'admin_email_check_interval', function () {
return YEAR_IN_SECONDS;
} );
No desactives los avisos al propio usuario de que su contraseña o su correo cambiaron (los filtros send_password_change_email y send_email_change_email). Son la forma en que una persona se entera de que alguien entró a su cuenta.
En la sección 4 podrías devolver 0 para desactivar del todo la verificación, pero es un buen recordatorio de que el correo de administración siga siendo uno que lees. Una vez al año es un buen equilibrio.
A dónde va el correo de error crítico
Cuando un plugin provoca un error grave, WordPress envía un correo con un enlace especial para entrar en modo de recuperación. Va al correo de administración, que muchas veces es el de quien encargó el sitio y no el de quien lo mantiene. Para mandarlo a la persona técnica, agrega en wp-config.php:
define( 'RECOVERY_MODE_EMAIL', '[email protected]' );
Personalizar el correo de bienvenida
El correo que recibe un usuario nuevo es muy escueto. Con el filtro wp_new_user_notification_email puedes reescribirlo (mantén siempre el enlace para crear la contraseña, que WordPress ya incluye en el mensaje original):
<?php
add_filter( 'wp_new_user_notification_email', function ( $correo, $usuario, $sitio ) {
$correo['subject'] = sprintf( 'Bienvenida a %s: crea tu contraseña', $sitio );
$correo['message'] = sprintf( "Hola, %s:\n\nYa tienes una cuenta en %s.\n\n", $usuario->display_name, $sitio )
. $correo['message']
. "\n\nSi tienes dudas, responde este correo.";
return $correo;
}, 10, 3 );
Así agregas un saludo y una despedida sin tocar la parte que contiene el enlace de seguridad.
Silencio total en sitios de prueba
Una copia del sitio para pruebas (staging) tiene los mismos usuarios y pedidos que el real. Si ahí se ejecuta un cron, se cambia el estado de un pedido o se prueba un formulario, el correo puede llegarle a un cliente real.
El filtro pre_wp_mail permite detener cualquier correo antes de que salga. Este mu-plugin solo actúa si el sitio está marcado como entorno de pruebas:
<?php
/**
* Plugin Name: Sin correos en staging (Curso WordPress)
*/
add_filter( 'pre_wp_mail', function ( $retorno, $datos ) {
if ( 'production' === wp_get_environment_type() ) {
return $retorno;
}
$destino = is_array( $datos['to'] ) ? implode( ', ', $datos['to'] ) : $datos['to'];
error_log( sprintf( '[correo bloqueado] Para: %s | Asunto: %s', $destino, $datos['subject'] ) );
return true; // Hacemos creer a WordPress que se envió.
}, 10, 2 );
Y en el wp-config.php de la copia de pruebas:
define( 'WP_ENVIRONMENT_TYPE', 'staging' );
En el sitio real no definas nada (o define production), y los correos saldrán con normalidad. Los correos bloqueados quedan anotados en el debug.log, para que puedas comprobar qué se habría enviado.
Algunos plugins de envío de correo (los de servicios externos con API propia) no pasan por wp_mail(). Si usas uno, desactiva también su envío en la copia de pruebas desde sus ajustes.
¿Hay algún correo de WordPress o de un plugin que no logras silenciar? Cuéntanos en el foro cuál es el asunto exacto y buscamos su hook.





