कुछ ऐसा है जो is_rest () मौजूद है


18

मैं REST API के साथ थोड़ी शुरुआत कर रहा हूं। यदि मैं पूरी तरह से गुमराह नहीं हूं, तो initकार्रवाई हुक भी निष्पादित किया जाता है जब इसका REST API अनुरोध होता है। अब, मैं केवल कुछ कोड निष्पादित करना चाहता हूं, जब यह REST API अनुरोध नहीं है।

तो मैं is_rest()कुछ करने के लिए जैसे आदेश की तलाश में था

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

लेकिन मुझे ऐसा कुछ नहीं मिला। वहाँ एक is_rest()बाहर है?


1
हो सकता है कि जब आप REST अनुरोध नहीं करते हैं, तो आप इस पर विस्तार से बता सकते हैं कि आप क्या करना चाहते हैं? अनुरोध का प्रकार क्वेरी पार्सिंग तक निर्धारित नहीं होता है, जो बाद में होता है init। यह भी ध्यान दें कि एपीआई के हिस्सों का उपयोग उन अनुरोधों पर आंतरिक रूप से किया जा सकता है जो आरईएसटी अनुरोध नहीं हैं, इसलिए यदि आप उस खोज पर भरोसा कर रहे हैं तो आप कुछ तोड़ने का जोखिम उठाते हैं।
मिलो

बहुत बहुत धन्यवाद आप दोनों। @ प्रसव: क्या आप इसे उत्तर के रूप में पोस्ट कर सकते हैं, इसलिए मैं इसकी जांच कर सकता हूं। मूल रूप से, यह मेरे प्रश्न का उत्तर है :)
websupporter

जवाबों:


14

यह @Milo द्वारा एक अच्छा बिंदु है, REST_REQUESTस्थिरांक को इस तरह परिभाषित किया जाता है true, rest_api_loaded()जैसे $GLOBALS['wp']->query_vars['rest_route']कि गैर-रिक्त है।

यह इसके माध्यम से जुड़ा हुआ है parse_request:

add_action( 'parse_request', 'rest_api_loaded' );

लेकिन parse_requestबाद में आग से init- उदाहरण के लिए कोडेक्स यहाँ देखें ।

टिकट # 34373 के संबंध में एक सुझाव (डैनियल बछुबर द्वारा) WP_Query::is_rest()था, लेकिन इसे स्थगित / रद्द कर दिया गया।


# 42061wp_is_rest_request() या जोड़ सकते हैं wp_doing_rest()
इयान डन

11

बस उसी समस्या पर ठोकर खाई और एक साधारण फ़ंक्शन लिखा जो is_restआपको यह जांचने की अनुमति देता है कि क्या वर्तमान अनुरोध WP REST API अनुरोध है।

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

संदर्भ:


4

इस समस्या को हल करने के लिए मैंने इस धारणा के आधार पर एक सरल कस्टम फ़ंक्शन लिखा था कि यदि URI का अनुरोध किया जा रहा है, तो वह वर्डप्रेस साइट के रेस्ट एपीआई URL के अंतर्गत आता है, तो यह इस प्रकार है कि यह एक रेस्ट एपीआई अनुरोध है।

क्या यह एक मान्य समापन बिंदु है, या प्रमाणित है, यह निर्धारित करने के लिए इस फ़ंक्शन के लिए नहीं है। सवाल यह है कि क्या 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;
}

यदि आपकी $_SERVER['REQUEST_URI']ठीक से आबादी नहीं है, तो यह फ़ंक्शन अभी भी falseपरवाह किए बिना वापस आ जाएगा ।

URL का कोई हार्ड-कोडिंग नहीं है इसलिए यदि आप किसी कारण से अपना API URL आधार बदलते हैं, तो यह अनुकूल होगा।


3

शायद सही नहीं, लेकिन मैं खत्म हो गया

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

अगर यह सही नहीं है तो मुझे यह बताने में संकोच न करें। अंततः साझा करने के लिए एक सहायक प्लगइन स्टार्टर बनाने की कोशिश: https://gitlab.com/ripp.io/wordpress/plugin-starter


1
मुझे लगता है, यह विफल होगा, अगर आपके पास बहुत अधिक पर्मलिंक सक्रिय नहीं होंगे।
websupporter

आप निश्चित रूप से सही हैं
चार्ली

ठीक है, यह बहुत permalink की आवश्यकता है ... लेकिन जो यह नहीं चाहता है !!! यह मुझे ऐसा करने का सबसे सुरक्षित तरीका लगता है। अन्य सभी समाधान फैंसी हैं, लेकिन समय के साथ यदि आप चाहते हैं कि आपका कोड अभी भी बाद के wp संस्करणों पर चले ... यह मुझे एक सुरक्षित तरीका लगता है !!
एंटनी गिब्स

1

दो विकल्प यहाँ वास्तव में,

  1. अगर REST_REQUESTपरिभाषित किया गया है तो जाँच करें ।
  2. में हुक rest_api_initजहां में हुक करना चाहता था init

0

यहाँ मैं क्या लेकर आया हूँ:

/**
 * Determines if the current request we are handling is a REST Request.
 * This function can be called even on mu-plugins.
 *
 * You might want to prefix this function name with
 * something more unique to your project.
 *
 * @return bool
 */
function is_rest(): bool {
    $is_cli              = php_sapi_name() === 'cli';
    $permalink_structure = get_option( 'permalink_structure' );
    $rest_prefix         = rest_get_url_prefix();

    if ( ! empty( $permalink_structure ) && ! $is_cli ) {
        /*
         * HTTP request with Pretty Permalinks.
         */
        if ( substr( $_SERVER['REQUEST_URI'], 0, strlen( $rest_prefix ) ) === $rest_prefix ) {
            return true;
        }
    } elseif ( empty( $permalink_structure ) && ! $is_cli ) {
        /*
         * HTTP Requests with Plain Permalinks
         *
         * We can rely on "?rest_route" for plain permalinks, this value don't change:
         * wp/wp-includes/rest-api.php:145
         *
         * All ?rest_route must start with "/":
         * wp/wp-includes/rest-api.php:159
         */
        if ( isset( $_GET['rest_route'] ) && substr( $_GET['rest_route'], 0, 1 ) === '/' ) {
            return true;
        }
    } elseif ( $is_cli ) {
        /*
         * CLI request
         */
        if ( did_action( 'parse_request' ) ) {
            return defined( 'REST_REQUEST' ) && REST_REQUEST;
        } else {
            throw new RuntimeException( "Maybe someone at StackOverflow can help fill this gap of identifying REST requests on CLI before the parse_request action has fired and the REST_REQUEST constant is available?" );
        }
    }

    return false;
}

parse_requestहालाँकि, कार्रवाई से पहले, बाकी सीएलआई का पता लगाने के लिए मेरे पास इतना समय नहीं था कि मैं कार्रवाई करूँ । मैं सुझाव के लिए खुला हूँ!

मुझे इस सुविधा के आसपास कुछ परीक्षण लिखने हैं, मैं एक बार ऐसा करने के बाद इस उत्तर को अपडेट करूंगा।

- संपादित करें

बस पाया गया कि WooCommerce कैसे संभालता है। WooCommerce को सादे पर्मलिंक के लिए खाता नहीं लगता है:

public function is_rest_api_request() {
    if ( empty( $_SERVER['REQUEST_URI'] ) ) {
        return false;
    }

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

    return apply_filters( 'woocommerce_is_rest_api_request', $is_rest_api_request );
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.