很多博主都设置了登录才能评论的功能,这样一来就必须允许用户注册,很多博主会认为游客和管理员共用一个登录地址会造成安全问题,或者单纯就是为了管理员单独开启一个登录入口。

关注这个问题,百度找到的答案最多的就是修改wp-login.php和general-template.php,对于很对用户很不方便,并且一旦程序更新又要重新修改。下面就介绍一种不用修改文件,单纯通过钩子实现的方法。

效果:只能通过自定义的地址登录wp,原wp-login.php返回404。

首先,通过login_url修改wp_login_url()函数返回的登录地址。

该函数被很多主题调用以跳转到登录页;通过logout_url修改wp_logout_url()函数返回的登录地址。

login_url过滤器包含三个参数,$login_url,$redirect,$force_reauth,其中

  • $login_url(必须),登录用的自定义url,例如http://example.com/my-login-page,默认wp-login.php
  • $redirect(可选) 登录成功后重定向的地址,默认无。
  • $force_reauth(布尔值,可选),如果为true,无论cookie什么值,都强制重新认证。

add_filter( 'login_url', 'my_login_page', 10, 3 );
function my_login_page( $login_url, $redirect, $force_reauth ) {
return home_url( '/my-login-page/?redirect_to=' . $redirect );
}

通过以上代码,登录地址则变为/my-login-page

logout_url过滤器需要两个参数,$logout_url和$redirect

  • $logout_url登出wordpress的url,也就是后台右上角的“登录”的url
  • $redirect 成功登出后跳转到的地址

add_filter( 'logout_url', 'my_logout_page', 10, 2 );
function my_logout_page( $logout_url, $redirect ) {
return home_url( '/my-logout-page/?redirect_to=' . $redirect );
}

通过以上代码,登出url更改为/my-logout-page

注:通常情况下,我们不会为登录和登出设定两个url,而是通过类似 /my-login-page?action=logout实现登出功能。

第二步,让wp-login.php返回404。

这里需要用到wp_init钩子,判断请求的url是否wp-login.php,如果是,则redirect到404地址。


add_action('login_enqueue_scripts','wp_login_php_404');
function wp_login_php_404(){
$request = parse_url($_SERVER["REQUEST_URI"]);
if($request['path'] == '/wp-login.php' && str_pos(wp_get_refer(),home_url( '/my-logout-page' )) !==0 ){
wp_safe_redirect(home_url('/404'));
}

第三步,根目录新建my-login-page,内容只需一行。

require_once('wp-login.php');

其实第三步还有一种是实现方式是类似于第二步的,通过wp_init判断请求地址,如果是my-login-page,则require wp-login.php,可以避免手动新建my-login-page文件。

通过以上三步就完成了wordpress登录地址的自定义。