先日、Contact Form 7プラグインでメールフォームを作成しました。
そして、動作確認のためメールを送ろうと「送信ボタン」を押したところ、スピナーがグルグル回るだけで、一向に送信できませんでした。
こうなる原因は多々あるのですが、僕の場合はWordpressのREST API機能を無効にしていたのが原因だったようです。
通常、Wordpressのデフォルト動作ではREST APIは有効になっています。
ただ僕は、「REST API機能は使うことはない」ということと、先日「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 エンドポイントを追加。
これにより、冒頭で述べたようにメールを送ろうとしても、スピナーがグルグル回るだけで、送信できなくなってしまったようです。
なので、「何とか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の送信を行うと、問題なくメールが送信できました。
まとめ
今回紹介した方法は、Wordpress4.7からデフォルト動作となっているREST APIをそのまま使用している場合には、不要のカスタマイズです。
今回の方法は、どちらかと言うと以下の要件に合う人向けのものです。
- REST APIでコンテンツを読み取られたくない
- REST APIを使用するのはセキュリティー的に不安だ
- REST APIをオフにしたいけど信頼できるプラグインでは使いたい
そういったことで「REST APIは信頼できないけど、無効にすると使えないプラグインがあるので困る」なんて人向けのカスタマイズです。