Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WP REST API orderby meta_value

Tags:

rest

wordpress

Need to be able to sort the results of a REST API custom post query by a meta value.

Having difficulty doing so.

I have made my post type available to the REST API and can order by the Date, Title, etc...

But when I try the Post Meta it doesn't work.

I have added the following code to try and enable the functionality but defaults to ordering by date.

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');

My REST API query is

mysite.com/wp-json/wp/v2/hh_equipment?filter[orderby]=meta_value_num&meta_key=equipment_price&order=desc

I have tried following the instructions here to no avail.

Running WordPress 4.8 and tried testing on 4.7 to no avail

like image 624
Daniel McFarland Avatar asked Jan 30 '23 03:01

Daniel McFarland


1 Answers

I've got it working with the rest_' . $post_type . '_collection_params filter and rest_' . $post_type . '_query filter like so (change $post_type to needed 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
);

The first filter adds your meta field to the possible values of the ordeby parameters, as by default REST API supports only: author, date, id, include, modified, parent, relevance, slug, include_slugs, title (check the ordeby param in the WP REST API handbook)

The second filter allows you to manipulate the query that returns the results when you have your meta key inside the orderby. Here we need to reset orderby to 'meta_value' or 'meta_value_num' (read more about this in WP Query class description) and set the meta key to your custom field key.

like image 52
Oksana Romaniv Avatar answered Feb 05 '23 15:02

Oksana Romaniv