1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WordPress 7.0でREST APIのpermission_callbackが必須に。省略・タイポで公開される前に直す

1
Posted at

先に答えを書きます。WordPress 7.0では、REST route を登録するときの permission_callback が、実質必須になりました。省略すると doing_it_wrong の通知が出て、リクエストが弾かれます。5.5からあった警告が、7.0で「止める」方向に強くなった形です。

そして、いちばん大事なのはここです。permission_callback を省略した route は、これまで「誰でもアクセスできる公開エンドポイント」として動いていました。うっかり省略や、プロパティ名のタイポで、意図せず公開されていた、という事故が、実際に人気プラグインで複数起きています。7.0対応のついでに、全ルートを点検する価値があります。(2026年7月時点。最終的には公式のフィールドガイドで確認してください)

なぜ、省略が危ないのか

REST APIは、permission_callback の無い route を「公開」として扱います。つまり、書き忘れると、そのエンドポイントは誰でも叩ける状態になります。

こわいのは、これが無言で起きることです。エラーも警告もなく、ただ公開される。だから、権限チェックのつもりだったコードが、実は素通しになっていても、気づけません。5.5で doing_it_wrong の通知が入ったのは、この「気づけない公開」を可視化するためでした。7.0は、それをさらに進めて、省略時にリクエストを止めにいきます。

もう一つの罠が、タイポです。permission_callbackpermision_callback のように綴り間違えると、その引数は「無い」ものとして扱われ、route は公開になります。名前が少しズレただけで、権限チェックがまるごと外れる。これも、実際に起きてきた事故です。

正しい書き方

公開してよいエンドポイントなら、__return_true を明示します。「省略した公開」と「意図した公開」を、コードの上で区別するためです。

// ✅ 公開エンドポイント:__return_true を明示する
register_rest_route('my-plugin/v1', '/status', [
    'methods'             => 'GET',
    'callback'            => 'my_status_callback',
    'permission_callback' => '__return_true',
]);

権限が要るエンドポイントは、current_user_can で必要な権限を指定します。

// ✅ 権限が要るエンドポイント:current_user_can で絞る
register_rest_route('my-plugin/v1', '/settings', [
    'methods'             => 'POST',
    'callback'            => 'my_save_settings',
    'permission_callback' => function () {
        return current_user_can('manage_options');
    },
]);

条件によって細かく分けたいなら、コールバックは $request を受け取れるので、その中で判定できます。返すのは true / false か、WP_Error です。

// ✅ リクエスト内容で分岐する
'permission_callback' => function (WP_REST_Request $request) {
    $id = (int) $request['id'];
    if (! current_user_can('edit_post', $id)) {
        return new WP_Error('forbidden', '権限がありません', ['status' => 403]);
    }
    return true;
},

既存プラグインの点検手順

7.0に上げる前に、自分のプラグインの全 route を見ておきます。

まず、register_rest_route を全部grepして、それぞれに permission_callback があるかを確認します。

grep -rn "register_rest_route" ./ --include=*.php

見つけた各 route について、次を確かめます。permission_callback が書かれているか。綴りが正確か(permission_callback で1文字も違わないか)。そして、公開のつもりなら __return_true が明示されているか、非公開なら current_user_can で適切に絞られているか。

「今まで動いていたから大丈夫」は、ここでは通用しません。動いていたのは、省略が公開として素通しされていたからかもしれない、という目で見ます。

よくある勘違い

__return_true は「危ない」ものではありません。公開してよいデータに対して、公開だと明示するための、正しい書き方です。避けるべきは __return_true そのものではなく、「省略して、暗黙に公開してしまう」ことです。

逆に、なんでも current_user_can('manage_options') で塞げばいい、でもありません。公開すべきデータまで管理者権限で囲うと、フロントから読めなくなって別の不具合になります。そのエンドポイントが、誰に開かれているべきかを、route ごとに決めます。

早見でまとめ

  • 7.0で permission_callback は実質必須。省略すると通知が出てリクエストが弾かれる
  • 省略・タイポの route は「公開」扱いになる。過去に事故が起きている
  • 公開は __return_true を明示、非公開は current_user_can、細かくは WP_Error
  • register_rest_route を全部grepして、各 route を点検する
  • 綴りは1文字も間違えない。permission_callback のタイポは公開と同じ

REST route を持つプラグインは、7.0対応の中でも、ここは優先度が高いところです。表示が崩れるバグと違って、権限の穴は、見た目には出ません。上げる前に、一度grepして全部見ておくのが安全です。役に立ったらストックして、7.0対応のとき見返してください。

参考(公式):


ふだんはraplsworks.comで、WordPressプラグイン開発やClaude Codeまわりのことを書いています。

1
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?