Disattivare le email di registrazione dei nuovi utenti
Vorrei disattivare le email che l'amministratore riceve quando un nuovo utente si registra. Stiamo ricevendo molte email a causa di nuove registrazioni (sono registrazioni legittime) ma non voglio semplicemente continuare a vedere l'email che mi notifica che qualcuno si è registrato ancora e ancora.
Finora ho provato installando plugin ma non funzionano. (il supporto stesso dice che non funzionano più). Cercando qui intorno l'unica domanda che sono riuscito a trovare è stata Disattivare le email amministrative per le nuove registrazioni utente che risale a tre anni fa e sembra non funzionare più. Ho provato con questo codice:
// Ridefinisce la funzione di notifica utente
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(__('Nuova registrazione utente sul tuo blog %s:'), get_option('blogname')) . "rnrn";
$message .= sprintf(__('Nome utente: %s'), $user_login) . "rnrn";
$message .= sprintf(__('E-mail: %s'), $user_email) . "rn";
// @wp_mail(get_option('admin_email'), sprintf(__('[%s] Nuova Registrazione Utente'), get_option('blogname')), $message);
if ( empty($plaintext_pass) )
return;
$message = __('Ciao,') . "rnrn";
$message .= sprintf(__("Benvenuto su %s! Ecco come accedere:"), get_option('blogname')) . "rnrn";
$message .= wp_login_url() . "rn";
$message .= sprintf(__('Nome utente: %s'), $user_login) . "rn";
$message .= sprintf(__('Password: %s'), $plaintext_pass) . "rnrn";
$message .= sprintf(__('Se hai problemi, contattami a %s.'), get_option('admin_email')) . "rnrn";
$message .= __('Ciao!');
wp_mail($user_email, sprintf(__('[%s] Il tuo nome utente e password'), get_option('blogname')), $message);
}
}
nel file functions.php del mio tema (ha la riga @wp_mail commentata) e ho anche provato a commentare quella riga in wp-includes/pluggable.php
ma continuo a ricevere le email.
Sto usando WordPress 4.5.3 al momento. (AGGIORNATO a 4.6 durante questo processo)
Sto cercando di essere il più chiaro possibile. Non voglio che si interrompa l'email che va all'utente poiché dovrebbero continuare a riceverla, ma come posso fare in modo che l'email all'amministratore si fermi?

Approccio per WordPress 4.6+
Controlla la patch nel ticket #36009 che è stata integrata nella versione 4.6 di WordPress.
Aggiunge l'opzione 'user'
per il parametro di input $notify
di wp_new_user_notification()
, per saltare l'invio di quelle email all'amministratore.
Come funziona
La funzione register_new_user()
contiene questa parte:
do_action( 'register_new_user', $user_id );
Le notifiche email vengono attivate con:
add_action( 'register_new_user', 'wp_send_new_user_notifications' );
dove il callback è definito come:
function wp_send_new_user_notifications( $user_id, $notify = 'both' ) {
wp_new_user_notification( $user_id, null, $notify );
}
Soluzione alternativa
Potremmo quindi provare questo approccio (non testato) con un callback personalizzato e rimuovere quello predefinito:
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 );
}
dove cambiamo il valore predefinito da 'both'
a 'user'
.
Vale la pena menzionare che wp_send_new_user_notifications()
è anche collegata a queste azioni:
network_site_new_created_user
network_site_users_created_user
network_user_new_created_user
edit_user_created_user
Potremmo gestirle in modo simile a quanto descritto sopra.

sembrava fantastico. Ho aggiornato alla versione 4.6 e ho provato, ma continua a inviarmi la notifica per i nuovi utenti.

È elencato come una patch e richiede test unitari. Acque inesplorate.

Ho appena provato su un'installazione pulita senza plugin e con il tema predefinito, ma senza successo.

@Jarmerson Grazie per il test, ho appena notato un piccolo problema con il mio snippet, lo sistemerò ;-) Ps: il test unitario è stato aggiunto qui.

@rudtek Ho appena aggiornato la risposta, corretto un refuso. L'ho testato e sembra funzionare ora nella mia installazione di test.

Grazie per il tuo commento @wired. Ho testato questo codice con successo su un'installazione vanilla, come plugin, se ricordo bene. Hai ricevuto un errore PHP dal codice? Presuppone PHP 5.3+.

L'ho provato su un sito BuddyPress in produzione con molti plugin quindi potrebbe esserci un conflitto, non so. Semplicemente non funziona. Non sono in grado di testarlo localmente.

È passato un po' di tempo dall'ultima volta che ho usato BuddyPress, quindi non l'ho testato lì, ma i plugin possono sempre interferire. @wired

