2026年8月12日
2026年8月12日
WordPressのユーザーアカウントを削除せずに無効化する方法|ログイン停止・セッション破棄・アプリケーションパスワードまで
WordPressのコアには「アカウントを一時停止する」ボタンがありません。投稿や履歴を残したままログインだけを止めたいなら、パスワードの無効化+ログイン中セッションの破棄+アプリケーションパスワードの取り消しの3点をそろえるのが基本です。この記事では、管理画面だけでできる応急処置、WP-CLIでの手順、小さな自作プラグインで「無効化フラグ」を持たせる方法、削除を選ぶべき場面までを順に説明します。
「無効化」で止めるべき入口を整理する
アカウントを止めるとき、つまずきやすいのは「ログイン画面からの入口」しか意識しないことです。WordPressのユーザーが認証される経路は主に次の3つあります。
- ログイン画面(wp-login.php)からのユーザー名・パスワードでのログイン
- すでに発行済みのログインCookie(ブラウザに残っているセッション)
- REST APIやXML-RPCで使うアプリケーションパスワード(WordPress 5.6以降の機能)
パスワードを変えても、すでにログインしているブラウザのCookieはセッションが有効な限り使われ続けます。また、アプリケーションパスワードは通常のパスワードとは別に保存されているため、パスワード変更では無効になりません。退職者や契約終了した外部ライターのアカウントを止めるなら、3つの入口をそれぞれ閉じたかを確認してください。
なお、データベースの wp_users テーブルには user_status という列がありますが、現在のWordPressコアはこの値でログイン可否を判断していません。ここを書き換えても無効化にはならないので注意が必要です。
管理画面だけでできる応急処置
まずは今すぐ止めたい場合の手順です。プラグインもSSHも不要です。
1. 権限グループを外す
「ユーザー」→「ユーザー一覧」で対象者の編集画面を開き、「権限グループ」のプルダウンで、このサイトでの権限グループがない状態(一覧の先頭にある「権限なし」にあたる項目)を選んで保存します。権限グループを外すと管理画面の各機能にはアクセスできなくなりますが、ログイン自体はできる点に注意してください。会員向けコンテンツの閲覧制限をログイン状態で判定しているサイトでは、これだけでは不十分です。
元の権限を後で戻す可能性があるなら、変更前の権限グループをメモしておきます。
2. 新しいパスワードを設定する
同じ編集画面のパスワード欄で新しいパスワードを生成し、自動生成された長いパスワードに置き換えて保存します。生成されたパスワードは誰にも伝えず、控えも残しません。同じ欄にある「リセット用リンクを本人にメールで送る」ボタンは本人が新しいパスワードを決めるための機能なので、停止目的では使いません。
3. すべての場所からログアウトさせる
編集画面の「セッション」欄にある、すべての場所からログアウトさせるボタンを押します。これで発行済みのログインCookieが無効になり、ブラウザに残っていたログイン状態も切れます。パスワード変更とこの操作はセットで行ってください。
4. アプリケーションパスワードを取り消す
同じ画面の「アプリケーションパスワード」欄に一覧が出ていれば、個別に取り消すか、まとめて取り消します。外部ツールや自動投稿の仕組みがこのユーザーの権限で動いていた場合、ここで止まるので、影響範囲を先に確認しておくと安全です。
WP-CLIでまとめて処理する
SSHでサーバーに入れる場合は、WP-CLIのほうが手早く、記録も残しやすくなります。以下はユーザーIDが42の例です。
# 対象ユーザーの確認(ID・ログイン名・権限グループ)
wp user get 42 --fields=ID,user_login,user_email,roles
# パスワードを推測不能な値に置き換える(本人への通知メールは送らない)
wp user update 42 --user_pass="$(openssl rand -base64 32)" --skip-email
# 発行済みのログインセッションをすべて破棄
wp user session destroy 42 --all
# アプリケーションパスワードの一覧と全件取り消し
wp user application-password list 42
wp user application-password delete 42 --all
# 権限グループを外す(現在の権限グループ名を指定)
wp user remove-role 42 author
remove-role には、最初の wp user get で確認した現在の権限グループ名を指定します。実行後に wp user get 42 を再度実行し、roles が空になっているかで確認できます。--skip-email を付けないと、パスワード変更の通知メールが本人に届く点も覚えておくとよいでしょう。
複数人をまとめて止める場合も、いきなりループ処理で流すのではなく、まず wp user list --role=contributor --fields=ID,user_login で対象を一覧表示し、意図した人だけが含まれているかを確認してから実行します。
自作プラグインで「無効化フラグ」を持たせる
パスワードの置き換えは確実性の高い方法ですが、「あとで元に戻す」運用には向きません。復帰の可能性があるアカウントが多いサイトでは、ユーザーメタに無効化フラグを持たせ、ログイン時にそれを見て拒否する方式が扱いやすくなります。
下記を wp-content/plugins/disable-user-login/disable-user-login.php として保存し、有効化します。作業前にサイトのバックアップを取っておいてください。
<?php
/**
* Plugin Name: Disable User Login
* Description: ユーザーメタ dul_disabled が立っているユーザーのログインを拒否します。
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
function dul_is_disabled( $user_id ) {
return (bool) get_user_meta( (int) $user_id, 'dul_disabled', true );
}
// ユーザー名・メールアドレスでのログインを拒否(コアの認証処理より後で判定)
add_filter( 'authenticate', function ( $user ) {
if ( $user instanceof WP_User && dul_is_disabled( $user->ID ) ) {
return new WP_Error( 'dul_disabled', 'このアカウントは現在利用できません。' );
}
return $user;
}, 30 );
// アプリケーションパスワードを使えなくする
add_filter( 'wp_is_application_passwords_available_for_user', function ( $available, $user ) {
return dul_is_disabled( $user->ID ) ? false : $available;
}, 10, 2 );
// 他のユーザーの編集画面にチェックボックスを表示
add_action( 'edit_user_profile', function ( $user ) {
if ( ! current_user_can( 'edit_user', $user->ID ) ) {
return;
}
?>
<h2>アカウントの無効化</h2>
<table class="form-table" role="presentation">
<tr>
<th scope="row">ログイン停止</th>
<td>
<label>
<input type="checkbox" name="dul_disabled" value="1" <?php checked( dul_is_disabled( $user->ID ) ); ?>>
このユーザーのログインを停止する
</label>
</td>
</tr>
</table>
<?php
} );
// 保存処理(コア側で update-user_{ID} の nonce が検証された後に呼ばれる)
add_action( 'edit_user_profile_update', function ( $user_id ) {
if ( ! current_user_can( 'edit_user', $user_id ) ) {
return;
}
if ( ! empty( $_POST['dul_disabled'] ) ) {
update_user_meta( $user_id, 'dul_disabled', 1 );
// 発行済みのログインセッションを破棄する
WP_Session_Tokens::get_instance( $user_id )->destroy_all();
} else {
delete_user_meta( $user_id, 'dul_disabled' );
}
} );
このコードのポイントは3つです。
authenticateフィルターは優先度20でコアのパスワード照合が行われるため、30で後から判定しています。パスワードが正しくても無効化フラグがあればエラーを返します。XML-RPCのログインもこのフィルターを通ります。- アプリケーションパスワードは別経路で認証されるため、
wp_is_application_passwords_available_for_userフィルターで個別に止めています。 - フラグを立てた時点で
WP_Session_Tokensのdestroy_all()を呼び、ログイン中のブラウザも追い出しています。ログイン済みCookieの検証はauthenticateを通らないので、ここを省くと「止めたはずなのに管理画面にいる」状態が残ります。
edit_user_profile は他人のプロフィール画面にだけ表示されるフックなので、管理者が誤って自分自身を止める事故を防げます。WP-CLIから操作したい場合は wp user meta update 42 dul_disabled 1 でフラグを立て、続けて wp user session destroy 42 --all を実行します。復帰させるときは wp user meta delete 42 dul_disabled です。
「ユーザーを停止するプラグイン」は公式ディレクトリにも複数ありますが、更新が止まっているものも見られます(2026年10月現在)。導入するなら最終更新日と対応バージョンを確認し、上記と同じくセッション破棄やアプリケーションパスワードへの対応があるかを見て選んでください。
マルチサイトの場合
マルチサイトでは、ネットワーク管理の「ユーザー」画面でユーザーを「スパム」としてマークできます。スパム指定されたユーザーは、コアの wp_authenticate_spam_check によってログイン時に拒否されます。ネットワーク全体で止めたい場合はこの機能が使えますが、個別サイトだけで止めたい場合は、そのサイトから権限グループを外すか、上記のフラグ方式を使います。
無効化ではなく削除を選ぶ場面
今後そのアカウントを使う見込みがなく、投稿の著者表示を残す必要もないなら、削除のほうが管理の手間は減ります。削除の確認画面では、コンテンツを別のユーザーに引き継ぐ選択肢を選び、引き継ぎ先を指定してください(画面の表記はバージョンや翻訳で多少異なります)。指定せずに削除すると、そのユーザーの投稿もまとめて削除されます。
# ID42の投稿をID1のユーザーに引き継いでから削除
wp user delete 42 --reassign=1
削除前にはデータベースのバックアップを取っておきます。逆に、監査のために「誰がいつ何をしたか」をたどれる状態を残したい場合や、著者アーカイブを残したい場合は、削除ではなく無効化が向いています。
WordPressの外側も忘れずに止める
WordPressのアカウントを止めても、次のような権限が残っていると実質的にアクセスできてしまいます。
- サーバーのSSH・SFTPアカウント、レンタルサーバーのコントロールパネル
- データベース管理ツール(phpMyAdminなど)のログイン情報
- プラグインに登録した外部サービスのAPIキー(本人が発行したもの)
- 共有していたBasic認証のID・パスワード
特に退職や契約終了の場合は、WordPress内の作業と合わせて、これらの棚卸しをチェックリスト化しておくと抜け漏れを防げます。
まとめ
- WordPressのコアに一時停止機能はないため、パスワードの置き換え・セッション破棄・アプリケーションパスワードの取り消しを組み合わせる
- 権限グループを外すだけではログイン自体は止まらない
- 復帰の可能性があるなら、ユーザーメタのフラグと
authenticateフィルターで止める方式が扱いやすい - 使わないアカウントは投稿を引き継いで削除し、サーバーや外部サービス側の権限も合わせて止める