部分问题是您已将过滤器的优先级设置为“1”,这意味着它将首先运行。自从authenticate 将在任何登录(wp-login.php或前端登录页)上运行,您可能需要首先将其设置为默认值(10)。否则,它只会劫持您的wp登录。php。
因为您不需要在wp登录时执行此操作。php,您还可以检查以确保在运行自定义验证时该页面不是当前页面。我在你的函数中检查了全局“pagenow”不是“wp login”。php’。
function verify_user_pass( $user, $username, $password ) {
if ( $GLOBALS[\'pagenow\'] != \'wp-login.php\' ) {
$login_page = home_url( \'login/\' );
if ( "" == $username || "" == $password ) {
wp_redirect( add_query_arg( \'login\', \'empty\', $login_page ) );
exit();
}
}
return $user;
}
add_filter( \'authenticate\', \'verify_user_pass\', 10, 3 );
我还改变了其他一些事情:
home_url() Slug不需要一个前导斜杠-它会自动将其放入将您的比较更改为“尤达条件”("" == $username) - 这是一个很好的习惯,因为它会捕获类型/语法错误(例如,如果键入错误)=“而不是”==)使用add_query_arg() 将查询参数添加到URL。这样,即使URL中有其他查询参数,也可以正确添加它请注意,这是一个筛选器,而不是一个操作。因此,您需要确保返回过滤器挂钩正在过滤的内容。假使authenticate 这就是$user 对象(也可能包含WP_Error 对象)。如果在最后不返回此内容,则会破坏自定义进程之外的任何内容,该自定义进程也会运行此过滤器(即主wp login.php)