よくある質問

2020.03.19 2020.03.20

TOPICS

翻訳元記事はこちらです。

このページでは、APIを使うときによくある質問を掲載しています。もしここに載っていない質問があれば、WordPressのサポートフォーラムで質問すると回答がもらえるかもしれません。

REST APIを無効化することはできますか?

REST APIは無効化するべきではありません。無効化すると、APIに依存して動いているWordPressの管理機能が動かなくなってしまいます。しかし、APIの利用者を認証したい場合は、下の回答を参照してください。

すべてのリクエストを認証したい場合

rest_authentication_errorsフィルターを使用して、is_user_logged_inでチェックすれば、すべてのREST APIのリクエストに対して認証をかけることができます。

注意点:コールバック関数の引数は、以下のいずれかになります。

null:まだ認証チェックが走っていません。認証ロジックをはさんでください。

boolean:認証チェックが終わっていることを表しています。
true→リクエストの認証が成功しています
false→認証に失敗しました

WP_Error:なにかエラーが発生しています。

add_filter( 'rest_authentication_errors', function( $result ) {
    // If a previous authentication check was applied,
    // pass that result along without modification.
    if ( true === $result || is_wp_error( $result ) ) {
        return $result;
    }
 
    // No authentication has been performed yet.
    // Return an error if user is not logged in.
    if ( ! is_user_logged_in() ) {
        return new WP_Error(
            'rest_not_logged_in',
            __( 'You are not currently logged in.' ),
            array( 'status' => 401 )
        );
    }
 
    // Our custom authentication check should have no effect
    // on logged-in requests
    return $result;
});

プラグイン内で、PHPからのAPIリクエストを作成できますか?

rest_do_request関数を使って、内部のAPIリクエストを作成することができます。

$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
// Set one or more request query parameters
$request->set_param( 'per_page', 20 );
$response = rest_do_request( $request );

内部のリクエストに_embedパラメーターをセットする方法は?

リクエストオブジェクトに、_embedパラメーターをセットしても動きません。

$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
$request->set_param( '_embed', 1 );
$response = rest_do_request( $request );

代わりに、WP_REST_Server::response_to_data関数を呼んでください。

$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
$response = rest_do_request( $req );
$data = rest_get_server()->response_to_data( $response, true );
var_dump( $data['_embedded'] );

?filter=クエリはどうしたの?

REST APIをWordPressのコアにマージするときに、?filterクエリはメンテナンスの問題で取り除かれました。
?filterクエリを使って、WP Queryの引数をAPIで使えるようにするのは、REST APIの初期では、重要なことでした。しかし、APIのレスポンスにフィルターをかけるほとんどの機能は、?categories=?slug?per_page=などのクエリーパラメーターに取って代わられました。

初期のAPIのパラメーターは、いつでも使えるようにしておくべきです。しかし、必要であれば、rest-filterプラグインは、任意の?filterの値を組み込むことができます。

クエリーパラメーターが動きません

?page=2?_embedのようなパラメーターは、サーバーにて正しく設定されていないと機能しません。
もしNginxを使っている場合は、設定ファイルのtry_filesの行を見てください。

try_files $uri $uri/ /index.php$args;

上記を以下のように修正してください。

try_files $uri $uri/ /index.php$is_args$args;

$is_argsを加えると、WordPressは、クエリーパラメーターを正しく解釈できます。

なぜ、認証機能が動かない?

認証ヘッダーを送っているのに、リクエストが受け付けられないとき。CGI版のApacheを使っていると、ヘッダーが切り取られます。以下のコードを設定ファイルか、.htaccessに追加してください。

<IfModule mod_setenvif>
  SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
</IfModule>

なぜREST APIは、オリジンヘッダーを検証しないのですか?CSRF攻撃をされませんか?

CORSは、外部サイトからあなたのサイトの操作を許可する仕組みです。
CORSは、CSRFという攻撃を防ぎます。しかし、WordPressは、nonceという仕組みを使って、CSRFから守ります。
CORSによる制限は、いくつかの認証方法を防ぎます。そのため、WordPressは、CORSの代わりに、nonceを使用して、CSRFを防ぎます。

WordPress REST APIが、オリジンヘッダーを検証していないので、公開されているREST APIのエンドポイントは、どんなサイトでも受け入れられます。

これは、意図的に設計されたことですが、もし知らないオリジンからのアクセスを防ぎたいのであれば、rest_pre_serve_request filter hookから、rest_send_cors_headers 関数を外してください。自作関数に、より強固なCORSのヘッダーを追加してください。