像is_rest()这样的东西是否存在

时间:2016-03-20 作者:websupporter

我从RESTAPI开始。如果我没有完全被误导init 当它是REST API请求时,也会执行动作挂钩。现在,我只想在不是REST API请求时执行一些代码。

所以我想找一个命令is_rest() 为了做一些像

<?php
if( ! is_rest() ) echo \'no-rest-request\';
?>
但我找不到这样的东西。是否有is_rest() 在外面?

6 个回复
最合适的回答,由SO网友:birgire 整理而成

米洛的观点很好REST_REQUEST 常数为definedtrue, 在内部rest_api_loaded() 如果$GLOBALS[\'wp\']->query_vars[\'rest_route\'] 为非空。

它是hooked 进入parse_request 通过:

add_action( \'parse_request\', \'rest_api_loaded\' );
但是parse_request 火灾时间晚于init - 例如,参见法典here.

门票中有一个建议(由丹尼尔·巴舒伯提出)#34373 关于WP_Query::is_rest(), 但它被推迟/取消了。

SO网友:Matthias Günter

刚刚遇到同样的问题,写了一个简单的函数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 and check if `rest_route` starts with `/`
     * 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() {
        if (defined(\'REST_REQUEST\') && REST_REQUEST // (#1)
                || isset($_GET[\'rest_route\']) // (#2)
                        && strpos( $_GET[\'rest_route\'], \'/\', 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;
    }
}
参考文献:

SO网友:Mark

这里有两个选择真的,

检查是否REST_REQUEST 已定义rest_api_init 你想去的地方init.

SO网友:Lucas Bustamante

如果你以后需要的话init 已激发:

defined(\'REST_REQUEST\') && REST_REQUEST

如果你以前需要的话init, 有两种方法:

使用wp_is_json_request(), 或者尝试通过URL推断这是否是REST请求。检测URL将因站点使用的是永久链接还是普通永久链接而有所不同。

WooCommerce就是这样做的,这是一个很好的解决方案:

function is_rest_api_request() {
    if ( empty( $_SERVER[\'REQUEST_URI\'] ) ) {
        // Probably a CLI request
        return false;
    }

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

    return apply_filters( \'is_rest_api_request\', $is_rest_api_request );
}

SO网友:Charly

也许不对,但我最终

if (strpos($_SERVER[ \'REQUEST_URI\' ], \'/wp-json/\') !== false) {
    // Cool API stuff here
}
如果这样做不对,请随时告诉我。尝试制作一个有用的插件启动器,以最终共享:https://gitlab.com/ripp.io/wordpress/plugin-starter

SO网友:Paul G.

为了解决这个问题,我编写了一个简单的自定义函数,基于这样的假设:如果请求的URI位于WordPress站点的Rest API URL之下,那么它就是Rest API请求。

它是有效的端点还是经过身份验证的端点,不由此函数确定。问题是:这个URL是一个潜在的RESTAPI 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库,这将适应。