WordPress REST API 根据自定义字段排序

2023-01-13

我们知道,如果想让 WordPress 的文章列表按照一个自定义字段排序,在创建自定义查询的时候传入对应的排序参数即可。在 WP REST API 中,让文章列表按自定义字段进行排序却没有这么简单。

WP REST API 文章查询接受一个 orderby 参数,用来对文章进行排序,默认情况下,改参数的值可以是:author, date, id, include, modified, parent, relevance, slug, include_slugs, title,如果传入了这些值以外的参数,WP REST API 将会返回一个错误信息:

{
"code": "rest_invalid_param",
"message": "Invalid parameter(s): orderby",
"data": {
"status": 400,
"params": {
"orderby": "orderby is not one of author, date, id, include, modified, parent, relevance, slug, include_slugs, title."
}
}
}
{ "code": "rest_invalid_param", "message": "Invalid parameter(s): orderby", "data": { "status": 400, "params": { "orderby": "orderby is not one of author, date, id, include, modified, parent, relevance, slug, include_slugs, title." } } }
{
  "code": "rest_invalid_param",
  "message": "Invalid parameter(s): orderby",
  "data": {
    "status": 400,
    "params": {
      "orderby": "orderby is not one of author, date, id, include, modified, parent, relevance, slug, include_slugs, title."
    }
  }
}

幸运的是,我们可以使用一个 Filter 来为 orderby 参数增加允许使用的字段,这个 Filter 为:rest_ {post_type} _collection_params

为文章和自定义文章类型启用 menu_order 排序方式

// 此代码为文章启用orderby=menu_order排序方法
add_filter( 'rest_post_collection_params', 'filter_add_rest_orderby_params', 10, 1 );
// 此代码为 'doctor' 文章类型启用orderby=menu_order排序方法
add_filter( 'rest_doctor_collection_params', 'filter_add_rest_orderby_params', 10, 1 );
// 添加menu_order排序方法到 rest api 中
function filter_add_rest_orderby_params( $params ) {
$params['orderby']['enum'][] = 'menu_order';
return $params;
}
// 此代码为文章启用orderby=menu_order排序方法 add_filter( 'rest_post_collection_params', 'filter_add_rest_orderby_params', 10, 1 ); // 此代码为 'doctor' 文章类型启用orderby=menu_order排序方法 add_filter( 'rest_doctor_collection_params', 'filter_add_rest_orderby_params', 10, 1 ); // 添加menu_order排序方法到 rest api 中 function filter_add_rest_orderby_params( $params ) { $params['orderby']['enum'][] = 'menu_order'; return $params; }
// 此代码为文章启用orderby=menu_order排序方法
add_filter( 'rest_post_collection_params', 'filter_add_rest_orderby_params', 10, 1 );

// 此代码为 'doctor' 文章类型启用orderby=menu_order排序方法
add_filter( 'rest_doctor_collection_params', 'filter_add_rest_orderby_params', 10, 1 );

// 添加menu_order排序方法到 rest api 中
function filter_add_rest_orderby_params( $params ) {
    $params['orderby']['enum'][] = 'menu_order';
    return $params;
}

把上面的代码添加到主题或插件中之后,再使用我们添加的自定义参数来获取文章,WP REST API 就会根据我们的要求,返回符合我们预期的文章。

为文章添加按自定义字段排序方式

如果我们需要让文章按自定义字段方式进行排序,方法是类似的。下面的代码为 WP REST API 添加了 views、area、random 排序方式。

add_filter('rest_post_collection_params', function($params)
{
$params[ 'orderby' ][ 'enum' ][] = 'views';
$params[ 'orderby' ][ 'enum' ][] = 'area';
$params[ 'orderby' ][ 'enum' ][] = 'random';
return $params;
}, 10, 1);
add_filter('rest_post_collection_params', function($params) { $params[ 'orderby' ][ 'enum' ][] = 'views'; $params[ 'orderby' ][ 'enum' ][] = 'area'; $params[ 'orderby' ][ 'enum' ][] = 'random'; return $params; }, 10, 1);
add_filter('rest_post_collection_params', function($params)
{
    $params[ 'orderby' ][ 'enum' ][] = 'views';
    $params[ 'orderby' ][ 'enum' ][] = 'area';
    $params[ 'orderby' ][ 'enum' ][] = 'random';

    return $params;
}, 10, 1);

只添加了排序方法还没用,我们还需要把按这些自定义参数排序的逻辑添加到 REST API 查询中,代码如下,从代码中可以看出,修改 REST API 查询的方法和自定义WP_Query的方法类似。

add_filter('rest_post_query', function ($query_vars, $request)
{
$orderby = $request->get_param('orderby');
if (isset($orderby) && $orderby === 'views') {
$query_vars[ "orderby" ] = "meta_value_num";
$query_vars[ "meta_key" ] = "wl_pageviews";
}
if (isset($orderby) && $orderby === 'area') {
$query_vars[ "orderby" ] = "meta_value_num";
$query_vars[ "meta_key" ] = "area";
}
if (isset($orderby) && $orderby === 'random') {
$query_vars[ "orderby" ] = "random";
}
return $query_vars;
}, 10, 2);
add_filter('rest_post_query', function ($query_vars, $request) { $orderby = $request->get_param('orderby'); if (isset($orderby) && $orderby === 'views') { $query_vars[ "orderby" ] = "meta_value_num"; $query_vars[ "meta_key" ] = "wl_pageviews"; } if (isset($orderby) && $orderby === 'area') { $query_vars[ "orderby" ] = "meta_value_num"; $query_vars[ "meta_key" ] = "area"; } if (isset($orderby) && $orderby === 'random') { $query_vars[ "orderby" ] = "random"; } return $query_vars; }, 10, 2);
add_filter('rest_post_query', function ($query_vars, $request)
{
    $orderby = $request->get_param('orderby');

    if (isset($orderby) && $orderby === 'views') {
        $query_vars[ "orderby" ]  = "meta_value_num";
        $query_vars[ "meta_key" ] = "wl_pageviews";
    }

    if (isset($orderby) && $orderby === 'area') {
        $query_vars[ "orderby" ]  = "meta_value_num";
        $query_vars[ "meta_key" ] = "area";
    }

    if (isset($orderby) && $orderby === 'random') {
        $query_vars[ "orderby" ] = "random";
    }

    return $query_vars;
}, 10, 2);

排序是程序开发中必不可少的逻辑之一,WorPress REST API 默认为我们提供了几个基础的排序方式,很多情况下都不够用,好在我们可以通过本文中的方法添加自己需要的逻辑进行排序,来帮助用户更方便的查找过滤数据。

相关内容
最新

坚持的力量

wordpress建站,视频剪辑拍摄,动画制作