WP REST API 按元值排序

问题描述 投票:0回答:2

需要能够按元值对 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 上进行测试,但无济于事

php wordpress rest
2个回答
9
投票

我已经让它与

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 查询类描述中了解更多相关信息)并将元键设置为您的自定义字段键。


3
投票

参考以下方法, 我修改了现有的路由以添加新的 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

© www.soinside.com 2019 - 2024. All rights reserved.