Wordpress - Does something like is_rest() exist
It's a good point by @Milo, the REST_REQUEST
constant is defined as true
, within rest_api_loaded()
if $GLOBALS['wp']->query_vars['rest_route']
is non-empty.
It's hooked into parse_request
via:
add_action( 'parse_request', 'rest_api_loaded' );
but parse_request
fires later than init
- See for example the Codex here.
There was a suggestion (by Daniel Bachhuber) in ticket #34373 regarding WP_Query::is_rest()
, but it was postponed/cancelled.
Just stumbled over the same problem and wrote a simple function is_rest
that allows you to check if the current request is a WP REST API request.
<?php
if ( !function_exists( 'is_rest' ) ) {
/**
* Checks if the current request is a WP REST API request.
*
* Case #1: After WP_REST_Request initialisation
* Case #2: Support "plain" permalink settings
* Case #3: It can happen that WP_Rewrite is not yet initialized,
* so do this (wp-settings.php)
* Case #4: URL Path begins with wp-json/ (your REST prefix)
* Also supports WP installations in subfolders
*
* @returns boolean
* @author matzeeable
*/
function is_rest() {
$prefix = rest_get_url_prefix( );
if (defined('REST_REQUEST') && REST_REQUEST // (#1)
|| isset($_GET['rest_route']) // (#2)
&& strpos( trim( $_GET['rest_route'], '\\/' ), $prefix , 0 ) === 0)
return true;
// (#3)
global $wp_rewrite;
if ($wp_rewrite === null) $wp_rewrite = new WP_Rewrite();
// (#4)
$rest_url = wp_parse_url( trailingslashit( rest_url( ) ) );
$current_url = wp_parse_url( add_query_arg( array( ) ) );
return strpos( $current_url['path'], $rest_url['path'], 0 ) === 0;
}
}
References:
- https://gist.github.com/matzeeable/dfd82239f48c2fedef25141e48c8dc30
- https://twitter.com/matzeeable/status/1052967482737258496
Two options here really,
- Check if
REST_REQUEST
is defined. - Hook into
rest_api_init
where you wanted to hook intoinit
.