มีบางสิ่งที่เหมือนกับ 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ประเภทของการร้องขอไม่ได้กำหนดจนกว่าการแยกวิเคราะห์แบบสอบถามซึ่งเกิดขึ้นหลังจาก นอกจากนี้โปรดทราบว่าส่วนต่างๆของ API สามารถใช้ภายในคำขอที่ไม่ใช่คำขอ REST ได้ดังนั้นคุณอาจเสี่ยงที่จะทำลายบางอย่างหากคุณใช้การตรวจจับนั้น
Milo

ขอบคุณมากที่คุณทั้งคู่ @ Birgire: คุณสามารถโพสต์นี้เป็นคำตอบเพื่อให้ฉันสามารถตรวจสอบได้ โดยทั่วไปจะเป็นคำตอบสำหรับคำถามของฉัน :)
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- ดูตัวอย่าง Codex ที่นี่

มีข้อเสนอแนะ (โดย Daniel Bachhuber) ในตั๋ว# 34373เกี่ยวกับWP_Query::is_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 Rest API ของไซต์ WordPress แล้วมันจะตามมาว่าเป็นคำขอ API แบบ Rest

ไม่ว่าจะเป็นจุดสิ้นสุดที่ถูกต้องหรือได้รับการรับรองความถูกต้องไม่ได้มีไว้สำหรับฟังก์ชั่นนี้ในการพิจารณา คำถามคือ: URL นี้เป็น URL ส่วนที่เหลือของ API หรือไม่

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 อย่างหนักดังนั้นหากคุณเปลี่ยนฐาน URL API ด้วยเหตุผลบางประการสิ่งนี้จะปรับเปลี่ยน


3

อาจจะไม่ถูกต้อง แต่ฉันก็ลงเอยด้วย

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

อย่าลังเลที่จะแจ้งให้เราทราบหากนี่ไม่ถูกต้อง กำลังพยายามสร้างปลั๊กอินเริ่มต้นที่มีประโยชน์เพื่อแบ่งปันในที่สุด: https://gitlab.com/ripp.io/wordpress/plugin-starter


1
ฉันคิดว่าสิ่งนี้จะล้มเหลวหากคุณไม่ได้ใช้งาน permalink สวย
websupporter

คุณถูกต้องแน่นอน
Charly

ตกลงมันต้องใช้ความคิดที่ค่อนข้าง ... แต่ใครไม่ต้องการ !!! นี่เป็นวิธีที่ปลอดภัยที่สุดสำหรับฉันในการทำสิ่งนี้ โซลูชันอื่น ๆ ทั้งหมดเป็นแฟนซี แต่เมื่อเวลาผ่านไปหากคุณต้องการให้โค้ดของคุณยังคงทำงานในเวอร์ชัน wp ในภายหลัง ... นี่เป็นวิธีที่ปลอดภัยสำหรับฉัน !!
Antony Gibbs


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

ฉันไม่มีเวลามากพอที่จะมองหาการทำให้ CLI ตรวจสอบคำขอ REST ก่อนที่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 );
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.