I have created a custom post type that I want to order by
custom-field-1
, which is boolean so its value is either1
or0
, inDESC
order (1 to 0)custom-field-2
, which contains text and is supposed to be orderedASC
(A to Z)
First Question:
A more powerful ORDERBY-parameter was introduced in WordPress 4.0. Can this be made using the new ORDERBY functionality?
If not, second Question:
What’s the best approach? How would I make a meta_query
order the posts by custom-field-1
in descending order and then by custom-field-2
in ascending order?
Edit:
Or would it be an option to use two instances of WP_Query
, one for the posts with custom-field-1 value="1
” and one for those with value 0
?
I know this “order by multiple custom field values” has been discussed a lot here, but I did not find a similar question I could adapt when I was searching the site before.
1 Answer
Although the new orderby
parameter is great in WP_Query
, it does not support multiple orderby
for multiple meta_key
‘s.
I’ve went through a couple of scenarios and even went and digged into trac and make and came up with the following
-
make.wordpress.org A more powerful orderby in wordpress 4.0
-
trac ticket #17065
None of the issues regarding this very problem have been answered. It also seems from those two links that there is an issue ordering by a meta_key
and another field like post date for instance. I haven’t tried this as yet.
I truelly think that you have two choices here without creating two queries.
-
hack using the
posts_orderby
filter as described by @s_ha_dum in his answer here -
By making use of PHP ordering using
usort
. The idea here would be to sort your query by onemeta_key
and then take the returned posts array ($posts) and sort them by the secondmeta_key
before the loop starts. You can either use thethe_posts
filter (just remember to remove the filter once done) or simply unset$posts
in your template and set it with the reordered array of posts once done