REST APIアクセス制限をしていると、Download Monitor 4.9.6以降でレポートが正常に表示されない原因と対応

公開日:2024(令和6)年1月24日/最終更新日:

WordPress Trouble Shooting and Repair | Personal WP Customization Notes (PWCN)

【景品表示法に基づく表記】ページ内のコンテンツには、商品プロモーションが含まれています



先日更新情報が流れてきた「Download Monitor」プラグイン、バージョン4.9.5から4.9.6にしたら、同プラグインのレポート画面がスピナー(ぐるぐる)のままになるようになりました。

コンソールで確認すると、REST APIが通っていないという感じでしたので、いろいろなところで紹介されている特定のプラグイン以外のREST APIでのアクセスを拒否するコードを参考にして、以下のようなコードでREST APIのアクセス制限をかけていることが原因と推察しました。

function sample_deny_restapi_except_plugins( $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;
	}

	//Redirectionの除外
	if( strpos( $namespaces, 'redirection/' ) === 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', 'sample_deny_restapi_except_plugins', 10, 3 );

このコードはコード内のコメントに書いているプラグインとブロックエディターのREST APIを除き、すべてのアクセスを遮断するというもので、やはりこのフィルターを有効にしていると、「Download Monitor」のレポート画面が正常に表示されなくなりました。

プラグイン作者等へも公式フォーラムでお伺いしながら対処してみたところ、以下の条件を足すことで解決できました。

//Download Manager(レポートの一部エンドポイント)の除外
if( strpos( $namespaces, 'wp/v2/dlm_download' ) === 1 ){
	return $result;
}

できてみれば簡単なこと?だったのですが、ここに至る経緯について、以下にメモとして残しておきます。

苦労したのはrest_pre_dispatchフィルターの使い方の認識違いでした

REST APIのアクセス制限コードに関する情報を見ていると、単純に「プラグインディレクトリ名」を指定するとよいというのが非常に多かったですし、変数に「$namespace」というネームスペースを想像させるような文字列が使われていましたし、使われているget_route()を見ても「リクエストに一致したルートを取得します。」とあったので、てっきり「register_rest_route」で登録したネームスペースが必要なのだと思い込んでいました。

でもget_route()のページをよく見ると、「戻り値が正規表現に一致するルート」となっていることから、以下のようなREST APIのURLが生成されたとした場合の〇〇の部分が指定した文字列と一致するかの判断をさせれば済んだ(上の解決コードの通り)のです。

https://サイトのURL/wp-json/〇〇

この部分は、パラメーター付きながら、今回エラーとなった部分は

https://サイトのURL/wp-json/wp/v2/dlm_download...

となっていて、プラグインのソースコード中にも「wp/v2/dlm_download」という文字列が直書きで加えられていたので、素直にこの部分を除外すればよかったというオチでした。

私自身REST APIについては明るくなかったので、これが分かるまでの間、バージョン4.9.5と4.9.6の間でこの部分の書き方が変わった以下の部分を戻して検証したりして、いろいろとプラグイン作者へも質問させていただきました。

バージョン4.9.5

$rest_rout_downloadscpt = rest_url( 'wp/v2/dlm_download' . $separator . '_fields=' . implode( ',', $cpt_fields ) . '&_wpnonce=' . wp_create_nonce( 'wp_rest' ) . $current_user_can );

バージョン4.9.6

$rest_rout_downloadscpt = rest_url( 'wp/v2/dlm_download' . $separator . '_fields=' . implode( ',', $cpt_fields ) . $current_user_can );

コードの違いはアクセス権限の有無を確認する処理があるかどうか(いろいろ調べた結果多分ですが..)で、これを戻すと問題なくレポート表示できるので、???と約2日悩んだのですが、解決してみたらなーーんだってことでした(笑)。

ひょっとするとREST APIでの情報取得を制限したい目的で私と同じように制限をかけつつ、「Download Monitor」プラグインを使っている方はいるだろうと思いますので、そうした方が不具合?となった時の参考になれば幸いです。

個人的に今回は本当にいい勉強になりました。また、サードパーティのコードを使用した際の不具合にも関わらず、紳士的に対応いただいたプラグイン作者様に感謝感謝です。

, , , , , ,



Lolipop ServerMoshimo Ad x-serverMoshimo Ad

Recommend Plugins for WordPress | Personal WP Customization Notes (PWCN)
コンテンツ配布用のプラグインを「Simple Download Monitor」から「Download Monitor」に変えた理由