我目前使用的处理这里列出的所有问题的方法,即使用户名/密码为空,也非常有效,并且不依赖javascript(尽管js可以很好地处理这些问题)。
add_action( \'wp_login_failed\', \'custom_login_failed\' );
function custom_login_failed( $username )
{
$referrer = wp_get_referer();
if ( $referrer && ! strstr($referrer, \'wp-login\') && ! strstr($referrer,\'wp-admin\') )
{
wp_redirect( add_query_arg(\'login\', \'failed\', $referrer) );
exit;
}
}
关键是此过滤器可更改空白用户名/密码的处理方式:
add_filter( \'authenticate\', \'custom_authenticate_username_password\', 30, 3);
function custom_authenticate_username_password( $user, $username, $password )
{
if ( is_a($user, \'WP_User\') ) { return $user; }
if ( empty($username) || empty($password) )
{
$error = new WP_Error();
$user = new WP_Error(\'authentication_failed\', __(\'<strong>ERROR</strong>: Invalid username or incorrect password.\'));
return $error;
}
}
您可以更进一步,完全替换wp登录。php将用户重定向到自定义登录页面,并将该页面用于login\\u失败的重定向。完整代码:
/**
* Custom Login Page Actions
*/
// Change the login url sitewide to the custom login page
add_filter( \'login_url\', \'custom_login_url\', 10, 2 );
// Redirects wp-login to custom login with some custom error query vars when needed
add_action( \'login_head\', \'custom_redirect_login\', 10, 2 );
// Updates login failed to send user back to the custom form with a query var
add_action( \'wp_login_failed\', \'custom_login_failed\', 10, 2 );
// Updates authentication to return an error when one field or both are blank
add_filter( \'authenticate\', \'custom_authenticate_username_password\', 30, 3);
// Automatically adds the login form to "login" page
add_filter( \'the_content\', \'custom_login_form_to_login_page\' );
/**
* Custom Login Page Functions
*/
function custom_login_url( $login_url=\'\', $redirect=\'\' )
{
$page = get_page_by_path(\'login\');
if ( $page )
{
$login_url = get_permalink($page->ID);
if (! empty($redirect) )
$login_url = add_query_arg(\'redirect_to\', urlencode($redirect), $login_url);
}
return $login_url;
}
function custom_redirect_login( $redirect_to=\'\', $request=\'\' )
{
if ( \'wp-login.php\' == $GLOBALS[\'pagenow\'] )
{
$redirect_url = custom_login_url();
if (! empty($_GET[\'action\']) )
{
if ( \'lostpassword\' == $_GET[\'action\'] )
{
return;
}
elseif ( \'register\' == $_GET[\'action\'] )
{
$register_page = get_page_by_path(\'register\');
$redirect_url = get_permalink($register_page->ID);
}
}
elseif (! empty($_GET[\'loggedout\']) )
{
$redirect_url = add_query_arg(\'action\', \'loggedout\', custom_login_url());
}
wp_redirect( $redirect_url );
exit;
}
}
function custom_login_failed( $username )
{
$referrer = wp_get_referer();
if ( $referrer && ! strstr($referrer, \'wp-login\') && ! strstr($referrer, \'wp-admin\') )
{
if ( empty($_GET[\'loggedout\']) )
wp_redirect( add_query_arg(\'action\', \'failed\', custom_login_url()) );
else
wp_redirect( add_query_arg(\'action\', \'loggedout\', custom_login_url()) );
exit;
}
}
function custom_authenticate_username_password( $user, $username, $password )
{
if ( is_a($user, \'WP_User\') ) { return $user; }
if ( empty($username) || empty($password) )
{
$error = new WP_Error();
$user = new WP_Error(\'authentication_failed\', __(\'<strong>ERROR</strong>: Invalid username or incorrect password.\'));
return $error;
}
}
function custom_login_form_to_login_page( $content )
{
if ( is_page(\'login\') && in_the_loop() )
{
$output = $message = "";
if (! empty($_GET[\'action\']) )
{
if ( \'failed\' == $_GET[\'action\'] )
$message = "There was a problem with your username or password.";
elseif ( \'loggedout\' == $_GET[\'action\'] )
$message = "You are now logged out.";
elseif ( \'recovered\' == $_GET[\'action\'] )
$message = "Check your e-mail for the confirmation link.";
}
if ( $message ) $output .= \'<div class="message"><p>\'. $message .\'</p></div>\';
$output .= wp_login_form(\'echo=0&redirect=\'. site_url());
$output .= \'<a href="\'. wp_lostpassword_url( add_query_arg(\'action\', \'recovered\', get_permalink()) ) .\'" title="Recover Lost Password">Lost Password?</a>\';
$content .= $output;
}
return $content;
}
自定义并添加这些图标,以将您的徽标添加到wp登录页以恢复密码:
// calling it only on the login page
add_action( \'login_enqueue_scripts\', \'custom_login_css\', 10 );
function custom_login_css() { wp_enqueue_style( \'custom_login_css\', get_template_directory_uri() .\'/library/css/login.css\', false ); }
// changing the logo link from wordpress.org to your site
add_filter( \'login_headerurl\', \'custom_login_logo_url\' );
function custom_login_logo_url() { return home_url(); }
// changing the alt text on the logo to show your site name
add_filter( \'login_headertitle\', \'custom_login_title\' );
function custom_login_title() { return get_option(\'blogname\'); }
登录徽标css:
.login h1 a {
background: url(../images/login-logo.png) no-repeat top center;
width: 274px;
height: 63px;
text-indent: -9999px;
overflow: hidden;
padding-bottom: 15px;
display: block;
}
编辑:我刚刚在另一个站点表单scratch上实现了这一点,发现上面的“进一步”更加完整,并修复了“add\\u actions”中的小语法错误。添加了一些注释和方法,可以自动将登录表单添加到登录页面,而无需单独的模板文件。登录表单方法在大多数情况下都应该有效,因为它附加到“The\\u content”,如果您在登录页面上有多个循环,只需使用一个页面登录,它就可能导致并发出问题。这种情况下的php模板。