WP Rest API由带有特殊字符(例如:!&')的子弹发布

时间:2019-06-26 00:33:19

标签: wordpress rest api

我的帖子中有带有特殊字符的。其中之一是以下内容: http://localhost/wp-json/wp/v2/posts?slug=my-post

不幸的是,WP REST API没有显示内容,因为它在其中有(!)。

你们有什么建议的解决方案吗?

1 个答案:

答案 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),您还需要为该类型添加/更改过滤器。

我希望这能帮助像我这样的其他人,即使现在解决您的问题为时已晚。