基本的に、ユーザーを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 );
ユーザーが管理パネルを見ることができないようにこれを微調整するにはどうすればいいですか?
それでは、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 );