LoginSignup
1
0

More than 3 years have passed since last update.

WordPressのログインページを変更する

Last updated at Posted at 2020-12-14

ご存知の通り、WordPressの管理画面へのログインURLは、固定されています。

しかし全Webサイトの40%近くがWordPressで作られる昨今、ログインページをデフォルトのままにしておくと、外部からの攻撃を受けやすくなってしまいます。

ログインページの保護には、Basic認証や2段階認証等他にも様々ありますが、今回はURLを変更する方法をご紹介します。

前提

下記の文字列は、必要に応じて各自変更してください。
ログインページ名:new-login.php
ハッシュ:test-hash

コード

新しいログインページ

プロジェクトルート(wp-login.phpがある階層)に設置する。

new-login.php
<?php

define('LOGIN_KEY', password_hash('test-hash', PASSWORD_BCRYPT, ['cost'=>10]));
require_once './wp-login.php';

functions.phpへのインクルード

他機能と分離するため、functions.phpへは直接記載せずにインクルードするのがおすすめ。

wp-content/themes/theme-name/functions.php
<?php

require_once 'inc/change_login_page.php';

wp-login.phpから新しいログインページへの移管処理

wp-content/themes/theme-name/inc/change_login_page.php
<?php

class ChangeLoginPage
{
    private const LOGIN_PAGE = 'new-login.php';

    public function __construct()
    {
        // ログインキーが未定義または不一致の場合、404へリダイレクト
        add_action('login_init', [$this, 'admin_login_init']);
        // ログイン後のリダイレクト先を指定のログインページへ変更
        add_filter('site_url', [$this, 'admin_login_site_url'], 10, 2);
        // ログアウトした後のログインページURLを指定のページへ変更
        add_filter('wp_redirect', [$this, 'admin_login_wp_redirect'], 10, 1);
    }

    public function admin_login_init(): void
    {
        // サイトヘルスのエラー回避のため、サーバーIPによるアクセスはリダイレクトから除外する
        $global_ip = rtrim(`curl inet-ip.info 2>/dev/null`);
        if($_SERVER['REMOTE_ADDR'] === $global_ip) {
            return;
        }

        if(!defined('LOGIN_KEY') || password_verify('test-hash', LOGIN_KEY) === false) {
            header('Location:' . site_url() . '/404.php');
            exit;
        }
    }

    public function admin_login_site_url(string $url, string $path): string
    {
        if(($path === 'wp-login.php' || preg_match('/wp-login\.php\?action=\w+/', $path)) && (is_user_logged_in() || strpos($_SERVER['REQUEST_URI'], self::LOGIN_PAGE) !== false)) {
            $url = str_replace('wp-login.php', self::LOGIN_PAGE, $url);
        }

        return $url;
    }

    public function admin_login_wp_redirect(string $location): string {
        if(is_user_logged_in() && strpos($_SERVER['REQUEST_URI'], self::LOGIN_PAGE) !== false) {
            $location = str_replace('wp-login.php', self::LOGIN_PAGE, $location);
        }

        return $location;
    }
}
new ChangeLoginPage;
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0