WP REST API 返回 HTML 而不是 JSON

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,这

  • 是重复的(不是DRY

  • 不是过滤器本身的问题

相反,我们可以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- 如果它们被调用,它们就可以运行。保持简单。

  • 您可以在该位置执行其他操作,例如日志记录或基于角色的访问检查:可扩展性

在应用程序的早期进行更改相对容易,但随着您添加更多过滤器和操作,它会变得更加困难且容易出错。第一次就做对总是更好!