最近関わった案件で、プラグインを導入しても正常に動作しないケースに出会いました。
例えば、「Contact Form 7」で作成したメールフォームが正常に送信できません。
最初は原因がよく分からなかったのですが、クライアントにヒアリングをしてみると、WordPressのREST APIを無効にしていると分かりました。
REST APIを有効化すると、プラグインは正常に動作します。
どうやらREST APIを無効化していたのが原因だったようです。
これで解決かと思ったのですが、クライアントからの要望で、REST APIはどうしても無効化したいとのこと。
REST API機能無効化してしまうと、REST APIを使っているプラグインは正常に動作しなくなります。特定のプラグインを動作させつつREST APIを無効化しなければなりません。
今回は、プラグインを動作させつつREST APIを無効化する方法をご紹介します。
特定のプラグインでREST APIを無効化する方法
単純にREST APIを無効化する場合、以下のコードをfunctions.phpに追記すればOKです。
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を使っているプラグインは正常に動作しません。
指定したプラグインではREST APIが使えるようにコードをカスタマイズする必要があります。
REST APIを使いたいプラグインを指定する
REST APIをそのまま使いたいプラグインの指定は以下のようにします。
functions.phpに、以下のコードを記述しましょう。
function restapi_except_plugins( $result, $wp_rest_server, $request ){
$namespaces = $request->get_route();
if( strpos( $namespaces, 'プラグイン名/' ) === 1 ){
return $result;
}
if ( current_user_can( 'edit_posts' ) ) {
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', 'restapi_except_plugins', 10, 3 );
注目してもらいたいのは、上記の赤文字【プラグイン名】の部分です。
この部分でREST API使えるようにしたいプラグイン名を記述してやります。
例えば、【jetpack】など。
【jetpack】でREST API使えるようにしたい場合は、以下のように置き換えてやります。
function restapi_except_plugins( $result, $wp_rest_server, $request ){
$namespaces = $request->get_route();
if( strpos( $namespaces, 'jetpack/' ) === 1 ){
return $result;
}
if ( current_user_can( 'edit_posts' ) ) {
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', 'restapi_except_plugins', 10, 3 );
上記のようにお好きなプラグイン名に置き換えてください。
ただし、このプラグイン名にはちょっと注意が必要です。
続きをご覧ください。
プラグイン名には【ディレクトリ名】を記述する
先ほどのコードに記述するプラグイン名には、プラグインの【ディレクトリ名】を指定してやりましょう。プラグイン名は、単純にプラグインの名前を記述しても動作しないので注意が必要です。
ディレクトリ名が正解なのかどうかここはちょっと曖昧なのですが、基本的にプラグインの【ディレクトリ名】を記述してやれば大丈夫です。
jetpack、contact-form-7、redirection、wordpress-popular-posts
この辺りのプラグインで試したところ、ディレクトリ名で正常に動作しました。
もしも、ディレクトリ名で動作しないプラグインがある場合は、今回の方法では対応できない可能性があります。
複数のプラグインを指定する場合
先ほどのコードでは、1つのプラグインのみを対象としました。
複数のプラグインでREST APIを使いたい場合、以下のコードを使用します。
function restapi_except_plugins( $result, $wp_rest_server, $request ){
$namespaces = $request->get_route();
if( strpos( $namespaces, 'プラグイン名/' ) === 1 ){
return $result;
}
if( strpos( $namespaces, 'プラグイン名/' ) === 1 ){
return $result;
}
if ( current_user_can( 'edit_posts' ) ) {
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', 'restapi_except_plugins', 10, 3 );
上記は2つのプラグインを対象としたコードです。
プラグイン名の部分は書き換えてください。
if( strpos( $namespaces, 'プラグイン名/' ) === 1 ){
return $result;
}
上記の部分を増やせば、いくつでもプラグインを指定してやることができます。
プラグイン名の部分は書き換えてください。
WordPressのバージョンが4.9以降の場合
if ( current_user_can( 'edit_posts' ) ) {
return $result;
}
上記の部分は必須となります。
削除すると投稿や固定ページの編集画面が表示されなくなります。
WordPressのバージョン4.9以降は、エディタの仕様が大きく変わりました。
新エディタはREST APIを使っているので、上記のコードを削除すると新エディタが正常に動作せず、編集画面自体が開けなくなってしまいます。
とりあえず、上記のコードを消さないのが無難です。
まとめ
特定のプラグインが動作するようにREST APIを無効化する方法をご紹介しました。
REST APIを無効化すると、REST APIを使っているプラグインが動作しなくなります。
特定のプラグインが動作するようにREST APIを無効化する方法をまとめてみました。
どなたかの参考になれば幸いです。
コメントを残す