functions.php で完結するカスタムログインURL
よくログインURLを変えるプラグインなんかあるけど、それをテーマ側でやってしまおうというファンクションです。自作系だと、wp-login.phpを複製してカスタムする手法も見かけますが、コアにかかるので更新するときにめんどくさい。以下の関数はテーマや自作プラグイン内で完結できるので管理が楽です。マルチサイトのログインにも対応しています。
この処理に加えて Captcha を組み込めば、ログを取らないような一般的な非会員制の小規模サイトであれば不正ログイン対策は十分でしょう。Captcha はプラグインでもいいのですが、私はメールフォームと併せて Google reCaptcha V3 を導入して、それだけだと繰り返しログインする管理者が弾かれがちなので、ホワイトリストIPアドレスをuser_metaに自動的に紐づけるようにしています。あとはBBQ firewallあたりと組み合わせれば、総合セキュリティ系のプラグインも不要だと思います。
カスタムログインURL のコード
define( 'CUSTOM_LOGIN_PAGE', 'my-slug' ); // my-slug に任意のログイン urlを設定
if ( defined( 'CUSTOM_LOGIN_PAGE' ) ){ // カスタムログイン
// WordPressの管理画面ログインURLを変更
add_action( 'parse_request', function ( $wp ) {
if ( $wp->request == 'wp-login.php' ){
wp_die( __( 'Invalid URL.' ), '', array( 'response' => 403 ) );
} elseif ( $wp->request !== CUSTOM_LOGIN_PAGE ) {
return;
}
global $user_login, $error, $action;
$wp->query_vars = []; // unset 404
$GLOBALS['pagenow'] = 'wp-login.php';
define( 'CUSTOM_LOGIN_KEY', true );
header( 'Etag:' . time() );
require_once ABSPATH . '/wp-login.php';
exit;
});
add_action( 'login_init', function (){
if ( defined( 'CUSTOM_LOGIN_KEY' ) ) return;
global $action;
if ( in_array( $action, ['confirmaction','postpass','logout'] ) ) return ;
if ( is_user_logged_in() && !empty( $_GET["redirect_to"] ) ) {
wp_safe_redirect( admin_url() );
exit;
} elseif ( $action == "rp" && !empty( $_GET["key"] ) && !empty( $_GET["login"] ) ) { //新規ユーザー登録
wp_safe_redirect( home_url( CUSTOM_LOGIN_PAGE ).'?'.$_SERVER["QUERY_STRING"] );
exit;
} else {
wp_die( __( 'Invalid request.' ), '', array( 'response' => 403 ) );
}
});
// ログイン済みか新設のログインURLの場合はwp-login.phpを置き換える
add_filter( 'site_url', function ( $url, $path, $scheme, $blog_id ) {
if ( 'wp-login.php' === substr($path, 0, 12) && strpos( $url, '/wp-login.php' ) !== false ){
$url = str_replace( site_url().'/wp-login.php', home_url( CUSTOM_LOGIN_PAGE ), $url );
}
return $url;
}, 10, 4 );
add_filter( 'network_site_url', function ( $url, $path, $scheme ) {
if ( 'wp-login.php' === substr($path, 0, 12) && strpos( $url, '/wp-login.php' ) !== false ){
$url = str_replace( 'wp-login.php', CUSTOM_LOGIN_PAGE, $url );
}
return $url;
}, 10, 4 );
//デフォルトのログインページ転送を無効化
add_filter('auth_redirect_scheme', function ($scheme){
if ( $user_id = wp_validate_auth_cookie( '', $scheme) ) {
return $scheme;
}
wp_die( __( 'Invalid request.' ), '', array( 'response' => 403 ) );
}, 99 );
}
設置方法
上記の関数をfunctions.phpに記載してもらえれば、https://www.example.com/wp-login.php が https://www.example.com/my-slug に早変わりするという塩梅です。注意点として、CUSTOM_LOGIN_PAGEに設定している slug には拡張子 php を使えないということです。php 拡張子がついていると wordpress は実ファイルを読みにいくためです。どうしても my-login.php のようなURLを指定をしたい場合は、実際にphpファイルを作ってコアに置き、そのファイル内で CUSTOM_LOGIN_KEY を宣言してから wp-login.php をインクルードしてください。