Wyślij e-mail aktywacyjny użytkownika podczas programowego tworzenia użytkownika

9

Zastanawiałem się, czy ktoś tu może pomóc.

Zasadniczo utworzyłem niestandardowy formularz rejestracyjny, który po sprawdzeniu poprawności wstawia użytkownika do tabeli użytkowników.

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);
} 

Teraz muszę to zrobić zamiast wysyłać wiadomość e-mail z potwierdzeniem, o której wiem, że mogę to zrobić za pomocą następującego kodu.

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

Zamiast tego chcę wysłać e-mail aktywacyjny użytkownika. Próbowałem kilku rzeczy, ale nie mogę znaleźć niczego konkretnego. Mając nadzieję, że ktoś mógł mieć wcześniej ten problem.

Joe Buckle
źródło

Odpowiedzi:

10

Aby przeprowadzić proces aktywacji użytkownika, wykonaj następujące czynności:

  1. po utworzeniu nowego użytkownika dodaj niestandardowe pole użytkownika, które wskazuje, że ten użytkownik musi aktywować swoje konto
  2. wyślij wiadomość e-mail z kodem aktywacyjnym, podaj link w tym e-mailu do strony, na której użytkownik zostanie aktywowany
  3. zaimplementuj stronę aktywacyjną
  4. gdy użytkownik próbuje się zalogować, sprawdź, czy istnieje niestandardowe pole użytkownika. Jeśli istnieje, nie loguj go i zamiast tego pokaż komunikat o błędzie aktywacji.

Dodaj niestandardowe pole i wyślij e-mail:

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 );
    }
}

Sprawdź aktywację użytkownika podczas logowania:

// 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;

Strona aktywacyjna:

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' );
            }
        }
    }
}

To jest twój punkt wyjścia, śmiało i dostosuj go do swoich potrzeb.

Eugene Manuilov
źródło
Dobry post Ale myślę, że przegapiłeś jedną rzecz. Kiedy uniemożliwisz zalogowanie się nieautoryzowanym użytkownikom, w jaki sposób możesz uzyskać identyfikator użytkownika z get_current_user_id () na stronie aktywacyjnej?
s1lv3r
1
cholera ... :) dobra uwaga, naprawię to za chwilę :)
Eugene Manuilov
Dzięki za te fantastyczne informacje. Widziałem, czy istnieje jakieś podstawowe rozwiązanie, które po prostu wyzwalałoby wysłanie e-maila aktywacyjnego, ponieważ można „ponownie wysłać aktywację” w panelu administracyjnym. Myślałem, że wstawiając użytkownika jako oczekującego, kod aktywacyjny może zostać wygenerowany i wstawiony do bazy danych, ale po dalszej inspekcji odkryłem, że „oczywiście” nie ma takiego szczęścia :) W każdym razie. To wszystko ma sens i jeszcze raz dziękuję.
Joe Buckle
@JoeBuckle To dziwne. Nie powinieneś mieć resend activationlinku-link w instalacji waniliowej. Czy zdarza się, że masz już zainstalowaną wtyczkę? BuddyPress jest również wyposażony w funkcję aktywacji użytkownika od razu po wyjęciu z pudełka.
s1lv3r
@ s1lv3r Czy to może mieć coś wspólnego z Theme-My-Login?
Joe Buckle
1

Dwie opcje do wyboru:

  1. Użyj wtyczki, na przykład e-mail aktywacyjny użytkownika lub nowy użytkownik zatwierdzający

  2. Koduj to sam.

Niektóre funkcje, które powinny zacząć:

  • wp_mail (), aby wysłać wiadomość e-mail,
  • add_user_meta (), aby zapisać klucz aktywacyjny dla użytkownika,
  • wygeneruj link zawierający klucz i umieść go w wiadomości e-mail, utwórz stronę w wordpress, która wyłapuje twój klucz-parametr (na przykład za pomocą add_shortcode () ),
  • użyj get_user_meta (), aby sprawdzić klucz aktywacyjny względem klucza zapisanego w db, umieść inny meta klucz użytkownika, aby oznaczyć tego użytkownika jako aktywowanego, jeśli się powiedzie,
  • dodaj funkcję do filtru uwierzytelniania, aby uniemożliwić zalogowanie się każdemu użytkownikowi, który nie został aktywowany.
s1lv3r
źródło
0

Możesz uzyskać identyfikator_użytkownika, wykonując to podczas uwierzytelniania:

$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...
}
Dasbairgaya
źródło