I want to retrieve all custom posts with a specific custom taxonomy term, and order them by a particular custom meta field. However, I also need to cater for when the
orderby field is empty, and in that case,
orderby date. If I orderby
meta_value and include the appropriate
meta_key, then if that particular category doesn't have the meta, no posts are returned at all.
USE CASE: I have a rental property
custom post, and some "featured categories" (
taxonomy), such as "child friendly". And there is a toggle (
custom meta) to mark the post as sticky or not.
I want to retrieve (for example), all rental properties that are marked as child friendly, and order by
sticky=on. However, if none of the properties are marked as sticky, then I want to orderby
I think the root of the problem is that, by default, if the sticky toggle is not marked as "on", then there is no meta stored in the database. There is no entry for
sticky=off, the custom meta is just not there.
So, should I tweak the custom post code such that there is always a value for sticky (ie, 0/1, or on/off), or is there a way (maybe
pre_get_posts?) to check the query and use a different orderby... Or perhaps there is some clever
meta_query I could use?
I'm thinking the first option would be most efficient?
My current query looks like this:
$args = array( 'numberposts' => -1, 'tax_query' => array( array( 'taxonomy' => 'property-feature', 'field' => 'slug', 'terms' => 'child-friendly' ) ), 'meta_key' => 'sticky_post', 'orderby' => 'meta_value date', 'order' => 'ASC', 'post_type' => 'listing', 'post_status' => 'publish', 'fields' => 'ids', ); $posts = get_posts( $args );
However, this only retrieves posts if there are listings marked as sticky. What if there are none that are sticky? I still want to get those. I don't think running 2 queries (ie, if the first query is empty, then do the second query) is the best way to do this...