WordPress REST API:完全に無効化せず、ログアウト状態だけをブロックする理由

WordPress REST APIは、ログインしていない訪問者にもwp-jsonのアドレスからサイトのユーザー名を公開します。完全に無効化するとブロックエディターで保存できなくなる場合があるため、ログアウト状態のリクエストだけをブロックし、401レスポンスで確認する方法をまとめました。
1️⃣ WordPress REST APIとは:wp-jsonのアドレスと役割
WordPress REST APIは、投稿・固定ページ・ユーザーなどのサイトデータをJSON形式でやり取りするWordPressの標準機能で、サイトアドレスの後ろの/wp-json/以下で応答します。
/wp-json/以下のアドレスは[wp/v2/posts]・[wp/v2/pages]・[wp/v2/users]のようにデータの種類ごとに分かれており、その一つひとつをエンドポイントと呼びます。ブロックエディターも投稿を保存するときにこのアドレスへリクエストを送ります。
https://example.com/wp-json/
https://example.com/wp-json/wp/v2/posts
https://example.com/wp-json/wp/v2/pages
https://example.com/wp-json/wp/v2/users2️⃣ wp-jsonから見えるユーザー名
[wp/v2/users]エンドポイントは、投稿を公開したユーザーごとに表示名とslugを返し、slugには初期設定でログインIDがそのまま入ります。テストサイトのhttps://testpilotweb.com/でも、管理者アカウントのslugとログインIDは同じでした。
ログインIDが知られると、攻撃者はパスワードさえ突き止めればログインでき、テストサイトのWordPressログイン画面にも2026年10月7日の1日だけで2,570回のブルートフォース攻撃が記録されました。
このアドレスをブロックしても、作成者ページのアドレス(/author/ID/)には同じIDがそのまま残ります。
3️⃣ 完全に無効化すると壊れるもの
WP REST APIをすべて無効にすると、まずブロックエディターでの保存が失敗するため、WordPressの最適化プラグインの一つであるPerfmattersも無効化の範囲を[Disable for Non-Admins]と[Disable When Logged Out]の2段階に分けています。投稿者や寄稿者のアカウントがあるサイトでは、[Disable for Non-Admins]でもそのアカウントの保存がブロックされます。
ログアウト状態だけをブロックしたサイトでも、claude.aiにMCPコネクターを接続すると、認証を終えた後にツールが0個と表示されました。サーバーログにはMCPのリクエストがすべて401として残っており、原因はPerfmattersがMCPのトークン確認より先にリクエストをブロックしたことでした。
| [Disable REST API]の値 | ログアウト訪問者のusersアドレス | 管理者以外のアカウントの投稿保存 | 向いているケース |
|---|---|---|---|
| Default (Enabled) | ユーザー名が見える | 保存できる | — |
| Disable for Non-Admins | 401 | 保存に失敗 | 投稿者・寄稿者アカウントがないサイト |
| Disable When Logged Out | 401 | 保存できる | 投稿者アカウントがあるサイト。MCPなどトークン接続は例外パスを追加 |
4️⃣ ログアウト状態だけをブロックする設定(Perfmatters)
WordPress管理画面の[設定] → [Perfmatters] → [General]で、[Core]項目の[Disable REST API]を[Disable When Logged Out]に変えて[Save Changes]を押します。


Perfmattersの対応言語:英語(標準)、韓国語、ドイツ語、フランス語、イタリア語、オランダ語、ポルトガル語(ブラジル)、ロシア語、ウクライナ語、トルコ語、ブルガリア語、ハンガリー語、インドネシア語、ペルシア語、中国語(簡体字)

ログインしていないシークレットウィンドウで/wp-json/wp/v2/usersを開くと、[Sorry, you do not have permission to make REST API requests.]というメッセージとともに401レスポンスが返り、ログインした状態のブロックエディターはそのまま投稿を保存できます。
[
{
"id": 1,
"name": "User A",
"slug": "user_a",
"link": "https://example.com/author/user_a/"
}
]
{
"code": "rest_authentication_error",
"message": "Sorry, you do not have permission to make REST API requests.",
"data": { "status": 401 }
}
5️⃣ ブロックしたパスに例外を設ける
ブロックした状態で特定のパスだけを開ける必要があるときは、Perfmattersの[perfmatters_rest_api_exceptions]フィルターにそのパスを追加します。claude.ai MCPコネクターのツール0個の問題は、Perfmattersの[Code]メニューでPHPスニペットを作り、MCPのパスだけを例外にして解決しました。
add_filter('perfmatters_rest_api_exceptions', function($exceptions) {
$exceptions[] = '/mcp/mcp-oauth-server';
return $exceptions;
});例外を設けた後も、トークンのないリクエストはMCP自身が[MCP authentication required.]のメッセージと401レスポンスでブロックし、/wp-json/wp/v2/usersは引き続きPerfmattersの401レスポンスを返します。
[MCP authentication required.]
同じ[Core]項目の[Remove REST API Links]は、ページのヘッダーとレスポンスヘッダーからapi.w.orgのリンクだけを削除する設定で、WP REST API自体はそのまま応答します。
🔢 FAQ & おすすめコンテンツ
ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。