Отправить пользователю письмо с кодом активации при программном создании пользователя

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 Может ли это иметь отношение к Theme-My-Login?
Джо Бакл
1

Два варианта на выбор:

  1. Используйте плагин, например, электронная почта активации пользователя или одобрение нового пользователя.

  2. Код это сам.

Некоторые функции, которые должны помочь вам начать:

  • wp_mail () чтобы отправить электронное письмо,
  • add_user_meta () для сохранения ключа активации для пользователя,
  • сгенерируйте ссылку, содержащую ключ, и поместите ее в электронное письмо, создайте страницу в wordpress, которая перехватит ваш ключевой параметр (например, с помощью add_shortcode () ),
  • используйте get_user_meta (), чтобы сравнить ключ активации с ключом, сохраненным в БД, поместите другой мета-ключ пользователя, чтобы пометить этого пользователя как активированного в случае успеха,
  • добавьте функцию в фильтр проверки подлинности, чтобы предотвратить вход любого пользователя, который не активирован.
s1lv3r
источник
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...
}
Dasbairgaya
источник