WP REST API返回HTML而不是JSON

时间:2018-10-05 23:40:23

标签: wordpress wordpress-rest-api

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响应?

2 个答案:

答案 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的检查所困扰,

  • 是重复的(不是DRY

  • 不是过滤器本身的concern

  • 浑浊

相反,我们可以在循环的早期引入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');