Esiste qualcosa come is_rest() in WordPress?

20 mar 2016, 14:48:48
Visualizzazioni: 18.9K
Voti: 34

Sto iniziando a lavorare un po' con le REST API. Se non mi sbaglio completamente, l'hook di azione init viene eseguito anche quando si tratta di una richiesta REST API. Ora voglio eseguire del codice solo quando non si tratta di una richiesta REST API.

Quindi stavo cercando un comando come is_rest() per fare qualcosa del tipo:

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

Ma non ho trovato niente del genere. Esiste una funzione is_rest()?

2
Commenti

Forse puoi elaborare su cosa vuoi fare quando non si tratta di una richiesta REST? Il tipo di richiesta non viene determinato fino al parsing della query, che avviene dopo init. Inoltre, tieni presente che parti dell'API possono essere utilizzate internamente su richieste che non sono richieste REST, quindi rischi di interrompere qualcosa se ti affidi a quel rilevamento.

Milo Milo
20 mar 2016 18:39:42

Grazie mille a entrambi. @birgire: Potresti pubblicare questo come risposta, così posso verificarlo. Fondamentalmente, è la risposta alla mia domanda :)

websupporter websupporter
21 mar 2016 08:58:49
Tutte le risposte alla domanda 8
1
22

È un'ottima osservazione quella di @Milo, la costante REST_REQUEST è definita come true all'interno di rest_api_loaded() se $GLOBALS['wp']->query_vars['rest_route'] non è vuoto.

Viene agganciata a parse_request tramite:

add_action( 'parse_request', 'rest_api_loaded' );

ma parse_request viene attivato dopo init - Vedi ad esempio il Codex qui.

C'era stata una proposta (di Daniel Bachhuber) nel ticket #34373 riguardo a WP_Query::is_rest(), ma è stata rinviata/annullata.

21 mar 2016 16:34:39
Commenti

#42061 potrebbe aggiungere wp_is_rest_request() o wp_doing_rest().

Ian Dunn Ian Dunn
10 mar 2020 21:40:35
3
22

Mi sono appena imbattuto nello stesso problema e ho scritto una semplice funzione is_rest che ti permette di verificare se la richiesta corrente è una richiesta dell'API REST di WordPress.

<?php

if ( !function_exists( 'is_rest' ) ) {
    /**
     * Verifica se la richiesta corrente è una richiesta dell'API REST di WordPress.
     *
     * Caso #1: Dopo l'inizializzazione di WP_REST_Request
     * Caso #2: Supporta le impostazioni di permalink "semplici" e verifica se `rest_route` inizia con `/`
     * Caso #3: Può succedere che WP_Rewrite non sia ancora inizializzato,
     *          quindi esegui questo (wp-settings.php)
     * Caso #4: Il percorso URL inizia con wp-json/ (il tuo prefisso REST)
     *          Supporta anche installazioni WP in sottocartelle
     *
     * @returns boolean
     * @author matzeeable
     */
    function is_rest() {
        if (defined('REST_REQUEST') && REST_REQUEST // (#1)
                || isset($_GET['rest_route']) // (#2)
                        && strpos( $_GET['rest_route'], '/', 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;
    }
}

Riferimenti:

18 ott 2018 20:02:11
Commenti

Non ho capito cosa fa il punto #3.

kodfire kodfire
20 giu 2022 11:43:54

Questa è la migliore funzione per WordPress mai scritta su stackoverflow. Avevo bisogno di usarla per un hook pre_get_posts che ignora le richieste REST e ha funzionato alla perfezione.

Philip Philip
25 gen 2023 10:12:46

Ah! Ora capisco cosa non va in un popolare plugin che ha copiato il tuo codice del 2018 ma non ha mai recepito la modifica (molto importante) che hai fatto nel 2022! Ben fatto :-) Grazie per l'aggiornamento!

Gwyneth Llewelyn Gwyneth Llewelyn
24 set 2023 14:28:36
0
13

Se ti serve dopo che init è stato eseguito:

defined('REST_REQUEST') && REST_REQUEST

Se ti serve prima di init, ci sono due modi:

Usa wp_is_json_request() (introdotto in WordPress 5.0), o cerca di dedurre se è una richiesta REST attraverso l'URL. Rilevare l'URL varierà a seconda che il sito utilizzi permalink o permalink semplici.

WooCommerce lo fa in questo modo, ed è una buona soluzione:

function is_rest_api_request() {
    if ( empty( $_SERVER['REQUEST_URI'] ) ) {
        // Probabilmente una richiesta CLI
        return false;
    }

    $rest_prefix         = trailingslashit( rest_get_url_prefix() );
    $is_rest_api_request = strpos( $_SERVER['REQUEST_URI'], $rest_prefix ) !== false;

    return apply_filters( 'is_rest_api_request', $is_rest_api_request );
}
22 gen 2020 15:46:34
1

Due opzioni qui, in realtà,

  1. Controlla se REST_REQUEST è definito.
  2. Agganciati a rest_api_init dove volevi agganciarti a init.
10 mar 2019 22:28:26
Commenti

Se stai utilizzando la versione 4.4.0+ di WP (cosa molto probabile), questa è la risposta corretta.

Mat Lipe Mat Lipe
5 ott 2020 22:54:38
0

Per risolvere questo problema ho scritto una semplice funzione personalizzata basata sull'assunto che se l'URI richiesto rientra nell'URL dell'API REST del sito WordPress, allora si tratta di una richiesta all'API REST.

Se si tratti di un endpoint valido o autenticato, non spetta a questa funzione determinarlo. La domanda è: l'URL è un potenziale URL dell'API REST?

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;
}

