如果新用户的用户名包含在预定义列表中,则自动批准新用户

时间:2019-06-25 作者:zinon

我需要在我的网站上注册用户作为订阅者。

每个用户将提供一个用户名。我需要有一个包含公司用户名的列表,然后我需要自动批准该列表中包含其id的任何新用户。

是否有一种简单的方法来支持此过程?

4 个回复
最合适的回答,由SO网友:T.Todua 整理而成

您可以将此代码放入functions.php :

$GLOBALS[\'allowed_users\']= [\'mikejordan\', \'jamesbrown\', ...];


add_action(\'user_register\',\'my_function\');
function my_function($user_id){
    // get user data
    $user_info = get_userdata($user_id);
    if ( in_array($user_info->login, $GLOBALS[\'allowed_users\'] ) )
    {
       $res = $wpdb->query($wpdb->prepare("SELECT activation_key from {$wpdb->signups} WHERE user_login = %s)", $user_info->login));
       if (!empty($res)) {
          wpmu_activate_signup( $res->activation_key );
       }

    }
}

SO网友:Ronak J Vanpariya

您可以使用WP-cli来解决您的问题,有许多教程可供使用。但我更喜欢这个博客,它与你的要求相似

https://www.toptal.com/wordpress/automating-with-wp-cli

我从这个博客中学到了很多东西,希望你也能从这个博客中学到东西。

谢谢我,莱特。

SO网友:Maidul

你可以这样做

add_action( \'user_register\', \'check_username_before_register_5565656\', 10, 1 );

function check_username_before_register_5565656( $user_id ) {

        $user_info = get_userdata($user_id);

        //put a demo array here, you can pull from db
        $allowed_username = array(\'test1\',\'test2\',\'test3\');

        if ( in_array($user_info->login, $allowed_username ) ) {
                //put you code here which skip the user validation process

            }

        }

}

SO网友:Antti Koskinen

我认为有几种方法可以做到这一点,这取决于您想在什么时候进行用户名验证。

1) Validate username (and email) after (default) registration form has been submitted and before the user is created

错误消息显示在注册页面上。

function my_prefix_registration_errors( $errors, $sanitized_user_login, $user_email ) {
  if ( ! is_valid_username( $sanitized_user_login ) ) {
    $errors->add( \'invalid_username\', __( \'<strong>ERROR</strong>: Invalid username.\', \'my_textdomain\' ) );
  }
  if ( ! is_valid_email( $user_email ) ) {
    $errors->add( \'invalid_email\', __( \'<strong>ERROR</strong>: Invalid email.\', \'my_textdomain\' ) );
  }
  return $error;
}
add_filter( \'registration_errors\', \'my_prefix_registration_errors\', 10, 3 );

2) Validate username when the user is being created with wp_insert_user()

// step 1, validate username
function my_prefix_pre_user_login( $sanitized_user_login ) {
  if ( ! is_valid_username( $sanitized_user_login ) ) {
    $sanitized_user_login = \'illegal_username\';
  }
  return $sanitized_user_login;
}
add_filter( \'pre_user_login\', \'my_prefix_pre_user_login\' );

// step 2, add blocked usernames. If username is invalid after step 1, it will trigger "invalid_username" WP_Error with this filter thus blocking the registration
function my_prefix_illegal_user_logins() {
  return array(\'illegal_username\');
}
add_filter( \'illegal_user_logins\', \'my_prefix_illegal_user_logins\' );

3) Allow all registrations, but change user role, if illegal username after new registration

function my_prefix_register_new_user( $user_id ) {
  $user = get_user_by( \'ID\', $user_id );
  if ( ! is_valid_username( $user->user_login ) ) {
    $user->set_role(\'invalid_registration\');
  }
}
add_filter( \'register_new_user\', \'my_prefix_register_new_user\' );

4) Building upon T.Toduas answer regardin multisite user activation.

无需使用激活$GLOBALS.

function t_toduas_user_register_function($user_id){
  // get user data
  $user_info = get_userdata($user_id);
  if ( is_valid_username( $user_info->login ) ) {
    $res = get_activation( $user_info->login );
    if ( !empty( $res ) ) {
      wpmu_activate_signup( $res->activation_key );
    }
  }
}
add_action(\'user_register\',\'t_toduas_user_register_function\');
上述示例的助手函数

function get_allowed_usernames() {
  return array(
    \'donald\',
    \'goofy\'
    \'mickey\'
  );
}

function get_valid_domain() {
  return \'example.com\';
}

function is_valid_username( $username ) {
  return in_array( $username, get_allowed_usernames() );
}

// crude email validation
function is_valid_email( $email ) {
  if ( is_email( $email ) ) {
    return false;
  }
  $email_pieces = explode( \'@\', $email );
  return in_array( get_valid_domain(), $email_pieces );
}

function get_activation( $login ) {
  global $wpdb;
  return $wpdb->query($wpdb->prepare("SELECT activation_key from {$wpdb->signups} WHERE user_login = %s)", $login));
}

相关推荐

如何在新用户注册时将wp_USERS->用户登录名插入到wp_Terms中?

当新用户注册时,我需要将wp\\u users->user\\u login字段插入wp\\u terms name和slug字段。我的要求是管理员需要将帖子分配给特定用户,也就是说管理员需要向user1添加帖子,但user2不应该看到这一点。为此,我创建了一个自定义帖子,并为此添加了分类法。术语是用户用户名。因此,我需要在分类法中将用户的用户名作为术语列出。当一个新用户注册时,他的用户名也应该在wp\\u terms表中更新,所以我将用户名作为terms。我在这里绊倒了。请对此提出一些解决方案