wordpressにおいて、管理人以外がアクセスした場合、パスワード再設定の為のメールアドレス入力画面に切り替わらないようにするには

WordPressで「管理人(管理者権限を持つユーザー)以外」がパスワード再設定画面(wp-login.php?action=lostpassword)にアクセスした際、画面を切り替えさせずにログイン画面へ強制リダイレクト(あるいは拒否)するには、テーマのfunctions.phpファイルにカスタムコードを追加する方法が最も確実です

現在ログインしているユーザー、または入力されたユーザー名・メールアドレスが管理者かどうかを判別して制御します。


実装手順

現在使用しているテーマのfunctions.phpに以下のコードを貼り付けます。
安全のため、作業前に必ずファイルのバックアップを取ってください。

パターン1:URL直接アクセスも完全にブロックする(推奨)

画面下の「パスワードをお忘れですか?」リンクを隠すだけでなく、URLを直接入力してアクセスしてきた場合も、管理者以外なら通常のログイン画面に強制リダイレクトさせます。 [1]

php

// 1. パスワード再設定画面へのアクセスを判定してリダイレクト
add_action('login_form_lostpassword', 'restrict_lost_password_access');
function restrict_lost_password_access() {
    // ログイン済みユーザーがアクセスした場合のチェック
    if (is_user_logged_in()) {
        if (!current_user_can('administrator')) {
            wp_redirect(wp_login_url());
            exit;
        }
    }
}

// 2. メールアドレス・ユーザー名が送信された時点の処理(未ログイン時のリクエスト対策)
add_filter('allow_password_reset', 'restrict_password_reset_by_user', 10, 2);
function restrict_password_reset_by_user($allow, $user_id) {
    // 送信されたユーザーが管理者(administrator)でない場合はリセットを拒否
    if (!user_can($user_id, 'administrator')) {
        return false; 
    }
    return $allow;
}

// 3. ログイン画面の「パスワードをお忘れですか?」リンクを非表示にする
add_filter('gettext', 'remove_lostpassword_text');
function remove_lostpassword_text($text) {
    if ($text == 'パスワードをお忘れですか?' || $text == 'Lost your password?') {
        return '';
    }
    return $text;
}

コードは注意してご使用ください。

パターン2:全員(管理者含む)のパスワード再設定を完全に無効化する

もし「管理者の自分も画面からの再設定は不要(パスワード変更はダッシュボード内からしか行わない)」という場合は、以下の数行だけでサイト全体のパスワードリセット機能を完全に停止・非表示にできます。

php

// 全ユーザーのパスワードリセットを無効化
add_filter('allow_password_reset', '__return_false');

// ログイン画面のリンクを非表示にする
add_filter('gettext', function($text) {
    if ($text == 'パスワードをお忘れですか?' || $text == 'Lost your password?') {
        return '';
    }
    return $text;
});

コードは注意してご使用ください。


プラグインで対応したい場合

コードの編集に不安がある場合は、ログイン画面を総合的にカスタマイズできる無料プラグイン LoginPressSiteGuard WP Plugin を導入することで、「パスワードをお忘れですか?」のリンク自体を管理画面上のチェック一つで簡単に非表示にできます。