需要能够按元值对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
我尝试按照此处的说明无效https://wordpress.stackexchange.com/questions/251037/wp-rest-api-order-posts-by-meta-value-acf
运行WordPress 4.8并尝试在4.7上进行测试无效
答案 0 :(得分:2)
我已经使用flashcards
过滤器和rest_' . $post_type . '_collection_params
过滤器,就像这样(将$ post_type更改为所需的post type slug):
rest_' . $post_type . '_query
第一个过滤器将您的meta字段添加到// 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
);
参数的可能值中,因为默认情况下REST API仅支持:author,date,id,include,modified,parent,relevance,slug,include_slugs,title (检查the WP REST API handbook中的ordeby
参数)
第二个过滤器使您可以操作将元键放在ordeby
中时返回结果的查询。在这里,我们需要将orderby
重置为'meta_value'或'meta_value_num'(在WP Query class description中了解更多信息),并将meta键设置为您的自定义字段键。
答案 1 :(得分:1)
参考以下方法, 我修改了现有路由以添加新的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;
});