Invia email di attivazione utente durante la creazione programmatica dell'utente

11 ott 2013, 15:45:25
Visualizzazioni: 31.2K
Voti: 11

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.

0
Tutte le risposte alla domanda 3
14
12

Per completare il processo di attivazione dell'utente è necessario seguire questi passaggi:

  1. dopo la creazione di un nuovo utente, aggiungi un campo personalizzato che indica che questo utente deve attivare il proprio account
  2. invia un'email con il codice di attivazione, fornendo un link in questa email a una pagina dove l'utente potrà attivarsi
  3. implementa la pagina di attivazione
  4. 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.

11 ott 2013 16:42:49
Commenti

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?

s1lv3r s1lv3r
11 ott 2013 17:05:29

acc... :) ottima osservazione, lo correggerò tra un attimo :)

Eugene Manuilov Eugene Manuilov
11 ott 2013 17:06:33

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.

Joe Buckle Joe Buckle
11 ott 2013 17:07:21

@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.

s1lv3r s1lv3r
11 ott 2013 17:09:27

@s1lv3r Potrebbe avere qualcosa a che fare con Theme-My-Login?

Joe Buckle Joe Buckle
11 ott 2013 17:10:52

@s1lv3r ho aggiornato la risposta, ora funzionerà :)

Eugene Manuilov Eugene Manuilov
11 ott 2013 17:10:57

@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/.

s1lv3r s1lv3r
11 ott 2013 17:13:08

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

s1lv3r s1lv3r
11 ott 2013 17:16:09

@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.

Joe Buckle Joe Buckle
11 ott 2013 17:17:03

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

Eugene Manuilov Eugene Manuilov
11 ott 2013 17:17:06

@EugeneManuilov Hai ragione. Non volevo essere pignolo. :-)

s1lv3r s1lv3r
11 ott 2013 17:17:56

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 ( ) )

user2477139 user2477139
7 dic 2016 20:14:14

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

user2477139 user2477139
7 dic 2016 20:14:47

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

webstackoverload webstackoverload
28 feb 2025 12:07:37
Mostra i restanti 9 commenti
0

Due opzioni tra cui scegliere:

  1. Utilizzare un plugin, ad esempio User activation email o New User Approve

  2. 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.
11 ott 2013 16:47:28
0

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...
}
16 mag 2017 11:03:59