Dezactivarea email-urilor de înregistrare pentru utilizatori noi
Aș dori să dezactivez emailurile pe care le primește administratorul când se înregistrează un utilizator nou. Primim multe emailuri din cauza înregistrărilor noi (sunt înregistrări legitime) dar nu vreau să mai văd emailul care mă anunță că cineva s-a înregistrat iar și iar.
Până acum am încercat să instalez plugin-uri dar nu funcționează. (chiar și suportul spune că nu mai funcționează). Când am căutat pe aici singura întrebare pe care am putut să o găsesc a fost Dezactivarea emailurilor admin pentru înregistrări noi care este de acum trei ani și nu pare să mai funcționeze. Am încercat cu acest cod:
// Redefinește funcția de notificare utilizator
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(__('Înregistrare utilizator nou pe blogul tău %s:'), get_option('blogname')) . "rnrn";
$message .= sprintf(__('Nume utilizator: %s'), $user_login) . "rnrn";
$message .= sprintf(__('E-mail: %s'), $user_email) . "rn";
// @wp_mail(get_option('admin_email'), sprintf(__('[%s] Înregistrare Utilizator Nou'), get_option('blogname')), $message);
if ( empty($plaintext_pass) )
return;
$message = __('Salut,') . "rnrn";
$message .= sprintf(__("Bun venit pe %s! Iată cum te poți autentifica:"), get_option('blogname')) . "rnrn";
$message .= wp_login_url() . "rn";
$message .= sprintf(__('Nume utilizator: %s'), $user_login) . "rn";
$message .= sprintf(__('Parolă: %s'), $plaintext_pass) . "rnrn";
$message .= sprintf(__('Dacă întâmpini probleme, te rog să mă contactezi la %s.'), get_option('admin_email')) . "rnrn";
$message .= __('La revedere!');
wp_mail($user_email, sprintf(__('[%s] Numele tău de utilizator și parola'), get_option('blogname')), $message);
}
}
în functions.php al temei mele (are linia @wp_mail comentată) și am încercat chiar să comentez acea linie în wp-includes/pluggable.php
dar tot primesc emailurile.
Folosesc WordPress 4.5.3 acum. (ACTUALIZAT la 4.6 ca parte a acestui proces)
Încerc să fiu cât mai clar posibil. Nu vreau ca emailul care merge către utilizator să se oprească deoarece ei ar trebui să îl primească în continuare, dar cum pot face ca emailul către admin să se oprească?

Abordare pentru WordPress 4.6+
Verificați patch-ul din tichetul #36009 care a fost integrat în versiunea WordPress 4.6.
Acesta adaugă opțiunea 'user'
pentru parametrul de intrare $notify
al funcției wp_new_user_notification()
, pentru a omite trimiterea acelor email-uri către administrator.
Cum funcționează
Funcția register_new_user()
conține această parte:
do_action( 'register_new_user', $user_id );
Notificările prin email sunt activate cu:
add_action( 'register_new_user', 'wp_send_new_user_notifications' );
unde callback-ul este definit ca:
function wp_send_new_user_notifications( $user_id, $notify = 'both' ) {
wp_new_user_notification( $user_id, null, $notify );
}
Soluție alternativă
Putem încerca această abordare (netestată) cu un callback personalizat și eliminarea celui implicit:
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 );
}
unde schimbăm valoarea implicită de la 'both'
la 'user'
.
Este important de menționat că wp_send_new_user_notifications()
este de asemenea conectată la următoarele acțiuni:
network_site_new_created_user
network_site_users_created_user
network_user_new_created_user
edit_user_created_user
Putem gestiona aceste cazuri într-un mod similar cu cel descris mai sus.

acest lucru părea minunat. Am actualizat la versiunea 4.6 și am încercat, dar în continuare îmi trimite notificarea de utilizator nou.

Este listat ca un patch și necesită teste unitare. Ape nelmăsurate.

Tocmai am încercat asta pe o instalare proaspătă fără pluginuri și cu tema implicită, fără succes.

@Jarmerson Mulțumesc pentru testare, tocmai am observat o mică problemă cu fragmentul meu de cod, o voi rezolva ;-) PS: testul unitar a fost adăugat aici.

@rudtek Tocmai am actualizat răspunsul, am corectat o greșeală de tipar. L-am testat și acum pare să funcționeze pe instalarea mea de test.

Mulțumesc pentru comentariu @wired. Am testat acest lucru cu succes pe o instalare simplă, ca un plugin, dacă îmi amintesc corect. Ai primit vreo eroare PHP de la cod? Presupune PHP 5.3+.

Am pus pe un site live BuddyPress cu multe plugin-uri, așa că ar putea fi un conflict, nu știu. Doar că nu funcționează. Nu pot să-l testez local.

A trecut ceva timp de când am folosit BuddyPress, așa că nu am testat acolo, dar pluginurile pot interfera mereu. @wired

