WP REST API命令由meta_value提供

时间:2017-06-27 15:14:00

标签: wordpress rest

需要能够按元值对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上进行测试无效

2 个答案:

答案 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;
    });

参考:https://github.com/WP-API/WP-API/issues/2308