Is_rest () এর মতো কিছু রয়েছে কি?


18

আমি REST এপিআই দিয়ে কিছুটা শুরু করছি। আমি যদি পুরোপুরি বিভ্রান্ত না হয়ে থাকি তবে initএটি একটি REST এপিআইয়ের অনুরোধ করলে অ্যাকশন হুকটিও কার্যকর করা হয়। এখন, আমি কেবলমাত্র কিছু কোড কার্যকর করতে চাই, যখন এটি কোনও REST এপিআই অনুরোধ নয়।

তাই আমি is_rest()কিছু করার মত একটি কমান্ড খুঁজছিলাম

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

তবে আমি এর মতো কিছু পাইনি। সেখানে কি is_rest()বাইরে আছে?


1
এটি যখন বিশ্রামের অনুরোধ না হয় তখন আপনি কী করতে চান তা বিশদভাবে বলতে পারেন? ক্যোয়ারী পার্সিং না হওয়া পর্যন্ত অনুরোধের ধরণ নির্ধারিত হয় না, যা পরে ঘটে init। এছাড়াও নোট করুন যে API এর অংশগুলি অনুরোধগুলিতে অভ্যন্তরীণভাবে ব্যবহার করা যেতে পারে যা REST অনুরোধগুলি নয়, তাই আপনি যদি সেই সনাক্তকরণের উপর নির্ভর করে থাকেন তবে আপনার কিছু ভাঙার ঝুঁকি রয়েছে।
মিলো

আপনাকে উভয় অনেক ধন্যবাদ। @বিরগায়ার: আপনি কি উত্তর হিসাবে পোস্ট করতে পারেন, তাই আমি এটি পরীক্ষা করতে পারি। মূলত, এটি আমার প্রশ্নের জবাব :)
ওয়েবসপোর্টার

উত্তর:


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(), তবে এটি স্থগিত / বাতিল করা হয়েছিল।


# 42061 যুক্ত হতে পারে wp_is_rest_request()বা wp_doing_rest()
ইয়ান ডান

11

ঠিক একই সমস্যার কারণে হোঁচট খেয়েছে এবং একটি সাধারণ ফাংশন লিখেছেন is_restযা আপনাকে বর্তমানের অনুরোধটি WP REST এপিআই অনুরোধ কিনা তা যাচাই করার অনুমতি দেয়।

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

এই সমস্যা সমাধানের জন্য আমি এই ধারণার উপর ভিত্তি করে একটি সাধারণ কাস্টম ফাংশন লিখেছিলাম যে ইউআরআই-এর অনুরোধ করা যদি ওয়ার্ডপ্রেস সাইটের রেস্ট এপিআই 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নির্বিশেষে এই ফাংশনটি ফিরে আসবে ।

ইউআরএলটির কোনও হার্ড-কোডিং নেই তাই যদি আপনি কোনও কারণে আপনার এপিআই ইউআরএল বেসটি পরিবর্তন করেন তবে এটি অভিযোজিত হবে।


3

হয়তো ঠিক না, তবে আমি শেষ করেছি

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

এটি সঠিক না হলে আমাকে নির্দ্বিধায় জানান। অবশেষে ভাগ করে নেওয়ার জন্য একটি সহায়ক প্লাগইন স্টার্টার তৈরি করার চেষ্টা করছেন: https://gitlab.com/ripp.io/wordpress/plugin-starter


1
আমি মনে করি, এটি ব্যর্থ হবে, যদি আপনি বেশ পারমলিক্সগুলি সক্রিয় না করেন।
ওয়েবসপোর্টার

আপনি অবশ্যই সঠিক
চার্লি

ঠিক আছে এর জন্য বেশ পারমিলিংক দরকার ... তবে কে এটা চায় না !!!? এটি আমার কাছে এটির সবচেয়ে নিরাপদ উপায় বলে মনে হচ্ছে। অন্যান্য সমস্ত সমাধান অভিনব তবে সময়ের সাথে সাথে যদি আপনি চান আপনার কোডটি পরে ডাব্লুপি সংস্করণগুলিতে চালিত হয় ... এটি আমার কাছে একটি নিরাপদ উপায় বলে মনে হয় !!
অ্যান্টনি গিবস

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 সরল permalink জন্য অ্যাকাউন্ট হিসাবে মনে হয় না:

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 );
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.