WordPressのREST APIを無効化しつつ特定プラグインは動作するようにカスタマイズする方法

先日、Contact Form 7プラグインでメールフォームを作成しました。

そして、動作確認のためメールを送ろうと「送信ボタン」を押したところ、スピナーがグルグル回るだけで、一向に送信できませんでした。

芋Contact Form 7の送信時スピナーがグルグル回り続ける

こうなる原因は多々あるのですが、僕の場合はWordpressのREST API機能を無効にしていたのが原因だったようです。

通常、Wordpressのデフォルト動作ではREST APIは有効になっています。

ただ僕は、「REST API機能は使うことはない」ということと、先日「REST APIの脆弱性を突いたコンテンツ改ざん」なんてこともあったので正直、積極的には使いたくない感じでした。

 独立行政法人情報処理推進機構(IPA)セキュリティセンターと一般社団法人JPCERTコーディネーションセンター(JPCERT/CC)は6日、WordPressのREST APIにおける認証回避の脆弱性について注意を喚起した。

ですので、「使うことはないし、セキュリティー的に問題があったものは無効にしておこう」ということで以下のコードを用いてREST APIを無効化していました。

//REST APIを無効化する
function disable_rest_demo(){
  return new WP_Error( 'disabled', array( 'status' => rest_authorization_required_code() ) );
}
add_filter( 'rest_authentication_errors', 'disable_rest_demo' );

参考 WordPress4.7.0以降で「REST API」を無効にする方法が変わっていたので試しました | 今村だけがよくわかるブログ

上記のように、REST APIを無効化しても、Contact Form 7のv4.7までは問題なくメール送信できていました。

ただ先日、Contact Form 7のv4.8において送信時にREST APIが利用されるようになりました。

Ajax フォーム送信のためのカスタム REST API エンドポイントを追加。

Contact Form 7 — WordPress プラグイン

これにより、冒頭で述べたようにメールを送ろうとしても、スピナーがグルグル回るだけで、送信できなくなってしまったようです。

芋Contact Form 7の送信時スピナーがグルグル回り続ける[3]

なので、「何とかREST APIを無効にしつつもプラグインを動作させる方法はないものか?」と探してみたところ、良い方法があったのでカスタマイズ方法の紹介です。

Contact Form 7の他にも、Jetpackの登録時、oEmbedにもREST APIは利用されるので、それらも含めて除外し、REST APIを無効化する方法を紹介します。
スポンサーリンク
レクタングル(大)広告

特定のプラグインを除いてREST APIを無効にする方法

特定のプラグインを例外としながらREST APIを無効にするには、functions.phpに以下のように記述します。

//特定のプラグインを除外してREST APIを無効にする
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 );

これで注目すべき点は、ネームスペース文字列内に「特定のプラグインに関連する文字列」があればREST APIを無効化しないで関数を終えているところです。

その他のプラグインも除外したい場合は、以下のような条件分岐を追加していけばできるかと思います。

//その他のプラグインの除外
if( strpos( $namespaces, 'プラグイン識別文字列' ) === 1 ){
    return $result;
}

「プラグイン識別文字列」は、僕はプラグインのディレクトリ名で良いのかなと思っています。多分。

Contact Form 7だったら「contact-form-7/」。Jetpackだったら「jetpack/」みたいな感じです。

場外文字列には、プラグインディレクトリ名を使えば良いのではないか

完璧ではないのかもしれませんが、これが最も分かりやすい方法かなと。

参考情報

今回紹介した、「プラグインを除外してREST APIを無効化する方法」は、以下の記事にある「別のフックを使ってみる」項目に記載されているコードを参考にさせていただきました。

動作確認

今回紹介したコードをfunctions.phpに追加して、Contact Form 7の送信を行うと、問題なくメールが送信できました。

Contact Form 7でメール送信ができた

まとめ

今回紹介した方法は、Wordpress4.7からデフォルト動作となっているREST APIをそのまま使用している場合には、不要のカスタマイズです。

今回の方法は、どちらかと言うと以下の要件に合う人向けのものです。

  • REST APIでコンテンツを読み取られたくない
  • REST APIを使用するのはセキュリティー的に不安だ
  • REST APIをオフにしたいけど信頼できるプラグインでは使いたい

そういったことで「REST APIは信頼できないけど、無効にすると使えないプラグインがあるので困る」なんて人向けのカスタマイズです。