全登録ユーザーを一旦ログアウトさせて、次回ログイン時に運営者にメールを送信させる方法

この記事では、WordPressをチーム運営している場合に便利な、全員を一度ログアウトさせてから、次回ログイン時にメール通知を送る機能を紹介します。

1 全体の仕組み

以下の2段階で構成します。

  • ① 全ユーザーを一括ログアウトさせる(管理者だけが実行可能)
  • ② 誰かがログインするたびに、管理者へメール通知を送る

2 functions.php に追加するコード

子テーマの functions.php に以下のコードを追加してください。
投稿ページと固定ページのみに反映されるよう、is_single() || is_page() で条件分岐を行っています。


//---------------------------------------------------------
// 投稿・固定ページ限定:全員強制ログアウト+ログイン通知
//---------------------------------------------------------
if ( !is_admin() ) {
    add_action('template_redirect', function() {
        if ( !is_single() && !is_page() ) return; // 投稿と固定ページのみ
    });
}

//---------------------------------------------------------
// ① 全員を確実に強制ログアウトさせる(管理者専用)
//---------------------------------------------------------
add_action('init', function() {
    if ( current_user_can('administrator') && isset($_GET['force_logout_all']) ) {

        global $wpdb;
        // 全ユーザーのセッショントークンを削除(wp_usermeta から)
        $wpdb->query( 
            "DELETE FROM {$wpdb->usermeta} WHERE meta_key = 'session_tokens'" 
        );

        // 管理者自身のCookieも破棄
        wp_clear_auth_cookie();

        echo 'すべてのユーザーを完全にログアウトさせました。';
        exit;
    }
});

//---------------------------------------------------------
// ② ログイン成功時に管理者へメール通知
//---------------------------------------------------------
add_action('wp_login', function($user_login, $user) {
    $to = get_option('admin_email');
    $subject = '【WordPressログイン通知】' . get_bloginfo('name');

    $message = sprintf(
        "ユーザー「%s」(ID:%d)がログインしました。\n\nログイン時刻: %s\nIPアドレス: %s\nブラウザ: %s\nサイトURL: %s\n",
        $user_login,
        $user->ID,
        date_i18n('Y-m-d H:i:s'),
        $_SERVER['REMOTE_ADDR'] ?? '不明',
        $_SERVER['HTTP_USER_AGENT'] ?? '不明',
        home_url()
    );

    wp_mail($to, $subject, $message);
}, 10, 2);

3 使い方

全員をログアウトさせたい場合、管理者ユーザーで以下のURLにアクセスします。

https://example.com/wp-admin/?force_logout_all=1

これで全ユーザーが一度ログアウトされます。
次に誰かがログインした瞬間に、管理者メールアドレス宛に通知が届きます。

4 応用ポイント

  • 複数管理者がいる場合、get_users(['role' => 'administrator']) で全員に送信も可能。
  • 通知内容に $_SERVER['HTTP_USER_AGENT'] を追加して、デバイス確認もできます。
  • 頻繁なログイン通知が不要なら set_transient() で「1時間に1回通知」などの制御も可能。

この方法なら、セキュリティ管理にも運営チームの動向把握にも最適です。