WordPress Orderby Query Parameters
I recently upgraded a large publisher site from an old 3.6.1 install to a 4.x version which allowed me to utilise the powerful orderby parameters in WordPress 4+.
Using the following code as an example it is a fairly trivial task to orderby both date and a custom field value named 'article_weight':
$args = array(
'post_type' => 'post',
'orderby' => array( 'article_weight' => 'ASC', 'date' => 'DESC' ),
'meta_type' => 'NUMERIC',
'meta_key' => 'article_weight',
);
$query = new WP_Query( $args );
The above code allows for posts to be ordered by article_weight first and date second. This allows for posts of varying 'stickiness' to be displayed within post listings such as category or tag archive pages.
If you want to apply a default query to all queries that don't feature a custom 'order' query parameter then try this:
//custom query data
function weight_meta_query( $query )
{
//ignore feeds
if($query->query['feed']){
return;
}
//ignore attachments
if($query->query['attachment']){
return;
}
//ignore admin
if ( !is_admin() ) {
//if custom ordering has been set anywhere in a query then return the original query
if(isset($query->query['order'])){
$order = $query->query['order'];
return $query;
}
//don't set query on pages, date archives or search pages.
if ( !is_page() && !is_date() && !is_search()) {
$query->set('meta_key', 'article_weight');
$query->set('meta_type', 'NUMERIC');
$query->set('orderby', array( 'meta_value' => 'ASC' ));
}
}
}
add_action( 'pre_get_posts', 'weight_meta_query' );
Using the above code will mean that you don't have to write custom queries for all loops in your site which is a real time saver!