I’m trying to create a loop of explicity ordered posts, for example:
<?php $args = array(
'include' => '1,3,8,4,12' ); ?>
<?php get_posts( $args ); ?>
The results are ordered by date by default, and there is no orderby option to return the posts in the order they were entered. There have been multiple bug/feature requests posted about this in Trac, but so far no luck. I’ve mucked around in the core files a bit but haven’t gotten anywhere with it.
Can anyone suggest a workaround for this behavior?
Cheers,
Dalton
Okay, I was determined to find a way to do this, and I think I’ve got it. I had hoped to find a simpler solution and avoid having to use a new WP_Query object, but it’s just too ingrained into how the loop works. First, we have a couple of utility functions:
These will allow us to set the
menu_order
property based on our own list, and then sort the posts in a query object based on that.Here’s how we query and sort the posts:
So now we have our own query object, and the
$myquery->posts
is sorted according to our custommenu_order_sort
function. The only tricky part now, is that we must construct our loop using our custom query object:Obviously, you’d fix up the loop template code there.
I was hoping to find a solution that didn’t require the use of a custom query object, perhaps by using
query_posts()
and replacing theposts
propery on the global$wp_query
, but I just couldn’t get it to work right. With a little more time to work on it, that might have been doable.Anyhow, see if that will get you where you need to go?
You can try this:
I think this is the fastest way to return the results of a get_posts in a defined order. And besides that, it’s a native solution, without hacks
As of WordPress 3.5, this feature is now in core. You can explicitly order posts using the “post__in” parameter. http://core.trac.wordpress.org/ticket/13729
How about just clearing the
orderby
with a filter? Right before you query your posts, put in:Then, after your loop is done:
The reason for removing the filter again is in case you have other loops on the page (such as from widgets) that will need their normal explicit ordering.