よくログインURLを変えるプラグインなんかあるけど、それをテーマ側でやってしまおうというファンクションです。自作系だと、wp-login.phpを複製してカスタムする手法も見かけますが、コアにかかるので更新するときにめんどくさい。以下の関数はテーマ内で完結してるので管理が楽です。
マルチサイトやjetpackのログインにも対応しています。この処理と、bbq firewallのphp版が無料で公開されているので、基本的なセキュリティは大体カバーできますね。後はGoogle recaptchaなんかを組み込めば、それほど大きい規模のサイトでなければ総合セキュリティ系のプラグインは不要なんじゃなかろうかと思います。データとか解析したりするなら別ですが。ちなみに私が一番よく使うセキュリティプラグインはWP Cerber Securityです。スキャンとIPのブラックリスト作成に優れています。
if ( defined( 'CUSTOM_LOGIN_PAGE' ) ){ // カスタムログインURL
// WordPressの管理画面ログインURLを変更する
add_action('request', function ($query_vars) {
global $wp;
if ( $wp->request !== CUSTOM_LOGIN_PAGE ) return $query_vars;
$query_vars = []; // unset 404
$GLOBALS['pagenow'] = 'wp-login.php';
define( 'CUSTOM_LOGIN_KEY', sha1( 'customloginkeyword' ) );
require_once ABSPATH . '/wp-login.php';
exit;
});
add_action( 'login_init', function (){
if ( defined( 'CUSTOM_LOGIN_KEY' ) && sha1( 'customloginkeyword' ) == CUSTOM_LOGIN_KEY ) return;
if ( isset( $_GET['action'] ) && $_GET['action'] == 'confirmaction' ) return;
if ( isset( $_GET['action'] ) && $_GET['action'] == 'postpass' ) return;
if ( is_user_logged_in() && !empty( $_GET["redirect_to"] ) && isset( $_GET["action"] ) && $_GET["action"] == "logout" ) {
wp_safe_redirect( admin_url() );
exit;
} elseif ( isset( $_GET["action"] ) && $_GET["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に記載、で、それよりも上部(functions.phpの一番上で大丈夫)ログインurlを設定します。
これで https://www.example.com/wp-login.php が https://www.example.com/my-login-slug に早変わりするという塩梅です。
define( 'CUSTOM_LOGIN_PAGE', 'my-login-slug' );