https://example.com/wp-json/wp/v2/pages/123
的端点返回HTML和JSON格式的组合,例如:
<div class="my-class">HTML Content</div>
{ "id" : 123, ... }
functions.php
中有一个摘录过滤器,用于设置输出的HTML,在此行中:
function my_custom_filter(){
echo '<div class="my-class">HTML Content</div>';
}
add_filter ('the_excerpt', 'my_custom_filter' );
如何防止此类过滤器干扰JSON响应?
答案 0 :(得分: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' );
常量REST_REQUEST
仅在由REST API处理的请求中定义。因此,使用上面的代码,如果请求是由正常的WP请求周期处理的,则不会定义该常量,因此我们添加的if
语句的求值为true
,而{{1 }}会像平常一样发生。如果定义了常量 ,则echo
的计算结果为false,过滤器不会在响应中添加任何输出。
请参见https://wpseek.com/constant/rest_request/
更新:虽然上面的代码可以工作,但我认为我们可以做得更好。
问题是,如果您有很多过滤器,则每个过滤器都需要重复if
语句,并且您的代码会被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
}
的所有检查都保留在一个位置:maintainability
过滤器不需要知道或关心它是否为REST_REQUEST
-如果被调用,则可以使用。保持简单。
您还可以在该位置执行其他操作,例如日志记录或基于角色的访问检查:extensibility
这是在应用程序中尽早进行的相对容易的更改,但是随着添加更多的过滤器和操作,变得更加困难且容易出错。总是最好在第一时间做到正确!
答案 1 :(得分:0)
这里的真正问题是在过滤器中echo
处理内容,并假设将其输出到echo
所在的相同位置。一个人只能修改过滤的内容。要更正该代码,请执行以下操作:
function my_custom_filter($excerpt) {
return '<div class="my-class">HTML Content</div>' . "\n$excerpt";
}
add_filter ('the_excerpt', 'my_custom_filter');
在这种情况下,OP可能仍然需要条件:
function my_custom_filter($excerpt) {
return !defined('REST_REQUEST') || !REST_REQUEST ?
'<div class="my-class">HTML Content</div>' . "\n$excerpt" :
$excerpt;
}
add_filter ('the_excerpt', 'my_custom_filter');