Se il tuo $_SERVER['REQUEST_URI'] non è popolato correttamente, questa funzione restituirà comunque false.

Non c'è alcun hard-coding dell'URL, quindi se per qualche motivo cambi la base dell'URL dell'API, questa funzione si adatterà automaticamente.

8 set 2017 11:29:35
3

Forse non è corretto, ma ho finito con

if (strpos($_SERVER[ 'REQUEST_URI' ], '/wp-json/') !== false) {
    // Roba interessante per l'API qui
}

Sentiti libero di farmi sapere se questo non è corretto. Sto cercando di creare uno starter utile per plugin da condividere eventualmente: https://gitlab.com/ripp.io/wordpress/plugin-starter

30 mag 2019 18:36:41
Commenti

Penso che questo fallirebbe, se non avessi i pretty permalink attivi.

websupporter websupporter
10 giu 2019 12:34:07

Hai decisamente ragione

Charly Charly
11 giu 2019 17:25:40

Ok richiede i pretty permalink... ma chi non li vorrebbe!!!? Questa mi sembra la soluzione più sicura per farlo. Tutte le altre soluzioni sono fantasiose ma col tempo se vuoi che il tuo codice continui a funzionare sulle versioni successive di wp... questa mi sembra la strada più sicura!!

Antony Gibbs Antony Gibbs
30 lug 2019 09:21:39
1

Con WordPress 6.5, il core fornisce una funzione come wp_is_rest_endpoint per determinare in modo affidabile se la richiesta corrente è una richiesta verso un endpoint REST.

C'è anche un'altra funzione wp_is_serving_rest_request per verificare se una richiesta REST API è effettivamente in fase di elaborazione. Se la usi, assicurati di chiamarla dopo l'azione parse_request, poiché restituirà sempre false prima di essa.

15 mag 2024 08:58:03
Commenti

Miglior risposta finora

Kuba Niewiarowski Kuba Niewiarowski
20 set 2024 18:52:08
0

Puoi utilizzare wp_is_json_request() come mostrato di seguito:

if ( wp_is_json_request() ) {
    // esegui qui le tue operazioni
}

Assicurati di impostare Accepts o Content-Type come application/json altrimenti wp_is_json_request() restituirà false.

Ulteriore documentazione: https://developer.wordpress.org/reference/functions/wp_is_json_request/

5 nov 2022 11:03:28