web-dev-qa-db-ja.com

ログイン時にユーザーのメタデータを確認する

私のWebサイトでは、ユーザーは自分のEメールアドレスを確認したかどうかに応じてtrueまたはfalseに設定されたメタデータ属性を持っています。メールを確認していない場合はログインさせず、確認した場合はログインさせます。

これを実現するために、私はfunctions.phpファイルに次のコードを追加しました。ただし、これが設定されていると、だれもログインできなくなります。間違いはどこにありますか。

<?php
function isUserActivated($user){
    $userStatus = get_user_meta($user, 'account_activated', true);
    $login_page  = home_url('/login/');
    if($userStatus == 0){
        wp_redirect($login_page . "?login=failed");
        exit;
    }
}

add_filter('wp_authenticate_user', 'isUserActivated');
1
Philipp K

フィルタwp_authenticate_userを使用する場合、ユーザーオブジェクトを取得し、ユーザーIDを使用してユーザーメタを取得する必要があります

function isUserActivated($user){
    $userStatus = get_user_meta($user->ID, 'account_activated', true);

    // for testing $userStatus = 1;
    $login_page  = home_url('/login/');
    if($userStatus == 0){
        wp_redirect($login_page . "?login=failed");
        exit;
    }

    return $user;
}

add_filter('wp_authenticate_user', 'isUserActivated');

しかし、authenticateフィルターの前に実行されるため、アクションwp_authenticateを使用した方が良いと思います。

function isUserActivated($username){

    // First need to get the user object
    $user = get_user_by('login', $username);
    if(!$user) {
        $user = get_user_by('email', $username);
        if(!$user) {
            return $username;
        }
    }

    $userStatus = get_user_meta($user->ID, 'account_activated', true);

    //for testing $userStatus = 1;
    $login_page  = home_url('/login/');
    if($userStatus == 0){
        wp_redirect($login_page . "?login=failed");
        exit;
    }

}

add_action('wp_authenticate', 'isUserActivated');
2
Shibi