0

I'm trying to make two popular WordPress plug-ins work well together. Hopefully this question isn't too specific to my setup -- I think enough people use these plug-ins to make it a common issue.

I'm using Register Plus Redex (RPR) to require user registration to be accepted (by admin) before a user can log-in. Alone, this works fine.

I'm also using Nextend Google Connect (NGC) to allow users to log-in with Google. Those also need to be approved before they can log-in.

When NGC creates a new user in the database, it correctly has the "not activated" flag set. However, the user is still logged in. This allows them to see some blog pages that are protected by "Members Only" (another plug-in). I could maybe update Members Only or other areas to avoid this, but I would rather these users see the same behavior a normal user would see, one that just logs in with user/password, not Google. They get a nice "Your account has not been activated yet" message.

RPR has this code to authenticate, I think I need to use it from NGC some way:

    public /*.object.*/ function rpr_authenticate( /*.object.*/ $user, /*.string.*/ $username, /*.string.*/ $password) {
        if ( !empty($user) && !is_wp_error( $user ) ) {
            if ( NULL !== get_role( 'rpr_unverified' ) && in_array( 'rpr_unverified', $user->roles ) ) {
                return null;
            }
        }
        return $user;
    }

I think this is the section of NGC code I need to modify:

    $secure_cookie = is_ssl();
    $secure_cookie = apply_filters('secure_signon_cookie', $secure_cookie, array());
    global $auth_secure_cookie; // XXX ugly hack to pass this to wp_authenticate_cookie

    $auth_secure_cookie = $secure_cookie;
    wp_set_auth_cookie($ID, true, $secure_cookie);
    $user_info = get_userdata($ID);
    do_action('wp_login', $user_info->user_login, $user_info);
    do_action('nextend_google_user_logged_in', $ID, $u, $oauth2);
    update_user_meta($ID, 'google_profile_picture', 'https://profiles.google.com/s2/photos/profile/' . $u['id']);

The NGC code uses what I think is a "hacked" method of log-in. It doesn't use any of the methods I have seen recommended online, like the new wp_signon or older wp_login functions.

Is what I'm trying to do a major project? If so, is there another combination of plug-ins (or a single one) that will handle the following:

  1. Require users to be logged in to see any pages (what Members Only does)

  2. Require admin to moderate/approve new users (what RPR does)

  3. Support log-in via Facebook, Twitter, and Google (what the Nextend Connect plug-ins do)

Update:

I changed the NGC code to this, and now it doesn't log the user in, but it just leaves them on the log-in page with no error message. I'm not sure how I can add an error message to the default log-in page, everything I find online is related to custom log-in pages.

      if ($ID) { // Login

        $user_info = get_userdata($ID);
            if ( !empty($user_info) && !is_wp_error( $user_info ) ) {
                if ( NULL !== get_role( 'rpr_unverified' ) && in_array( 'rpr_unverified', $user_info->roles ) ) {
// TODO - How to add error message to log-in page?
                    return;
                }
            }

        $secure_cookie = is_ssl();
        $secure_cookie = apply_filters('secure_signon_cookie', $secure_cookie, array());
        global $auth_secure_cookie; // XXX ugly hack to pass this to wp_authenticate_cookie

        $auth_secure_cookie = $secure_cookie;
        wp_set_auth_cookie($ID, true, $secure_cookie);
//
        do_action('wp_login', $user_info->user_login, $user_info);
        do_action('nextend_google_user_logged_in', $ID, $u, $oauth2);
        update_user_meta($ID, 'google_profile_picture', 'https://profiles.google.com/s2/photos/profile/' . $u['id']);
      }
4

1 回答 1

0

我确信有一种更好的方法可以做到这一点,任何时候我更新插件都不会撤消,但现在这对我有用。

我更新了 Nextend-google-connect.php,它是 Nextend Google Connect 插件的一部分,并将登录代码(根据您的版本从第 230 行开始)更改为:

  if ($ID) { // Login

    $user_info = get_userdata($ID);
        if ( !empty($user_info) && !is_wp_error( $user_info ) ) {
            if ( NULL !== get_role( 'rpr_unverified' ) && in_array( 'rpr_unverified', $user_info->roles ) ) {
                wp_redirect('wp-login.php?checkemail=registered');
                exit;
            }
        }

    $secure_cookie = is_ssl();
    $secure_cookie = apply_filters('secure_signon_cookie', $secure_cookie, array());
    global $auth_secure_cookie; // XXX ugly hack to pass this to wp_authenticate_cookie

    $auth_secure_cookie = $secure_cookie;
    wp_set_auth_cookie($ID, true, $secure_cookie);

    do_action('wp_login', $user_info->user_login, $user_info);
    do_action('nextend_google_user_logged_in', $ID, $u, $oauth2);
    update_user_meta($ID, 'google_profile_picture', 'https://profiles.google.com/s2/photos/profile/' . $u['id']);
  }

通过重定向到那个特殊的 URL,Redux 插件已经有代码向用户显示一条好消息,让他们知道管理员需要验证帐户。

于 2013-09-24T18:07:25.630 回答