Creare un'email di benvenuto personalizzata senza plugin
Esiste un modo per personalizzare il contenuto e l'oggetto delle email di benvenuto e verifica inviate durante il processo di registrazione in WordPress? Vorrei utilizzare un hook o un filter senza ricorrere a plugin o alla funzione "pluggable".
Se qualcuno potesse indicarmi la direzione giusta, ne sarei molto grato. Grazie!

Purtroppo dovrai utilizzare la funzionalità delle funzioni pluggable - non ci sono filtri o hook all'interno di quelle funzioni (come puoi vedere dal codice qui sotto). E quel che è peggio, per te, è meglio usare una funzione pluggable in un plugin.
Questo perché definire una nuova funzione pluggable nel functions.php del tuo tema richiede di usare la definizione di una nuova funzione all'interno di un'altra funzione (per poterla chiamare non appena tutti i plugin sono completamente caricati), il che potrebbe non essere ideale (vedi i commenti sotto questo post), ma d'altro canto funziona - vedi il codice sotto il primo.
Per chi non è contrario ai plugin, eccone uno che riscrive una funzione pluggable - salvalo semplicemente in my_plugin.php (o qualsiasi altro nome) nella directory dei plugin e attivalo dal pannello di amministrazione:
<?php
/*
Plugin Name: Name Of The Plugin
Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates
Description: A brief description of the Plugin.
Version: The Plugin's Version Number, e.g.: 1.0
Author: Name Of The Plugin Author
Author URI: http://URI_Of_The_Plugin_Author
License: A "Slug" license name e.g. GPL2
*/
if( !function_exists('new_user_notification') ){
function new_user_notifiaction(){
/**
* Notifica l'amministratore del blog di un nuovo utente, normalmente via email.
*
* @since 2.0
*
* @param int $user_id User ID
* @param string $plaintext_pass Optional. The user's plaintext password
*/
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);
// The blogname option is escaped with esc_html on the way into the database in sanitize_option
// we want to reverse this for the plain text arena of emails.
$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
$message = sprintf(__('New user registration on your site %s:'), $blogname) . "\r\n\r\n";
$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
$message .= sprintf(__('E-mail: %s'), $user_email) . "\r\n";
@wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message);
if ( empty($plaintext_pass) )
return;
$message = sprintf(__('Username: %s'), $user_login) . "\r\n";
$message .= sprintf(__('Password: %s'), $plaintext_pass) . "\r\n";
$message .= wp_login_url() . "\r\n";
wp_mail($user_email, sprintf(__('[%s] Your username and password'), $blogname), $message);
}
}
}
Solo se sei curioso, ecco lo stesso effetto ottenuto dal functions.php con una nuova funzione definita all'interno di un'altra funzione:
//ridefinisci wp_new_user_notification non appena tutti i plugin sono caricati
add_action( 'plugins_loaded', 'new_user_notifiaction' );
function new_user_notifiaction(){
/**
* Notifica l'amministratore del blog di un nuovo utente, normalmente via email.
*
* @since 2.0
*
* @param int $user_id User ID
* @param string $plaintext_pass Optional. The user's plaintext password
*/
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);
// The blogname option is escaped with esc_html on the way into the database in sanitize_option
// we want to reverse this for the plain text arena of emails.
$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
$message = sprintf(__('New user registration on your site %s:'), $blogname) . "\r\n\r\n";
$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
$message .= sprintf(__('E-mail: %s'), $user_email) . "\r\n";
@wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message);
if ( empty($plaintext_pass) )
return;
$message = sprintf(__('Username: %s'), $user_login) . "\r\n";
$message .= sprintf(__('Password: %s'), $plaintext_pass) . "\r\n";
$message .= wp_login_url() . "\r\n";
wp_mail($user_email, sprintf(__('[%s] Your username and password'), $blogname), $message);
}
}

Puoi fornire un esempio di terze parti di una funzione pluggable definita come function dentro una funzione
? È la prima volta che vedo questa cosa...

Purtroppo non posso, ma funziona ;) C'è qualche motivo per cui questo approccio potrebbe causare problemi? Prestazioni? Integrità?

Volevo assicurarmi che non ci fosse una fonte da copia/incolla per questo. È una cattiva pratica dichiarare una funzione dentro un'altra funzione. E per sovrascrivere una pluggable ti basta if( !function_exists('plug_func') ) { function plug_func() {} }
.

Sì, è vero che ho solo bisogno del codice che hai fornito, ma in quel caso il mio codice deve essere caricato prima di quello originale. E il functions.php del tema viene caricato dopo l'origine originale in pluggable.php - da qui l'hook plugins_loaded. E c'è qualche motivo per cui dichiarare una funzione dentro un'altra funzione sia una cattiva idea?

PHP - Funzione dentro una funzione. Buona o cattiva pratica?

OK, grazie. Ho modificato la risposta - ora include un modo standard fatto da plugin oltre al modo non preferibile di definire una funzione dentro un'altra funzione (in questo caso, penso sia meglio che creare una funzione direttamente in un callback, che potrebbe essere un'altra opzione)

Questa sembra un'ottima idea, che potrebbe funzionare anche nel file functions.php:
// Aggiungi filtro per il corpo dell'email di registrazione
add_filter('wp_mail','handle_wp_mail');
function handle_wp_mail($atts) {
/*"Your username and password" è l'oggetto dell'email che WordPress invia dalla "function wp_new_user_notification" nel file "wp-includes/pluggable.php"*/
if (isset ($atts ['subject']) && substr_count($atts ['subject'],'Your username and password')>0 ) {
if (isset($atts['message'])) {
$atts['message'] = 'nuovo corpo del messaggio';
}
}
return ($atts);
}
Basta fare attenzione alla lingua per ottenere la stringa corretta per l'oggetto. (Fonte: http://wordpress.org/support/topic/how-to-change-registration-email-content?replies=3)
