web-dev-qa-db-ja.com

他にリダイレクトが指定されていない場合は、ユーザーをホームページにリダイレクトする

基本的に、ユーザーをWebサイトのホームページまたはユーザーがログインする前に表示されたページにリダイレクトすることを決定したコードを書きたいと思います。

私はこのページへのリダイレクトが指定されている場合、ユーザーを元のページにリダイレクトするコードを持っています。ただし、特定のリダイレクト要求がない場合、ユーザーはバックエンド管理パネルに送信されます。

<?php
function login_redirect( $redirect_to, $request, $user ) {

    if (isset($user->roles) && is_array($user->roles)) {

        if (in_array('subscriber', $user->roles)) {

            if($request){
                $redirect_to = $request;
            } else {
                $redirect_to =  home_url();
            }

        }
    }

    return $redirect_to;
}

add_filter( 'login_redirect', 'login_redirect', 10, 3 );

ユーザーが管理パネルを見ることができないようにこれを微調整するにはどうすればいいですか?

2
Philipp K

それでは、WPでこのフックがどのように使用されているかを詳しく見てみましょう。 wp-login.php(901行目):

$requested_redirect_to = isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
// ...
$redirect_to = apply_filters( 'login_redirect', $redirect_to, $requested_redirect_to, $user );

したがって、$request(少し誤解を招く可能性があります。$requested_redirect_toと呼ぶ必要があります)を呼び出した変数は空になるはずなので、コードは正常に機能するはずです。しかし…いつもあります;)

O wp-login.phpを取得してログインフォームを詳しく見ると、redirect_toという隠し入力があり、それにwp-adminのURLが含まれていることがわかります。したがって、この条件if($request){は常に真です。

このように修正することができます。

function login_redirect( $redirect_to, $requested_redirect_to, $user ) {
    if ( isset($user->roles) && is_array($user->roles) ) {

        if ( in_array('subscriber', $user->roles) ) {

            if ( $requested_redirect_to && admin_url() != $requested_redirect_to ) {
                $redirect_to = $requested_redirect_to;
            } else {
                $redirect_to =  home_url();
            }

        }
    }
    return $redirect_to;
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );
2