Abordare Plugabilă Generică pentru WordPress < 4.6 (Vezi Răspunsul lui @birgire pentru versiunile > 4.6)
Funcțiile plugabile sunt una dintre relicvele mai deprimante ale trecutului WordPress și vin cu o serie de complexități. Faptul că modificarea directă a fișierului de bază (ceea ce este complet nerecomandat, așa cum a menționat @Jarmerson în comentarii) nu a funcționat, mă face să suspectez că un alt plugin din instalarea ta poate suprascrie funcția plugabilă.
Fișierul wp-includes/pluggable.php
este încărcat după pluginurile active și mu-plugins, dar înaintea temei active; asta înseamnă că "Funcțiile Plugabile" pot fi suprascrise doar de declarații dintr-un plugin.
Modificarea pe care ai descoperit-o în celălalt răspuns se aplică unei versiuni mult mai vechi de WordPress. În procesul de înlocuire a oricărei funcții plugabile, ar trebui să începi cu funcția originală așa cum există în versiunea ta de WordPress (în cazul tău, v4.5.3). Făcând acest lucru, soluția devine următoarea (comentarii omise; fără linii adăugate, doar eliminate):
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(__('Nume de utilizator: %s'), $user->user_login) . "\r\n\r\n";
$message .= __('Pentru a-ți seta parola, vizitează următoarea adresă:') . "\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] Informații despre numele de utilizator și parolă'), $blogname), $message);
}
Am omis verificarea tradițională if( !function_exists() )
care de obicei încapsulează o suprascriere plugabilă, deoarece în acest caz o potențială eroare de declarație duplicată este de dorit - ar indica că un alt plugin a suprascris funcția wp_new_user_notification()
înaintea ta, și astfel încercarea ta de a face același lucru este complet ignorată.
Aș recomanda plasarea acestei funcții într-un mu-plugin deoarece reduce șansa ca un alt plugin să te întreacă la post. În orice scenariu, nu modifica fișierul de bază wp-includes/pluggable.php
cu codul de mai sus.

Am încercat asta și primesc această eroare: Eroare fatală: Nu se poate redeclara wp_new_user_notification() (declarată anterior în /home/tdh/public_html/wp-includes/pluggable.php:1709) în /home/tdh/public_html/wp-content/themes/tdh/functions.php la linia 71

Această eroare apare din cauza faptului că funcția wp_new_user_notification()
este deja declarată. Ce trebuie să faci este să o suprascrii prin includerea verificării function_exists()
în care este încapsulată.
Dacă incluzi acest lucru, cred că funcția ta va avea prioritate față de nucleul WP.

@Jarmerson verificarea cu function_exists() nu suprascrie nimic - doar sări complet peste declarația funcției tale în cazul în care funcția a fost deja declarată. Tot ce face este să suprime o eroare fatală de coliziune prin ignorarea codului tău.

@rudtek se pare că ai plasat soluția mea în tema ta. Aceasta trebuie să fie pusă într-un plugin - suprascrierile funcțiilor pluggable într-o temă vor întotdeauna eșua.

El folosește o instalație independentă. Totuși, tocmai am testat codul tău pe o instalație proaspătă și FUNCȚIONEAZĂ!!! :D
@rudtek intră în folderul de plugin-uri și creează un fișier nou, de exemplu disable-admin-notices.php
și lipește acest cod imediat după tag-ul de deschidere /*
Plugin Name: Disable Admin Email Notices
*/
apoi lipește codul lui bosco și activează din plugin-uri. A funcționat pentru mine.

@Jarmerson un "mu-plugin" este un "must-use plugin" - plugin-urile plasate într-un folder special fac ca acestea să rămână întotdeauna "activate" și să se încarce mai devreme decât alte plugin-uri. Nicio legătură cu WPMU ;)

Pentru WordPress 6.1+
Există hook-uri pe care le puteți utiliza pentru gestionarea emailurilor de bază trimise:
add_filter('wp_send_new_user_notification_to_admin', '__return_false');
add_filter('wp_send_new_user_notification_to_user', '__return_false');
Aceasta va opri o instanță de a trimite emailuri cu subiectul "[NUMELE SITE-ULUI] Înregistrare Utilizator Nou".

După o cercetare am ajuns la concluzia că poți dezactiva toate emailurile de notificare, dar nu și pe cele care sunt trimise către administrator.
Referitor la întrebarea ta inițială, pot oferi câteva sfaturi despre cum să gestionăm emailurile de notificare nedorite din înregistrarea utilizatorilor WordPress și resetarea parolei.
Presupunând că ai un mediu cPanel care rulează instalarea ta, urmează pur și simplu acești pași și vei elimina efectiv acele emailuri specifice.
Accesează Filtrarea la Nivel de Cont din administrarea cPanel. În această zonă poți gestiona filtrele pentru contul tău principal. Vrei să Creezi un Filtru și să procedezi la crearea unui Filtru Nou pentru Toate Emailurile de pe Contul Tău.
În câmpul Regulă selectează Către și este egal cu. Notă: Poți crea și filtre pentru alte condiții. Ultimul câmp este o zonă de text unde introduci adresa de email cu care lucrezi. Sub zona regulilor este locul unde se întâmplă magia. Selectează Renunță la Mesaj. Există și alte opțiuni.
Întotdeauna am creat o adresă de email pe care știam că nu va fi folosită și am creat filtrul folosind-o.
Aș putea continua cu cârlige pluggable din WordPress și altele, dar nu există nimic care să facă exact ceea ce ai dori. Pacat...

Această soluție a funcționat pentru mine. https://gist.github.com/someguy9/b24866f521ec3eb20b13feb4c72a6afd#file-disable-wordpress-admin-new-user-notification-php
<?php
// Dezactivează notificarea de utilizator nou trimisă administratorului site-ului
function smartwp_disable_new_user_notifications() {
// Elimină email-urile originale de creare a utilizatorului
remove_action( 'register_new_user', 'wp_send_new_user_notifications' );
remove_action( 'edit_user_created_user', 'wp_send_new_user_notifications', 10, 2 );
// Adaugă o nouă funcție pentru preluarea creării email-urilor
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' ){
// Trimite email doar noului utilizator, nu și administratorului
$notify = 'user';
}
wp_send_new_user_notifications( $user_id, $notify );
}
add_action( 'init', 'smartwp_disable_new_user_notifications' );
