Invia e-mail di attivazione dell'utente durante la creazione programmatica dell'utente


9

Mi chiedevo se qualcuno qui potesse essere in grado di aiutare.

Fondamentalmente, ho creato un modulo di registrazione personalizzato che, una volta convalidato, inserisce un utente nella tabella utenti.

function _new_user($data) {

    // Separate Data
    $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, ciò di cui ho bisogno è fare piuttosto che inviare l'e-mail di conferma che so di poter fare con il seguente codice.

wp_new_user_notification($user_id, $data['user_pass']);

Voglio invece inviare un'e-mail di attivazione dell'utente. Ho provato alcune cose ma non riesco a trovare qualcosa di concreto. Spero che qualcuno abbia avuto questo problema prima.

Risposte:


10

Per eseguire il processo di attivazione dell'utente è necessario eseguire i seguenti passaggi:

  1. dopo aver creato un nuovo utente aggiungi un campo utente personalizzato che indica che questo utente deve attivare il suo account
  2. inviare un'e-mail con il codice di attivazione, fornire un collegamento in questa e-mail a una pagina in cui l'utente verrà attivato
  3. implementare la pagina di attivazione
  4. quando l'utente tenta di accedere verificare se quel campo utente personalizzato esiste o meno. Se esiste, non collegarlo e mostrare invece il messaggio di errore di attivazione.

Aggiungi campo personalizzato e invia email:

function _new_user($data) {

    // Separate Data
    $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( /* YOUR ACTIVATION PAGE ID HERE */ ));
        add_user_meta( $user_id, 'has_to_be_activated', $code, true );
        wp_mail( $data['user_email'], 'ACTIVATION SUBJECT', 'CONGRATS BLA BLA BLA. HERE IS YOUR ACTIVATION LINK: ' . $activation_link );
    }
}

Verifica l'attivazione dell'utente all'accesso:

// override core function
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 what should the error message be? (Or would these even happen?)
        // Only needed if all authentication handlers fail to return anything.
        $user = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));
    } elseif ( get_user_meta( $user->ID, 'has_to_be_activated', true ) != false ) {
        $user = new WP_Error('activation_failed', __('<strong>ERROR</strong>: User is not activated.'));
    }

    $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() == /* YOUR ACTIVATION PAGE ID HERE */ ) {
        $user_id = filter_input( INPUT_GET, 'user', FILTER_VALIDATE_INT, array( 'options' => array( 'min_range' => 1 ) ) );
        if ( $user_id ) {
            // get user meta activation hash field
            $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 mancata una cosa. Quando si impedisce agli utenti non autorizzati di accedere, come è possibile ottenere user_id da get_current_user_id () nella pagina di attivazione?
s1lv3r,

1
accidenti ... :) buon punto, lo aggiusterò in un minuto :)
Eugene Manuilov,

Grazie per questa fantastica informazione. Stavo vedendo se esistesse una soluzione di base per innescare l'invio di un'e-mail di attivazione poiché è possibile "inviare nuovamente l'attivazione" nel pannello di amministrazione. Ho pensato che inserendo un utente come in attesa di un codice di attivazione potrebbe essere generato e inserito nel database, ma dopo un'ulteriore ispezione ho scoperto che "ovviamente" senza tale fortuna :) Comunque. Tutto ha un senso e grazie ancora.
Joe Buckle,

@JoeBuckle È strano. Non dovresti avere affatto un resend activationlink su un'installazione vanilla. Ti capita di avere già un plugin installato per questo? Inoltre BuddyPress viene fornito con una funzionalità di attivazione dell'utente pronta all'uso.
s1lv3r,

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

1

Due opzioni tra cui scegliere:

  1. Utilizzare un plug-in, ad esempio Email di attivazione dell'utente o Approvazione nuovo utente

  2. Codifica tu stesso.

Alcune funzioni che dovrebbero iniziare:

  • wp_mail () per inviare l'e-mail,
  • add_user_meta () per salvare una chiave di attivazione per l'utente,
  • genera un link contenente la chiave e inseriscilo nell'email, crea una pagina in wordpress che catturi il tuo key-param (ad esempio usando add_shortcode () ),
  • usa get_user_meta () per verificare la chiave di attivazione rispetto a quella memorizzata nel db, posiziona un'altra meta chiave utente per contrassegnare questo utente come attivato in caso di successo,
  • aggiungere una funzione al filtro di autenticazione per impedire a qualsiasi utente non attivato di accedere.

0

Puoi ottenere user_id eseguendo questa operazione durante l'autenticazione:

$username='user email provided by the user at login panel.';
$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">Your account has not been activated yet.<br /> To activate it check your email and clik on the activation link.</h4>';
 }
else{
//authenticate your user login here...
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.