Invia email di attivazione utente durante la creazione programmatica dell'utente
Mi chiedevo se qualcuno qui potesse aiutarmi.
In pratica, ho creato un modulo di registrazione personalizzato che, una volta validato, inserisce un utente nella tabella degli utenti.
function _new_user($data) {
// Separa i Dati
$default_newuser = array(
'user_pass' => wp_hash_password( $data['user_pass']),
'user_login' => $data['user_login'],
'user_email' => $data['user_email'],
'first_name' => $data['first_name'],
'last_name' => $data['last_name'],
'role' => 'pending'
);
wp_insert_user($default_newuser);
}
Ora, quello che deve fare invece di inviare l'email di conferma, che so di poter fare con il seguente codice.
wp_new_user_notification($user_id, $data['user_pass']);
Voglio invece inviare un'email di attivazione utente. Ho provato diverse soluzioni ma non riesco a trovare nulla di concreto. Spero che qualcuno abbia già affrontato questo problema in precedenza.

Per completare il processo di attivazione dell'utente è necessario seguire questi passaggi:
- dopo la creazione di un nuovo utente, aggiungi un campo personalizzato che indica che questo utente deve attivare il proprio account
- invia un'email con il codice di attivazione, fornendo un link in questa email a una pagina dove l'utente potrà attivarsi
- implementa la pagina di attivazione
- quando un utente tenta di accedere, verifica se esiste quel campo personalizzato. Se esiste, non permettergli l'accesso e mostra invece un messaggio di errore di attivazione.
Aggiungi campo personalizzato e invia email:
function _new_user($data) {
// Separa i dati
$default_newuser = array(
'user_pass' => wp_hash_password( $data['user_pass']),
'user_login' => $data['user_login'],
'user_email' => $data['user_email'],
'first_name' => $data['first_name'],
'last_name' => $data['last_name'],
'role' => 'pending'
);
$user_id = wp_insert_user($default_newuser);
if ( $user_id && !is_wp_error( $user_id ) ) {
$code = sha1( $user_id . time() );
$activation_link = add_query_arg( array( 'key' => $code, 'user' => $user_id ), get_permalink( /* INSERISCI QUI L'ID DELLA PAGINA DI ATTIVAZIONE */ ));
add_user_meta( $user_id, 'has_to_be_activated', $code, true );
wp_mail( $data['user_email'], 'OGGETTO ATTIVAZIONE', 'COMPLIMENTI BLA BLA BLA. ECCO IL TUO LINK DI ATTIVAZIONE: ' . $activation_link );
}
}
Controlla l'attivazione dell'utente al login:
// sovrascrivi la funzione core
if ( !function_exists('wp_authenticate') ) :
function wp_authenticate($username, $password) {
$username = sanitize_user($username);
$password = trim($password);
$user = apply_filters('authenticate', null, $username, $password);
if ( $user == null ) {
// TODO quale dovrebbe essere il messaggio di errore? (O questi casi accadrebbero?)
// Necessario solo se tutti i gestori di autenticazione falliscono nel restituire qualcosa.
$user = new WP_Error('authentication_failed', __('<strong>ERRORE</strong>: Nome utente non valido o password errata.'));
} elseif ( get_user_meta( $user->ID, 'has_to_be_activated', true ) != false ) {
$user = new WP_Error('activation_failed', __('<strong>ERRORE</strong>: Utente non attivato.'));
}
$ignore_codes = array('empty_username', 'empty_password');
if (is_wp_error($user) && !in_array($user->get_error_code(), $ignore_codes) ) {
do_action('wp_login_failed', $username);
}
return $user;
}
endif;
Pagina di attivazione:
add_action( 'template_redirect', 'wpse8170_activate_user' );
function wpse8170_activate_user() {
if ( is_page() && get_the_ID() == /* INSERISCI QUI L'ID DELLA PAGINA DI ATTIVAZIONE */ ) {
$user_id = filter_input( INPUT_GET, 'user', FILTER_VALIDATE_INT, array( 'options' => array( 'min_range' => 1 ) ) );
if ( $user_id ) {
// ottieni il campo meta hash di attivazione dell'utente
$code = get_user_meta( $user_id, 'has_to_be_activated', true );
if ( $code == filter_input( INPUT_GET, 'key' ) ) {
delete_user_meta( $user_id, 'has_to_be_activated' );
}
}
}
}
Questo è il tuo punto di partenza, vai avanti e adattalo alle tue esigenze.

