よくある質問
TOPICS
翻訳元記事はこちらです。
このページでは、APIを使うときによくある質問を掲載しています。もしここに載っていない質問があれば、WordPressのサポートフォーラムで質問すると回答がもらえるかもしれません。
REST APIを無効化することはできますか?
REST APIは無効化するべきではありません。無効化すると、APIに依存して動いているWordPressの管理機能が動かなくなってしまいます。しかし、APIの利用者を認証したい場合は、下の回答を参照してください。
すべてのリクエストを認証したい場合
rest_authentication_errorsフィルターを使用して、is_user_logged_in
でチェックすれば、すべてのREST APIのリクエストに対して認証をかけることができます。
注意点:コールバック関数の引数は、以下のいずれかになります。
- null
- WP_Error
- boolean
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のヘッダーを追加してください。