WordPressのREST API機能を無効化する方法について紹介いたします。
REST API(WP REST API)とは、投稿等のデータをWordPress外から取得できるAPIです。特定のURLにアクセスすると、JSON形式でデータが返ってくるのでそのデータを利用して外部の静的ページ等に表示します。
WordPressサイトのURLの後ろに「/wp-json/」や「/wp-json/wp/v2/」を付けてアクセスすると、JSON形式のデータが表示されると思います。データが表示されれば、REST APIが有効になっているということです。
wp-blog-header.phpをロードすれば、静的ページに投稿一覧などを出力することはできます。しかし、REST APIを使うと、JavaScript等のPHP以外の言語でデータを操作できたり、簡単に全く別のサーバー上からWordPressの情報を取得/出力することができるという利点があります。
そんな便利なREST APIですが、普通にWordPressを運用する場合は使わない機能です。外部から簡単に投稿情報などを取得できてしまうので、REST APIを使わないのであれば、機能自体を無効化しておいた方がセキュリティ的にも好ましいです。
ただ、REST APIを無効化する場合、注意すべき点もあります。その点については後述いたします。
WordPressのREST API機能を無効化する方法
REST API機能を無効化するには、以下を適用しているテーマのfunctions.phpに追加します。「__( ‘REST API is disabled.’ ),」は省略してもOKです。
function disable_rest_api() {
return new WP_Error( 'disabled', __( 'REST API is disabled.' ), array( 'status' => rest_authorization_required_code() ) );
}
add_filter( 'rest_authentication_errors', 'disable_rest_api' );
上記コードを追加したら、サイトURLの後ろに「/wp-json/」や「/wp-json/wp/v2/」を付けてアクセスしてみてください。以下のような内容が表示されたら、REST APIが無効化されています。
{"code":"disabled","message":"REST API is disabled.","data":{"status":401}}
REST APIを無効化する場合の注意点
実はREST APIはプラグインで利用されている場合があります。なので、REST APIを無効化してもプラグインが正常動作するか、しっかりチェックする必要があります。
有名どころだとContact Form 7やJetpackがREST APIを利用しています。
特定のプラグインは除外してREST APIを無効化する方法
REST APIを利用しているプラグインは除外したうえで、REST API機能を無効化する方法については、寝ログさんのこちらの記事で解説されていました。
functions.phpに追加するコードを以下のように変更することで、特定のプラグインを除外できます。
function deny_restapi_except_plugins_demo( $result, $wp_rest_server, $request ){
$namespaces = $request->get_route();
//oembedの除外
if( strpos( $namespaces, 'oembed/' ) === 1 ){
return $result;
}
//Jetpackの除外
if( strpos( $namespaces, 'jetpack/' ) === 1 ){
return $result;
}
//Contact Form7の除外
if( strpos( $namespaces, 'contact-form-7/' ) === 1 ){
return $result;
}
return new WP_Error( 'rest_disabled', __( 'The REST API on this site has been disabled.' ), array( 'status' => rest_authorization_required_code() ) );
}
add_filter( 'rest_pre_dispatch', 'deny_restapi_except_plugins_demo', 10, 3 );
「if( strpos( $namespaces, ‘contact-form-7/’ ) === 1 )」のように$namespacesを指定している箇所を除外したいプラグインのディレクトリ名に変更します。
あとがき
プラグインがREST APIを使っている可能性があるのが少々やっかいですね(^^;
REST API機能を無効化しようと思った時は、ぜひ参考にしていただければと思います。