以编程方式创建用户时发送用户激活电子邮件


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

我想发送一个用户激活电子邮件。我已经尝试了一些方法,但是似乎无法找到任何具体的方法。希望以前有人遇到过这个问题。

Answers:


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

这是您的出发点,请根据您的需要进行调整。


好帖子。但我认为您错过了一件事。当您阻止未经授权的用户登录时,如何从激活页面上的get_current_user_id()获取user_id?
s1lv3r 2013年

1
该死的... :)好点,会在一分钟内解决它:)
Eugene Manuilov 2013年

感谢您提供这些奇妙的信息。我正在查看是否有任何核心解决方案可以触发激活电子邮件的发送,因为您可以在管理面板中“重新发送激活”。我认为通过将用户插入为待处理状态可能会生成一个激活码并将其插入数据库中,但是经过进一步检查,我发现“显然”没有这种运气:)无论如何。这一切都说得通,再次感谢。
乔·巴克

@JoeBuckle真奇怪。在resend activation原始安装中,您根本不需要-link。您是否已经为此安装了插件?BuddyPress还具有开箱即用的用户激活功能。
s1lv3r 2013年

@ s1lv3r可以和主题我的登录有关吗?
乔·巴克

1

有两个选项可供选择:

  1. 使用插件,例如用户激活电子邮件新用户批准

  2. 自己编写代码。

一些使您入门的功能:

  • wp_mail()发送电子邮件,
  • add_user_meta()为用户保存激活密钥,
  • 生成包含密钥的链接并将其放置在电子邮件中,在wordpress中创建一个页面来捕获您的密钥参数(例如,使用add_shortcode()),
  • 使用get_user_meta()对照数据库中存储的密钥检查激活密钥,放置另一个用户元密钥以将该用户标记为已激活(如果成功),
  • 验证过滤器添加一个功能,以防止任何未激活的用户登录。

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...
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.