我的帖子中有带有特殊字符的。其中之一是以下内容: http://localhost/wp-json/wp/v2/posts?slug=my-post!
不幸的是,WP REST API没有显示内容,因为它在其中有(!)。
你们有什么建议的解决方案吗?
答案 0 :(得分:1)
我已经找到了解决方案(至少对我而言是这样),不确定它是否适合您,但可能会为您指明前进的道路。我们需要利用用于消毒 slug 的函数,正如我在评论中所说,默认情况下是 wp_parse_slug_list。查看代码,实际清理 slug 的函数是 sanitize_title。
查看源代码,wp_parse_slug_list
调用 sanitize_title
时只有一个参数,这意味着使用的上下文是 save
。这意味着,对于未经此功能清理而已保存的帖子,slug 将不匹配,并且该帖子将无法通过 API 访问。解决方案是通过添加过滤器稍微改变消毒功能:
add_filter('rest_post_collection_params', function($query_params) {
$query_params['slug']['sanitize_callback'] = 'sanitize_rest_api_slug';
return $query_params;
}, 20, 1);
function sanitize_rest_api_slug( $list ) {
if ( ! is_array( $list ) ) {
$list = preg_split( '/[\s,]+/', $list );
}
foreach ( $list as $key => $value ) {
$list[ $key ] = sanitize_title( $value, '', 'query' );
}
return array_unique( $list );
}
过滤器实际上是应用于 get_collection_params()
类上的函数 class-wp-rest-posts-controller
,但是如果您查看 source code,过滤器有一个取决于 {{1} },因此如果您定义了另一种特殊类型的帖子(除了 post_type
),您还需要为该类型添加/更改过滤器。
我希望这能帮助像我这样的其他人,即使现在解决您的问题为时已晚。