ORDER BY custom field value

Based on example here https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/

I’d like to modify the query

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

to be able to get all posts where state is ‘Wisconsin’ OR timezone is ‘central’ ORDER BY population DESC

Solutions Collecting From Web of "ORDER BY custom field value"

You can create groups of meta_queries using specific compare operation on them, and since you want to order based in a single custom field, you can keep the order declaration dedicated to the single meta field. So:

$q = new WP_Query( 
    array(
        'meta_key' => 'population', //setting the meta_key which will be used to order
        'orderby' => 'meta_value', //if the meta_key (population) is numeric use meta_value_num instead
        'order' => 'DESC', //setting order direction
        'meta_query' => array(
            'relation' => 'AND', //setting relation between queries group
            array(
                'relation' => 'OR', //setting relation between this inside query
                array(
                    'key' => 'state',
                    'value' => 'Wisconsin',
                ),
                array(
                    'key' => 'timezone',
                    'value' => 'central',
                )
            ),
            array(
                'key' => 'city',
                'compare' => 'EXISTS',
            )
        )
    )           
);

This would be done like this:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'relation' => 'OR',
            'state_clause' => array(
                'key' => 'state',
                'value' => array( 'Wisconsin' ), //allowed values
                'compare' => 'IN' // state must be in array above
            ),
            'state_clause' => array(
                'key' => 'timezone',
                'value' => 'central',
                'compare' => '='
            ),
        ),
        'city_clause' => array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
    'orderby' => array(
        'city_clause' => 'DESC',
    ),
) );