Ghi*_*ita 5 wordpress wordpress-rest-api
的端点https://example.com/wp-json/wp/v2/pages/123返回 HTML 和 JSON 格式的组合,例如:
<div class="my-class">HTML Content</div>
{ "id" : 123, ... }
Run Code Online (Sandbox Code Playgroud)
有一个摘录过滤器用于functions.php设置输出的 HTML,在这一行中:
<div class="my-class">HTML Content</div>
{ "id" : 123, ... }
Run Code Online (Sandbox Code Playgroud)
如何防止此类过滤器干扰 JSON 响应?
Jul*_*ate -1
如果您可以修改过滤器,那么您可以检测过滤器函数内的 REST API,如下所示:
function my_custom_filter(){
if (! defined("REST_REQUEST")) {
echo '<div class="my-class">HTML Content</div>';
}
}
add_filter ('the_excerpt', 'my_custom_filter' );
Run Code Online (Sandbox Code Playgroud)
该常量REST_REQUEST仅在 REST API 处理的请求内定义。因此,对于上面的代码,如果请求正在由正常的 WP 请求周期处理,则不会定义常量,因此if我们添加的语句将评估为true,并且echo将像正常情况一样发生。如果定义了常量,则将if评估为 false,并且过滤器不会向响应添加任何输出。
请参阅https://wpseek.com/constant/rest_request/
更新:虽然上面的代码可以工作,但我认为我们可以做得更好。
问题是,如果您有许多过滤器,则每个过滤器都需要重复该if语句,并且您的代码会充斥着对 的检查REST_REQUEST,这
相反,我们可以REST_REQUEST通过使其成为添加过滤器的代码的关注点,在循环的早期引入检查。
这看起来像:
function my_custom_filter(){
echo '<div class="my-class">HTML Content</div>';
}
if (! defined("REST_REQUEST")) {
add_filter ('the_excerpt', 'my_custom_filter' );
//add other HTML filters here
} else {
//attach REST API actions
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个很小的变化(如果你尽早发现它,当过滤器的数量很少时),但它可能会带来一些很大的优势:
它将REST_REQUEST检查全部集中在一处:可维护性
过滤器不需要知道或关心它是否是 a REST_REQUEST- 如果它们被调用,它们就可以运行。保持简单。
您可以在该位置执行其他操作,例如日志记录或基于角色的访问检查:可扩展性
在应用程序的早期进行更改相对容易,但随着您添加更多过滤器和操作,它会变得更加困难且容易出错。第一次就做对总是更好!
| 归档时间: |
|
| 查看次数: |
3177 次 |
| 最近记录: |