好的,让我们更深入地了解一下,这个钩子是如何在WP中使用的。。。它在wp-login.php
(on line 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
) 应该为空,因此您的代码应该可以正常工作。但是总有一个but;)
如果你有wp-login.php
仔细看一下登录表单,就会发现有一个隐藏的输入,名为redirect_to
其中包含的URLwp-admin
. 所以这个条件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 );