Buon post. Ma penso che ti sia sfuggito un dettaglio. Quando impedisci l'accesso agli utenti non autorizzati, come riesci a ottenere l'user_id da get_current_user_id() nella pagina di attivazione?

Grazie per queste informazioni fantastiche. Stavo verificando se ci fosse una soluzione integrata per innescare l'invio di un'e-mail di attivazione, dato che puoi "reinviare l'attivazione" nel pannello di amministrazione. Pensavo che inserendo un utente come in sospeso potesse essere generato un codice di attivazione e inserito nel database, ma dopo ulteriori verifiche ho scoperto che "ovviamente" non è così :) Comunque. Tutto ha senso e grazie ancora.

@JoeBuckle È strano. Non dovresti avere affatto un link resend activation
in un'installazione standard. Per caso hai già installato un plugin per questo? Anche BuddyPress include una funzionalità di attivazione utente già integrata.

@JoeBuckle La pagina delle funzionalità del plugin dice: Richiedi che gli utenti vengano approvati o confermino l'indirizzo email al momento della registrazione
http://wordpress.org/plugins/theme-my-login/.

@EugeneManuilov Ottimo lavoro. Forse potresti anche usare add_role() per aggiungere un ruolo pending-role senza alcuna capacità. :-)

@s1lv3r ah sì hai ragione. Theme-My-Login è in grado di fare molte cose ed è presente su questo sito da un po'. Ma ora sto implementando un processo di abbonamento paywall con un periodo gratuito ecc... è solo un po' complicato quindi devo lavorare nativamente. Alla fine di tutto questo, quel plugin sarà disabilitato.

@s1lv3r come ho detto è solo un punto di partenza, tutto il resto è al di fuori dello scopo della mia risposta :)

sto ricevendo un errore: WP_Error Object ( [errors] => Array ( [empty_user_login] => Array ( [0] => Non è possibile creare un utente con un nome di login vuoto. ) ) [error_data] => Array ( ) )

tuttavia quando stampo il login dell'utente e la mail posso vedere i dati

Ho una domanda: voglio creare un pulsante esterno front-end "Invia di nuovo l'attivazione" come in wp-admin -> utenti -> in attesa (Invia di nuovo l'attivazione). Ma mi serve nella pagina front-end. Non voglio creare una pagina di attivazione personalizzata, solo reinviare l'email con una funzione predefinita di WordPress

Due opzioni tra cui scegliere:
Utilizzare un plugin, ad esempio User activation email o New User Approve
Scrivere il codice personalizzato.
Alcune funzioni utili per iniziare:
- wp_mail() per inviare l'email,
- add_user_meta() per salvare una chiave di attivazione per l'utente,
- generare un link contenente la chiave e inserirlo nell'email, creare una pagina in WordPress che intercetti il parametro della chiave (ad esempio utilizzando add_shortcode()),
- usare get_user_meta() per verificare la chiave di attivazione rispetto a quella memorizzata nel database, inserire un altro meta key per contrassegnare l'utente come attivato in caso di successo,
- aggiungere una funzione al filtro authenticate per impedire l'accesso agli utenti non ancora attivati.

Puoi ottenere l'user_id facendo questo durante l'autenticazione:
$username='email utente fornita dall\'utente nel pannello di login.';
$results = $wpdb->get_row( "SELECT ID FROM wp_users WHERE user_email='".$username."'");
$activation_id = $results->ID;
$activation_key = get_user_meta( $activation_id, 'has_to_be_activated', true );
if($activation_key != false )
{
echo '<h4 class="error">Il tuo account non è ancora stato attivato.<br /> Per attivarlo controlla la tua email e clicca sul link di attivazione.</h4>';
}
else{
//autentica il login del tuo utente qui...
}
