it-swarm.com.de

Gibt es so etwas wie is_rest ()?

Ich beginne ein bisschen mit der REST API. Wenn ich nicht vollständig irregeführt werde, wird der Aktions-Hook init auch ausgeführt, wenn es sich um eine REST -API-Anforderung handelt. Jetzt möchte ich nur Code ausführen, wenn es sich nicht um eine REST API-Anforderung handelt.

Also habe ich nach einem Befehl wie is_rest() gesucht, um so etwas zu tun

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

Aber ich konnte so etwas nicht finden. Gibt es da draußen eine is_rest()?

10
websupporter

Es ist ein guter Punkt von @Milo, die REST_REQUEST-Konstante ist definiert als true, innerhalb von rest_api_loaded(), wenn $GLOBALS['wp']->query_vars['rest_route'] nicht leer ist.

Es ist eingehakt in parse_request über:

add_action( 'parse_request', 'rest_api_loaded' );

aber parse_request wird später ausgelöst als init - Siehe zum Beispiel den Codex hier .

Es gab einen Vorschlag (von Daniel Bachhuber) in Ticket # 34373 bezüglich WP_Query::is_rest(), der jedoch verschoben/annulliert wurde.

11
birgire

Bin nur über dasselbe Problem gestolpert und habe eine einfache Funktion is_rest geschrieben, mit der Sie prüfen können, ob es sich bei der aktuellen Anforderung um eine WP REST API-Anforderung handelt.

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

Verweise:

6

Um dieses Problem zu lösen, habe ich eine einfache benutzerdefinierte Funktion geschrieben, basierend auf der Annahme, dass wenn der angeforderte URI unter die Rest-API-URL der WordPress-Site fällt, es sich um eine Rest-API-Anforderung handelt.

Ob es sich um einen gültigen oder einen authentifizierten Endpunkt handelt, kann von dieser Funktion nicht bestimmt werden. Die Frage ist: Ist die URL eine potenzielle Rest-API-URL?

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

Wenn Ihr $_SERVER['REQUEST_URI'] nicht richtig ausgefüllt ist, gibt diese Funktion trotzdem false zurück.

Die URL ist nicht fest codiert. Wenn Sie also aus irgendeinem Grund Ihre API-URL-Basis ändern, wird dies angepasst.

3
Paul G.

Vielleicht nicht richtig, aber ich landete mit

if (strpos($_SERVER[ 'REQUEST_URI' ], '/wp-json/') !== false) {
    // Cool API stuff here
}

Fühlen Sie sich frei, mich zu informieren, wenn dies nicht richtig ist. Der Versuch, einen hilfreichen Plugin-Starter für die gemeinsame Nutzung zu erstellen: https://gitlab.com/ripp.io/wordpress/plugin-starter

1
Charly

Zwei Möglichkeiten hier wirklich,

  1. Überprüfen Sie, ob REST_REQUEST definiert ist.
  2. Haken Sie in rest_api_init an der Stelle ein, an der Sie sich in init einhängen wollten.
1
Mark