ここに私が思いついたものがあります:
/**
* Determines if the current request we are handling is a REST Request.
* This function can be called even on mu-plugins.
*
* You might want to prefix this function name with
* something more unique to your project.
*
* @return bool
*/
function is_rest(): bool {
$is_cli = php_sapi_name() === 'cli';
$permalink_structure = get_option( 'permalink_structure' );
$rest_prefix = rest_get_url_prefix();
if ( ! empty( $permalink_structure ) && ! $is_cli ) {
/*
* HTTP request with Pretty Permalinks.
*/
if ( substr( $_SERVER['REQUEST_URI'], 0, strlen( $rest_prefix ) ) === $rest_prefix ) {
return true;
}
} elseif ( empty( $permalink_structure ) && ! $is_cli ) {
/*
* HTTP Requests with Plain Permalinks
*
* We can rely on "?rest_route" for plain permalinks, this value don't change:
* wp/wp-includes/rest-api.php:145
*
* All ?rest_route must start with "/":
* wp/wp-includes/rest-api.php:159
*/
if ( isset( $_GET['rest_route'] ) && substr( $_GET['rest_route'], 0, 1 ) === '/' ) {
return true;
}
} elseif ( $is_cli ) {
/*
* CLI request
*/
if ( did_action( 'parse_request' ) ) {
return defined( 'REST_REQUEST' ) && REST_REQUEST;
} else {
throw new RuntimeException( "Maybe someone at StackOverflow can help fill this gap of identifying REST requests on CLI before the parse_request action has fired and the REST_REQUEST constant is available?" );
}
}
return false;
}
parse_request
ただし、アクションが発生する前にCLIがREST要求を検出するようにする時間はあまりありませんでした。私は提案を受け入れます!
この機能に関するテストをまだ作成していません。この回答を更新します。
-編集
WooCommerceがこれを処理する方法を見つけました。WooCommerceはプレーンパーマリンクを考慮していないようです。
public function is_rest_api_request() {
if ( empty( $_SERVER['REQUEST_URI'] ) ) {
return false;
}
$rest_prefix = trailingslashit( rest_get_url_prefix() );
$is_rest_api_request = ( false !== strpos( $_SERVER['REQUEST_URI'], $rest_prefix ) );
return apply_filters( 'woocommerce_is_rest_api_request', $is_rest_api_request );
}
init
。また、RESTリクエストではないリクエストでAPIの一部を内部で使用できるため、その検出に依存している場合は何かを壊す危険性があります。