내가 생각해 낸 것은 다음과 같습니다.
/**
* 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
. 또한 API의 일부는 REST 요청이 아닌 요청에 대해 내부적으로 사용될 수 있으므로 해당 탐지에 의존하는 경우 무언가를 깨뜨릴 위험이 있습니다.