Approccio Pluggable Generico per WordPress < 4.6 (Vedi la risposta di @birgire per versioni > 4.6)
Le funzioni pluggable sono uno dei relitti più deprimenti del passato di WordPress e portano con sé una serie di complessità. Il fatto che modificare direttamente il file core (cosa del tutto sconsigliabile, come ha sottolineato @Jarmerson nei commenti) non abbia funzionato mi fa sospettare che un altro plugin nella tua installazione possa aver sovrascritto la funzione pluggable.
Il file wp-includes/pluggable.php
viene caricato dopo i plugin attivi e i mu-plugin, ma prima del tema attivo; ciò significa che le "Funzioni Pluggable" possono essere sostituite solo da dichiarazioni presenti in un plugin.
La modifica che hai trovato nell'altra risposta si applica a una versione molto più vecchia di WordPress. Nel processo di sostituzione di qualsiasi funzione pluggable, dovresti iniziare con la funzione originale così come esiste nella versione della tua installazione (nel tuo caso, la v4.5.3). Facendo così, la soluzione diventa la seguente (commenti omessi; nessuna riga aggiunta, solo rimosse):
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(__('Username: %s'), $user->user_login) . "\r\n\r\n";
$message .= __('Per impostare la tua password, visita il seguente indirizzo:') . "\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] Informazioni sul tuo username e password'), $blogname), $message);
}
Ho omesso il tradizionale controllo if( !function_exists() )
che tipicamente racchiude un override pluggable perché in questo caso un eventuale errore di dichiarazione duplicata è auspicabile - indicherebbe che un altro plugin ha sovrascritto la funzione wp_new_user_notification()
prima di te, e quindi che il tuo tentativo di farlo viene completamente ignorato.
Consiglio di inserire questa funzione in un mu-plugin in quanto riduce la possibilità che un altro plugin ti preceda. In ogni scenario, non modificare il file core wp-includes/pluggable.php
con il codice sopra.

ho provato questo e ottengo questo errore: Errore fatale: Non è possibile ridefinire wp_new_user_notification() (già dichiarata in /home/tdh/public_html/wp-includes/pluggable.php:1709) in /home/tdh/public_html/wp-content/themes/tdh/functions.php alla riga 71

Quell'errore è dovuto al fatto che la funzione wp_new_user_notification()
è già stata dichiarata. Quello che devi fare è sovrascriverla includendo il controllo function_exists()
in cui è racchiusa.
Se includi questo, credo che la tua funzione avrà la priorità rispetto al core di WP.

@Jarmerson il controllo function_exists() non sovrascrive nulla - salta completamente la tua dichiarazione della funzione nel caso in cui la funzione sia già stata dichiarata. Tutto ciò che fa è sopprimere un errore fatale di collisione ignorando il tuo codice.

@rudtek sembra che tu abbia inserito la mia soluzione nel tuo tema. Deve obbligatoriamente essere posizionata in un plugin - le override di funzioni pluggabili in un tema falliranno sempre.

Lui sta lavorando su un'installazione standalone. Comunque ho appena testato il tuo codice su una installazione fresca e FUNZIONA!!! :D
@rudtek entra nella cartella dei plugin e crea semplicemente un nuovo file ad esempio disable-admin-notices.php
e incolla questo subito dopo il tag di apertura /*
Plugin Name: Disable Admin Email Notices
*/
poi incolla il codice di bosco e attivalo dai plugin. Ha funzionato per me.

@Jarmerson un "mu-plugin" è un "plugin must-use" - i plugin posizionati in una cartella speciale risultano sempre "attivati" e vengono caricati prima degli altri plugin. Nessuna relazione con WPMU ;)

Per WordPress 6.1+
Ci sono hook che puoi utilizzare per gestire le email di base inviate dal sistema:
add_filter('wp_send_new_user_notification_to_admin', '__return_false');
add_filter('wp_send_new_user_notification_to_user', '__return_false');
Questo impedirà all'installazione di inviare email con l'oggetto "[NOMESITO] Registrazione Nuovo Utente".

Dopo alcune ricerche, ho determinato che puoi disabilitare tutte le email di notifica, ma non quelle che vengono inviate all'amministratore.
Per rispondere alla tua domanda originale, posso offrirti alcuni consigli su come gestire le email di notifica indesiderate dalla registrazione degli utenti di WordPress e le email di reset della password.
Supponendo che tu abbia un ambiente cPanel che gestisce la tua installazione, segui semplicemente questi passaggi e avrai efficacemente rimosso quelle specifiche email.
Accedi a Filtri a Livello di Account dall'amministrazione di cPanel. In questa area puoi gestire i filtri per il tuo account principale. Devi Creare un Filtro e procedere a creare un Nuovo Filtro per Tutte le Email del Tuo Account.
Nel campo Regola seleziona A e uguale a. Nota: Puoi anche creare filtri per altre condizioni. L'ultimo campo è un'area di testo dove inserisci l'indirizzo email con cui stai lavorando. Sotto l'area delle regole è dove avviene la magia. Seleziona Scarta Messaggio. Ci sono anche altre opzioni.
Ho sempre creato un indirizzo email che so non verrà utilizzato e ho creato il filtro utilizzandolo.
Potrei continuare a parlare di hook pluggable di WordPress e simili, ma non c'è nulla che faccia esattamente quello che desideri. Peccato...

Questa soluzione ha funzionato per me. https://gist.github.com/someguy9/b24866f521ec3eb20b13feb4c72a6afd#file-disable-wordpress-admin-new-user-notification-php
<?php
// Disabilita la notifica di nuovo utente inviata all'amministratore del sito
function smartwp_disable_new_user_notifications() {
// Rimuove le email originali di creazione utente
remove_action( 'register_new_user', 'wp_send_new_user_notifications' );
remove_action( 'edit_user_created_user', 'wp_send_new_user_notifications', 10, 2 );
// Aggiunge una nuova funzione per gestire la creazione delle 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' ){
// Invia solo l'email al nuovo utente, non all'amministratore
$notify = 'user';
}
wp_send_new_user_notifications( $user_id, $notify );
}
add_action( 'init', 'smartwp_disable_new_user_notifications' );
