需要能够按元值对 REST API 自定义后查询的结果进行排序。
这样做有困难。
我已将我的帖子类型提供给 REST API,并且可以按日期、标题等进行排序...
但是当我尝试 Post Meta 时它不起作用。
我添加了以下代码来尝试启用该功能,但默认为按日期排序。
function my_add_meta_vars ($current_vars) {
$current_vars = array_merge ($current_vars, array('meta_key', 'meta_value'));
return $current_vars;
}
add_filter ('query_vars', 'my_add_meta_vars');
add_filter ('rest_query_vars', 'my_add_meta_vars');
我的 REST API 查询是
mysite.com/wp-json/wp/v2/hh_equipment?filter[orderby]=meta_value_num&meta_key=equipment_price&order=desc
我已尝试按照此处的说明进行操作,但没有成功。
运行 WordPress 4.8 并尝试在 4.7 上进行测试,但无济于事
我已经让它与
rest_' . $post_type . '_collection_params
过滤器和 rest_' . $post_type . '_query
过滤器一起使用(将 $post_type 更改为所需的帖子类型 slug):
// Add meta your meta field to the allowed values of the REST API orderby parameter
add_filter(
'rest_' . $post_type . '_collection_params',
function( $params ) {
$params['orderby']['enum'][] = 'YOUR_META_KEY';
return $params;
},
10,
1
);
// Manipulate query
add_filter(
'rest_' . $post_type . '_query',
function ( $args, $request ) {
$order_by = $request->get_param( 'orderby' );
if ( isset( $order_by ) && 'YOUR_META_KEY' === $order_by ) {
$args['meta_key'] = $order_by;
$args['orderby'] = 'meta_value'; // user 'meta_value_num' for numerical fields
}
return $args;
},
10,
2
);
第一个过滤器将您的元字段添加到
ordeby
参数的可能值,因为默认情况下 REST API 仅支持:作者、日期、id、包含、修改、父级、相关性、slug、include_slugs、标题(检查 ordeby
WP REST API 手册中的参数)
第二个过滤器允许您在
orderby
中包含元键时操作返回结果的查询。这里我们需要将 orderby
重置为“meta_value”或“meta_value_num”(在WP 查询类描述中了解更多相关信息)并将元键设置为您的自定义字段键。
参考以下方法, 我修改了现有的路由以添加新的 args 条目,该条目验证允许的
meta_key
值。也不需要以这种方式修改其余查询变量。
add_filter('rest_endpoints', function ($routes) {
// I'm modifying multiple types here, you won't need the loop if you're just doing posts
foreach (['some', 'types'] as $type) {
if (!($route =& $routes['/wp/v2/' . $type])) {
continue;
}
// Allow ordering by my meta value
$route[0]['args']['orderby']['enum'][] = 'meta_value_num';
// Allow only the meta keys that I want
$route[0]['args']['meta_key'] = array(
'description' => 'The meta key to query.',
'type' => 'string',
'enum' => ['my_meta_key', 'another key'],
'validate_callback' => 'rest_validate_request_arg',
);
}
return $routes;
});