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

时间:2013-10-11 作者:Joe Buckle

我想知道这里是否有人能帮忙。

基本上,我创建了一个自定义注册表,在验证后,会将用户插入到用户表中。

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\']);
我想改为发送用户激活电子邮件。我试过一些东西,但似乎找不到任何具体的东西。希望有人以前有过这个问题。

3 个回复
最合适的回答,由SO网友:Eugene Manuilov 整理而成

要完成用户激活过程,您需要执行以下步骤:

创建新用户后,添加一个表示该用户必须激活其帐户的自定义用户字段发送一封带有激活码的电子邮件,在该电子邮件中提供一个链接,指向当用户尝试登录时用户将被激活的页面,检查该自定义用户字段是否存在。如果存在,则不要让他登录并显示激活错误消息

Add custom field and send 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 );
    }
}

Check user activation on login:

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

Activation page:

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\' );
            }
        }
    }
}
这是您的出发点,请根据您的需要进行调整。

SO网友:s1lv3r

有两个选项可供选择:

例如,使用插件User activation emailNew User Approve

自己编写代码。

一些应该让您开始的功能:

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

SO网友:Dasbairgaya

您可以在身份验证时执行以下操作来获取user\\u 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...
}

结束

相关推荐

Sending all emails using SMTP

我两个都试过了Configure SMTP 和WP Mail SMTP 通过我的donotreply Google Apps电子邮件地址发送所有域电子邮件,但这两个插件都不起作用。尝试通过其中一个发送测试电子邮件会导致错误SMTP -> ERROR: Failed to connect to server: Network is unreachable (101). 我正确输入了信息(smtp.gmail.com,端口465或587[两者都尝试过]、SSL[也尝试了TLS]),但它无法连接。我是否需