在Wordpress中注册时禁用自动登录

时间:2018-01-11 09:39:12

标签: wordpress login registration

[ update1 ]我正在使用ClassiCraft主题,我不知道在哪里自定义登录和注册表单

[ update2 ]我知道注册过程没有通过wp_authenticate,因为我在我的插件中重新定义了它

我在Wordpress世界中相当新鲜(实际上昨天我第一次得到了它)并且我在完成我正在进行的一个小项目时遇到了一些困难。

该项目相当简单(或者我认为),包括在注册时收到的电子邮件确认链接,以验证提供的电子邮件地址,以防止使用注册商甚至不拥有的虚假电子邮件。

我已经完成了所有工作,只要我点击注册按钮就会导致登录新创建的用户。

我搜索了“wp在注册时禁用自动登录”等内容,但我找不到任何有用的东西。我甚至测试了一些应该完全按照我需要做的插件,但没有一个能够工作。

此外,我没有使用任何插件进行注册/登录表单,看来wp-login.php文件中的代码实际上甚至没有使用...

有人有想法吗?感谢

2 个答案:

答案 0 :(得分:0)

好的,所以如果没有主题,我就无法真正回答你。

但我可以告诉你我会尝试什么。

<强> 1。在user_register挂钩上添加操作,添加一个帖子元,用于检查用户是否确认了他的电子邮件。

add_action( 'user_register', 'add_has_confirm_email_user_meta');
function add_has_confirm_email_user_meta( $user_id ) {
    update_user_meta( $user_id, 'has_confirm_email', 0 );
}

<强> 2。注册后,防止用户自动登录。

在这里,我无法告诉你适用于你的钩子。例如,wordpress注册的钩子是user_register,但如果你有woocommerce,我将使用的钩子是woocommerce_registration_redirect。因此,请在注册主题后尝试查找可用的挂钩。

在所有情况下,函数中的代码都是:

function custom_registration_redirect() {
    // Log out the user
    wp_logout();

    // The login url could be an other, with woocommerce for example it is : get_permalink(get_option('woocommerce_myaccount_page_id')
    $login_url = wp_login_url();

    // Redirect on it
    wp_redirect( $login_url);
    exit;
}

还需要在此页面上添加消息以提醒用户,他将收到一封确认其帐户的电子邮件。

第3。在用户提交登录表单时阻止用户登录

在wp_login hook上添加操作以实现此目的。

add_action('wp_login', 'prevent_user_from_login', 10, 2);
function prevent_user_from_login($user_login, $user = null ) {

    if ( !$user ) {
        $user = get_user_by('login', $user_login);
    }

    if ( !$user ) {
        // not logged in 
        return;
    }

    // Get user meta
    $has_confirm_email = get_user_meta( $user->ID, 'has_confirm_email', true );


    if ( $has_confirm_email == '0' ) {
        // Clear cookies, a.k.a log user out
        wp_clear_auth_cookie();

        $login_url = wp_login_url();

        $login_url = add_query_arg( 'has_confirm_email', '0', $login_url);

        wp_redirect( $login_url );
        exit;
    }
}

<强> 4。如果我们将has_confirm_email设为0

,请在登录页面上添加消息
add_filter('login_message', 'has_not_confirm_email_login_message');
function has_not_confirm_email_login_message($message) {

    if ( isset( $_GET['has_confirm_email'] ) && $_GET['has_confirm_email'] == 0 ) {
            $message =  '<div id="login_error">You have not confirmed your email.</div>';
    }

    return $message;
}

<强> 5。发送电子邮件并附上确认其电子邮件的链接。

您需要生成一个令牌才能添加到网址中。 对于更改Wordpress发送的默认电子邮件的挂钩,您可以使用自Wordpress 4.9以来可用的wp_new_user_notification_email

在函数本身中,您可以执行以下操作:

function wp_new_user_notification_email( $wp_new_user_notification_email, $user, $blogname) {

    // Generate the token (there is other function available with php 7, but this one works great)
    $token = bin2hex(openssl_random_pseudo_bytes(16));

    // Add the token to the user
    update_user_meta( $user->id, 'confirm_email_token', $token );

    // Get your login url
    $log_in_url = wp_login_url();

    // Add user id and token to the url       
    $url = add_query_arg(
        array(
            'token' => $token,
            'user_id' => $user->id
        ),
        $log_in_url
    );

    // 
    $wp_new_user_notification_email['subject'] = 'Welcome on our website, please confirm your email';
    $wp_new_user_notification_email['message'] = 'Blablabla... the url to confirm is: '. $url;

    return $wp_new_user_notification_email;
}

<强> 6。在登录页面上挂钩以检查$ _GET,查找user_id和令牌。

这里我们检查令牌和用户。如果一切正常,请将用户元has_confirm_email更新为1,以便用户可以连接并添加消息:“您的电子邮件已经确认,您现在可以登录”

add_action( 'login_init', 'custom_login_init');
function custom_login_init(){
    if(!empty($_GET['token']) && !empty($_GET['user_id'])) {
        if(get_the_author_meta( 'confirm_email_token', $_GET['user_id']) === $_GET['token']) {

            // Set the has_confirm_email to 1 so the user can now log in
            update_user_meta( $user_id, 'has_confirm_email', 1);
            update_user_meta( $user_id, 'confirm_email_token', '');

            echo 'Your email has been confirmed, you can now log in';
        }

    }

}

<强> 7。思考时间

好吧,毕竟他,我会想一点,看看我告诉你的,检查是否没有错误^^。 如果您需要更多解释,请与我联系。

我认为这对你来说是一个好的开始,如果你找到右钩子,你将很快实现这一目标。

小心在我使用过的某些挂钩上,因为您的主题可能使用了自定义注册等。

答案 1 :(得分:0)

这是我做的:

  1. 在表wp_users中添加了一列以接收电子邮件确认码
  2. 构建了一个名为user-emails的插件(details here),允许我通过重新定义函数wp_new_user_notification(我在其中生成确认代码,将其添加到DB中的用户)来绕过注册时发送的第一封电子邮件并发送我自己酱油的确认电子邮件)
  3. 重新定义了相同插件用户电子邮件中的wp_authenticate函数,以便我检查电子邮件是否已确认(列值不为空)
  4. 创建了一个确认页面,其中包含传递给它的电子邮件和代码,如果成功,则显示一条消息和指向主页的链接以便登录
  5. 终于抓住了一小段代码,负责在主题文件夹本身内的页面user_auth.php中注册后自动登录(该文件还包含登录和注册表单的布局)

    wp_set_auth_cookie( $user_id, true, $secure_cookie );
    
  6. 确保在注册后显示一条消息,通知用户检查其电子邮件中的确认电子邮件