Gibt es so etwas wie is_rest ()?

16

Ich beginne ein bisschen mit der REST-API. Wenn ich nicht vollständig irregeführt werde, wird der initAktions-Hook 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 suchte ich nach einem Befehl wie is_rest(), um so etwas zu machen

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

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

Websupporter
quelle
1
Vielleicht können Sie näher erläutern, was Sie tun möchten, wenn es sich nicht um eine REST-Anforderung handelt? Der Anfragetyp wird erst bestimmt, wenn die Abfrage analysiert wird init. Dies geschieht dann . Beachten Sie auch, dass die Teile der API intern für Anforderungen verwendet werden können, bei denen es sich nicht um REST-Anforderungen handelt. Wenn Sie sich also auf diese Erkennung verlassen, besteht die Gefahr, dass etwas beschädigt wird.
Milo
Vielen Dank euch beiden. @birgire: Kannst du das als Antwort posten, damit ich es überprüfen kann? Grundsätzlich ist es die Antwort auf meine Frage :)
Websupporter

Antworten:

14

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

Es ist eingehakt in parse_requestvia:

add_action( 'parse_request', 'rest_api_loaded' );

aber parse_requestfeuert später als init- Siehe zum Beispiel den Codex hier .

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

birgire
quelle
9

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

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

Verweise:

Matthias Günter
quelle
4

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 Ihre $_SERVER['REQUEST_URI']Daten nicht ordnungsgemäß ausgefüllt sind, wird diese Funktion trotzdem zurückgegeben false.

Es gibt keine feste Kodierung der URL. Wenn Sie also aus irgendeinem Grund Ihre API-URL-Basis ändern, wird dies angepasst.

Paul G.
quelle
2

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

Charly
quelle
1
Ich denke, das würde scheitern, wenn du keine hübschen Permalinks aktiv hättest.
Websupporter
Sie sind definitiv richtig
Charly
Ok, es braucht einen schönen Permalink ... aber wer will das nicht !!!? Dies scheint mir der sicherste Weg zu sein. Alle anderen Lösungen sind schick, aber im Laufe der Zeit, wenn Sie möchten, dass Ihr Code noch auf späteren wp-Versionen ausgeführt wird ... das scheint mir ein sicherer Weg zu sein !!
Antony Gibbs
1

Zwei Möglichkeiten hier wirklich,

  1. Überprüfen Sie, ob REST_REQUESTdefiniert ist.
  2. Haken rest_api_initSie ein, wo Sie einhaken wollten init.
Kennzeichen
quelle