23

How can I set multiple meta keys order by meta value, can any one give me some example?

2
  • 4
    Welcome to WPSE - for us to help you, you need to help us. Can you describe in more detail what you are trying to do, and perhaps post some code samples. Commented Nov 16, 2016 at 9:44
  • I don't understand why this was closed or requested more info, this is very straightforward clear and with right tags...
    – jave.web
    Commented Jun 10, 2021 at 10:07

1 Answer 1

47

meta_query is an array of meta clauses. For example:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'state',
            'value' => 'Wisconsin',
        ),
        array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
) );

You can use an associative array, with a key for each meta clause:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        'state_clause' => array(
            'key' => 'state',
            'value' => 'Wisconsin',
        ),
        'city_clause' => array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
) );

Then, you can use that keys in the order_by argument, with one:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        'state_clause' => array(
            'key' => 'state',
            'value' => 'Wisconsin',
        ),
        'city_clause' => array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
    'orderby' => 'city_clause', // Results will be ordered by 'city' meta values.
) );

Or more clauses:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        'state_clause' => array(
            'key' => 'state',
            'value' => 'Wisconsin',
        ),
        'city_clause' => array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
    'orderby' => array( 
        'city_clause' => 'ASC',
        'state_clause' => 'DESC',
    ),
) );

Example taken from this post in Make WordPres Core blog.

5
  • do not forget to add the type of the meta key/value. it will affect the results. by default wp will treat your meta as a string. Commented Dec 12, 2018 at 11:54
  • 7
    But what if I don't want to only return results where the state is Wisconsin? I want all states to be returned and and I want rows where there may or may not be a city and still order by those 2 fields. e.g. no WHERE clause at all - just an ORDER BY.
    – Felix Eve
    Commented May 9, 2019 at 9:40
  • Felix, with those requirements a workaround might be to include a final 'catch all' in your meta_query, and put it last in your orderby statement. So the first few clauses in your meta_query would get the specific results you want to order by first. Then your last clause would be everything that is not your previous clauses.
    – Matt Keys
    Commented Oct 2, 2020 at 19:30
  • 2
    EXISTS is a nice way how get the complex named meta query but at the same time not filter by the value :) Btw: I had a real life use case - request was to order events by date DESC but time ASC using 1 single date&time field I used docs & this answer to build this: ideone.com/RUoyZs :-)
    – jave.web
    Commented Jun 10, 2021 at 11:23
  • Wow this is very interesting Commented Mar 5, 2022 at 7:00

Not the answer you're looking for? Browse other questions tagged or ask your own question.