使用 REST API 以自定义数据为条件做过滤

meta data with rest api

在之前的文章中介绍了通过 WordPress REST API 获取数据的方法,但都是采用系统标准的数据获取、过滤和排序方法。其实 WordPress REST API 提供了灵活的扩展机制,可以对系统原有的功能进行定制和客户化。本篇文章就介绍如何以用户自定义的元数据(Meat Data)为条件进行查询和过滤。

具体的元数据的例子还是用文章点击计数来说明,如果还没有建立这个元数据,请参考这篇文章介绍的方法。

首先需要对用户自定义元数据的键进行设置,使 REST API 可以接受元数据的键作为查询的排序参数,也就是在 URI 中可以这样写:

https://site-name/wp-js0n/wp/v2/posts?orderby=my_meta_key&order=desc

WordPress REST API 提供了钩链允许增加新的查询排序参数,rest post controller 会用新增加的排序参数生成数据库查询参数,代码如下:

function add_orderby_meta_query_param_with_rest_api($query_params) {
	//post_views_count 就是文章计数用的键
	$query_params['orderby']['enum'][] = 'post_views_count';
	return $query_params;
}
add_filter('rest_' . 'post' . '_collection_params', 'add_orderby_meta_query_param_with_rest_api', 10, 1);

然后再配置元数据的数据库的排序参数,使得 WP_Query 在获取文章的时候对相关联的用户自定义的元数据做排序,这也是通过 REST API 的钩链完成的,代码如下:

function add_orderby_meta_field_query_with_rest_api( $args, $request ){
	$order_by = $request->get_param( 'orderby' );
	if ( isset( $order_by ) && 'post_views_count' === $order_by ) {
		$args['meta_key'] = $order_by;
		$args['orderby'] = 'meta_value_num'; // 用户元数据类型是整型使用'meta_value_num', 字符使用'meta_value'
	}
	return $args;
}
add_filter('rest_' . 'post' . '_query', 'add_orderby_meta_field_query_with_rest_api', 10, 2);

最后就可以使用文章计数用元数据 post_views_count 来排序文章了,代码如下:

(function( $ ) {
     $(document).ready(function () {
         var postsCollection = new wp.api.collections.Posts();
         //获取文章列表,按文章计数的降序来排序
         postsCollection.fetch( { data: { orderby: 'post_views_count', order: 'desc', per_page: 5 } } ).then(function(result){
             //显示文章列表
             $('#Rest_Api_Posts').append('<ul></ul>');
             for (var i = 0; i < result.length; i++) {
                   if (result[i]) { 
                       $('#Rest_Api_Posts > ul').append('<li><a href="' + result[i].link + '">' + result[i].title.rendered + '</a></li>');
                   }
             }
         });
     });
 })( jQuery );

使用 MVC 模式的代码请参考这篇文章的内容。

发表评论

邮箱地址不会被公开。 必填项已用*标注