Надіслати електронну пошту для активації користувача під час програмного створення користувача


9

Мені було цікаво, чи хтось тут може допомогти.

В основному я створив власну форму реєстрації, яка після перевірки вставляє користувача в таблицю користувачів.

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

Тепер мені потрібно це зробити, а не надсилати підтвердження електронною поштою, яке я можу зробити із наступним кодом.

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

Я хочу надіслати електронну пошту для активації користувача. Я спробував кілька речей, але не можу, здається, змогти знайти щось конкретне. Сподіваючись, що хтось, можливо, мав цю проблему раніше.

Відповіді:


10

Щоб здійснити процес активації користувача, потрібно виконати наступні дії:

  1. після створення нового користувача додайте спеціальне поле користувача, яке вказує на те, що цей користувач повинен активувати свій обліковий запис
  2. надіслати електронний лист з кодом активації, надіслати посилання в цьому електронному листі на сторінку, де користувач буде активований
  3. реалізувати сторінку активації
  4. коли користувач намагається увійти, перевірте, чи існує це користувацьке поле користувача чи ні. Якщо він існує, тоді не входите до нього та не показуйте повідомлення про помилку активації.

Додати спеціальне поле та надіслати електронний лист:

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

Перевірте активацію користувача при вході:

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

Сторінка активації:

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

Це ваша відправна точка, продовжуйте та коригуйте її під свої потреби.


Гарний пост. Але я думаю, що ти пропустив одне. Якщо ви не можете авторизованим користувачам входити в систему, як ви можете отримати user_id від get_current_user_id () на сторінці активації?
s1lv3r

1
чорт ... :) хороший момент, виправлю це через хвилину :)
Євген Мануїлов

Дякую за цю фантастичну інформацію. Я бачив, чи є якесь основне рішення, щоб просто викликати надсилання електронної пошти для активації, оскільки ви можете "повторно активувати" на панелі адміністратора. Я подумав, що, вставивши користувача, який очікує на активацію, код може бути сформований і вставлений у базу даних, але після подальшого огляду я виявив, що "очевидно" немає такої удачі :) У будь-якому разі. Все має сенс і ще раз дякую.
Джо Баккл

@JoeBuckle Це дивно. Ви не повинні мати-посилання resend activationвзагалі на ванільній установці. Чи трапляється у вас вже встановлений плагін для цього? Також BuddyPress поставляється з функцією активації користувача поза коробкою.
s1lv3r

@ s1lv3r Чи може це мати щось спільне з темою My-Login?
Джо Баккл

1

Два варіанти:

  1. Скористайтеся плагіном, наприклад електронною поштою про активацію користувача або Затвердження нового користувача

  2. Кодуйте це самостійно.

Деякі функції, які повинні розпочати роботу:

  • wp_mail (), щоб надіслати електронний лист,
  • add_user_meta (), щоб зберегти ключ активації для користувача,
  • створити посилання, що містить ключ, і розмістити його в електронній пошті, створити сторінку в wordpress, яка вловлює ваш ключ-парам (наприклад, використовуючи add_shortcode () ),
  • використовуйте get_user_meta (), щоб перевірити ключ активації на той, який зберігається в db, помістіть інший користувацький мета-ключ, щоб позначити цього користувача активованим, якщо успішно,
  • додайте функцію до фільтра аутентифікації, щоб запобігти входу будь-якого користувача, який не активований.

0

Ви можете отримати user_id, зробивши це під час автентифікації:

$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...
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.