web-dev-qa-db-fra.com

Est-ce que quelque chose comme is_rest () existe

Je commence un peu avec l'API REST. Si je ne suis pas complètement induit en erreur, le hook d’action init est également exécuté lorsqu’il s’agit d’une demande d’API REST. À présent, je souhaite exécuter du code uniquement, lorsqu'il ne s'agit pas d'une demande d'API REST.

Je cherchais donc une commande telle que is_rest() afin de faire quelque chose comme

<?php
if( ! is_rest() ) echo 'no-rest-request';
?>

Mais je ne pouvais pas trouver quelque chose comme ça. Existe-t-il une is_rest()?

10
websupporter

@Milo est un bon point. La constante REST_REQUEST est définie comme true, dans rest_api_loaded() si $GLOBALS['wp']->query_vars['rest_route'] est non vide.

C'est accroché dans parse_request via:

add_action( 'parse_request', 'rest_api_loaded' );

mais parse_request se déclenche après init - Voir par exemple le Codex ici .

Il y avait une suggestion (de Daniel Bachhuber) dans ticket # 34373 concernant WP_Query::is_rest(), mais elle a été reportée/annulée.

11
birgire

Nous sommes juste tombés sur le même problème et nous avons écrit une fonction simple is_rest qui vous permet de vérifier si la requête actuelle est une requête d'API WP REST.

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: URL Path begins with wp-json/ (your REST prefix)
     *          Also supports WP installations in subfolders
     * 
     * @author matzeeable
     * @return boolean
     */
    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)
        $rest_url = wp_parse_url( site_url( $prefix ) );
        $current_url = wp_parse_url( add_query_arg( array( ) ) );
        return strpos( $current_url['path'], $rest_url['path'], 0 ) === 0;
    }
}

Références:

6
Matthias Günter

Pour résoudre ce problème, j'ai écrit une fonction personnalisée simple en partant du principe que si l'URI demandé relevait de l'URL Rest de l'URL du site WordPress, il s'agissait alors d'une demande d'API Rest.

Qu'il s'agisse d'un noeud final valide ou authentifié, cette fonction n'est pas à déterminer. La question est la suivante: l'URL est-elle une URL potentielle de l'API Reste?

function isRestUrl() {
    $bIsRest = false;
    if ( function_exists( 'rest_url' ) && !empty( $_SERVER[ 'REQUEST_URI' ] ) ) {
        $sRestUrlBase = get_rest_url( get_current_blog_id(), '/' );
        $sRestPath = trim( parse_url( $sRestUrlBase, PHP_URL_PATH ), '/' );
        $sRequestPath = trim( $_SERVER[ 'REQUEST_URI' ], '/' );
        $bIsRest = ( strpos( $sRequestPath, $sRestPath ) === 0 );
    }
    return $bIsRest;
}

Si votre $_SERVER['REQUEST_URI'] n'est pas correctement rempli, cette fonction retournera quand même false, peu importe.

Il n'y a pas de codage en dur de l'URL; par conséquent, si vous modifiez pour une raison quelconque la base d'URL de votre API, cela sera adapté.

3
Paul G.

Deux options vraiment ici,

  1. Vérifiez si REST_REQUEST est défini.
  2. Accrocher dans rest_api_init où vous voulez accrocher dans init.
1
Mark