Creare email personalizat de bun venit fără plugin
Există vreo metodă de a personaliza conținutul și subiectul email-urilor de bun venit și de verificare trimise în procesul de înregistrare WordPress? Aș dori să folosesc un hook sau filtru fără a utiliza un plugin sau funcționalitatea "pluggable".
Dacă cineva mă poate îndruma în direcția corectă, aș fi foarte recunoscător. Mulțumesc!

Din păcate, va trebui să utilizați funcțiile pluggable - nu există niciun filtru sau hook în interiorul acelor funcții (după cum puteți vedea din codul de mai jos). Și ce e mai rău, pentru dumneavoastră, este mai bine să folosiți funcția pluggable într-un plugin.
Aceasta deoarece definirea unei noi funcții pluggable în functions.php al temei vă cere să folosiți definirea unei noi funcții în interiorul altei funcții (pentru a o apela imediat ce toate pluginurile sunt încărcate), ceea ce poate fi nepotrivit (vezi comentariile de mai jos), dar pe de altă parte, funcționează - vezi codul de mai jos.
Pentru cei care nu sunt împotriva pluginurilor, iată unul care rescrie o funcție pluggable - salvați-l pur și simplu în my_plugin.php (sau altceva) în directorul de pluginuri și activați-l din panoul de administrare:
<?php
/*
Plugin Name: Numele Pluginului
Plugin URI: http://URL_Pagina_Descriere_Plugin_Si_Actualizari
Description: O scurtă descriere a Pluginului.
Version: Numărul Versiunii Pluginului, ex: 1.0
Author: Numele Autorului Pluginului
Author URI: http://URL_Autor_Plugin
License: Un "Slug" pentru licență, ex. GPL2
*/
if( !function_exists('new_user_notification') ){
function new_user_notifiaction(){
/**
* Notifică administratorul blogului despre un nou utilizator, de obicei prin email.
*
* @since 2.0
*
* @param int $user_id ID-ul utilizatorului
* @param string $plaintext_pass Opțional. Parola în text clar a utilizatorului
*/
function wp_new_user_notification($user_id, $plaintext_pass = '') {
$user = get_userdata( $user_id );
$user_login = stripslashes($user->user_login);
$user_email = stripslashes($user->user_email);
// Opțiunea blogname este escapată cu esc_html la salvarea în baza de date în sanitize_option
// dorim să inversăm acest lucru pentru emailurile în format text simplu.
$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
$message = sprintf(__('Înregistrare utilizator nou pe site-ul dumneavoastră %s:'), $blogname) . "\r\n\r\n";
$message .= sprintf(__('Nume de utilizator: %s'), $user_login) . "\r\n\r\n";
$message .= sprintf(__('E-mail: %s'), $user_email) . "\r\n";
@wp_mail(get_option('admin_email'), sprintf(__('[%s] Înregistrare Utilizator Nou'), $blogname), $message);
if ( empty($plaintext_pass) )
return;
$message = sprintf(__('Nume de utilizator: %s'), $user_login) . "\r\n";
$message .= sprintf(__('Parolă: %s'), $plaintext_pass) . "\r\n";
$message .= wp_login_url() . "\r\n";
wp_mail($user_email, sprintf(__('[%s] Numele de utilizator și parola dumneavoastră'), $blogname), $message);
}
}
}
Doar dacă sunteți curios, iată același efect realizat din functions.php cu o nouă funcție definită în interiorul altei funcții:
//redefinește wp_new_user_notification imediat ce toate pluginurile sunt încărcate
add_action( 'plugins_loaded', 'new_user_notifiaction' );
function new_user_notifiaction(){
/**
* Notifică administratorul blogului despre un nou utilizator, de obicei prin email.
*
* @since 2.0
*
* @param int $user_id ID-ul utilizatorului
* @param string $plaintext_pass Opțional. Parola în text clar a utilizatorului
*/
function wp_new_user_notification($user_id, $plaintext_pass = '') {
$user = get_userdata( $user_id );
$user_login = stripslashes($user->user_login);
$user_email = stripslashes($user->user_email);
// Opțiunea blogname este escapată cu esc_html la salvarea în baza de date în sanitize_option
// dorim să inversăm acest lucru pentru emailurile în format text simplu.
$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
$message = sprintf(__('Înregistrare utilizator nou pe site-ul dumneavoastră %s:'), $blogname) . "\r\n\r\n";
$message .= sprintf(__('Nume de utilizator: %s'), $user_login) . "\r\n\r\n";
$message .= sprintf(__('E-mail: %s'), $user_email) . "\r\n";
@wp_mail(get_option('admin_email'), sprintf(__('[%s] Înregistrare Utilizator Nou'), $blogname), $message);
if ( empty($plaintext_pass) )
return;
$message = sprintf(__('Nume de utilizator: %s'), $user_login) . "\r\n";
$message .= sprintf(__('Parolă: %s'), $plaintext_pass) . "\r\n";
$message .= wp_login_url() . "\r\n";
wp_mail($user_email, sprintf(__('[%s] Numele de utilizator și parola dumneavoastră'), $blogname), $message);
}
}

Poți să oferi un exemplu de la o terță parte de o funcție pluggable definită ca o funcție în interiorul unei funcții
? Este prima dată când văd așa ceva...

Din păcate nu pot, dar funcționează ;) Există vreun motiv pentru care această abordare ar putea cauza probleme? Performanță? Integritate?

Voiam să mă asigur că nu există o sursă copy/paste pentru asta. Este o practică proastă să declari o funcție în interiorul altei funcții. Și pentru a suprascrie o funcție pluggable ai nevoie doar de if( !function_exists('plug_func') ) { function plug_func() {} }
.

Da, este adevărat că am nevoie doar de codul pe care l-ai furnizat, dar în acest caz codul meu trebuie să fie încărcat înaintea celui original. Iar functions.php al temei este încărcat după sursa originală din pluggable.php - de aceea am folosit hook-ul plugins_loaded. Și există vreun motiv pentru care declararea unei funcții în interiorul altei funcții ar fi o idee proastă?

PHP - Funcție în interiorul unei funcții. Bună sau rea practică?

OK, mulțumesc. Am modificat răspunsul - acum include o metodă standard realizată dintr-un plugin, pe lângă varianta mai puțin preferată de definire a unei funcții în interiorul altei funcții (în acest caz, cred că e mai bine decât crearea unei funcții direct într-un callback, care ar putea fi o altă opțiune)

Aceasta pare o idee bună, care ar funcționa și în functions.php:
// Adaugă un filtru pentru corpul email-ului de înregistrare
add_filter('wp_mail','handle_wp_mail');
function handle_wp_mail($atts) {
/*"Your username and password" este subiectul Email-ului trimis de WordPress din "funcția wp_new_user_notification" în fișierul "wp-includes/pluggable.php"*/
if (isset ($atts ['subject']) && substr_count($atts ['subject'],'Your username and password')>0 ) {
if (isset($atts['message'])) {
$atts['message'] = 'new body';
}
}
return ($atts);
}
Doar fii atent la limbă pentru a obține șirul de subiect corect. (Sursa: http://wordpress.org/support/topic/how-to-change-registration-email-content?replies=3)
