The code below is suppose to display all posts with "featured_listing" meta key above all of the standard posts. When the below code is in the functions.php, it hides all posts without "featured_listing" meta. I can't work out why its not working. Help would be appreciated. function custom_special_sort( $query ) { if ( is_admin() || ! $query->is_main_query() ) { return; } // if is this the main query and is this post type of business if ( (is_post_type_archive('business') ) || (is_tax ('location') ) ) { // order results by the meta_key 'featured_listing' $query->set( 'meta_key', 'featured_listing' ); $query->set( 'orderby', 'featured_listing' ); $query->set( 'order', 'DESC' ); } } add_action( 'pre_get_posts', 'custom_special_sort' ); I suspect this could be similar to this mentioned on stackoverflow but I'm really not sure : > the query is doing an inner join on the posts and postmeta tables, which is > why posts that > don't have that particular post meta entry aren't being returned by > the query. What you want is a left join https://stackoverflow.com/questions/30361635/wp-archives-order-by-custom-meta-key