我从REST API开始。如果我没有完全误导,则在其REST API请求时也会执行init操作挂钩。现在,我只想在非REST API请求时执行一些代码。

所以我在寻找类似is_rest()的命令以执行类似
<?php
if( ! is_rest() ) echo 'no-rest-request';
?>


但是我找不到这样的东西。是否有is_rest()

评论

也许您可以详细说明非REST请求时要做什么?直到查询解析后才确定请求的类型,这是在初始化之后发生的。还要注意,API的各个部分可以在不是REST请求的请求上内部使用,因此如果依赖于该检测,则可能会破坏某些内容。

非常感谢你们俩。 @birgire:能否将其发布为答案,所以我可以检查一下。基本上,这是我的问题的答案:)

#1 楼

@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。

在#34373票中有一个关于WP_Query::is_rest()的建议(由Daniel Bachhuber提出),但被推迟/取消。

评论


#42061可能会添加wp_is_rest_request()或wp_doing_rest()。

–伊恩·邓恩
20 Mar 10 '20 at 19:40

#2 楼

刚刚偶然发现了相同的问题,并编写了一个简单的函数is_rest,该函数可让您检查当前请求是否为WP REST API请求。 >

https://gist.github.com/matzeeable/dfd82239f48c2fedef25141e48c8dc30
https://twitter.com/matzeeable/status/1052967482737258496


#3 楼

确实有两个选项,


检查是否定义了REST_REQUEST
rest_api_init钩到要钩住init的位置。


评论


如果您正在使用WP版本4.4.0+(可能是),这是正确的答案。

–马特·利普(Mat Lipe)
20-10-5在19:54

#4 楼

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

有效的端点或已验证的端点无法为此功能确定。问题是这样的:URL是否是潜在的Rest API URL? br />
没有对该URL进行硬编码,因此,如果您出于某种原因更改了API URL库,这将适应。

#5 楼

也许不对,但我最后还是

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


随时告诉我这是否不合适。尝试制作一个有用的插件入门工具以最终分享:https://gitlab.com/ripp.io/wordpress/plugin-starter

评论


我认为,如果您没有相当多的永久链接处于活动状态,这将失败。

– websupporter
19年6月10日在9:34

你绝对是对的

– Charly
19年6月11日在14:25

好的,它需要固定的链接...但是谁不想要它!在我看来,这是最安全的方法。所有其他解决方案都是不错的选择,但是随着时间的流逝,如果您希望您的代码仍然可以在更高版本的wp上运行,在我看来这是一种安全的方法!

– Antony Gibbs
19年7月30日在6:21

#6 楼

实现起来很复杂,原因很长,原因很长。
长话短说,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 ); }
代码略微适用于StackOverflow。我已将过滤器重命名并使其成为函数,而不是类的公共方法。