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:
// Set post menu order based on our list
function set_include_order(&$query, $list) {
// Map post ID to its order in the list:
$map = array_flip($list);
// Set menu_order according to the list
foreach ($query->posts as &$post) {
if (isset($map[$post->ID])) {
$post->menu_order = $map[$post->ID];
}
}
}
// Sort posts by $post->menu_order.
function menu_order_sort($a, $b) {
if ($a->menu_order == $b->menu_order) {
return 0;
}
return ($a->menu_order < $b->menu_order) ? -1 : 1;
}
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:
$plist = array(21, 43, 8, 44, 12);
$args = array(
'post_type' => 'attachment',
'post_status' => 'any',
'post__in' => $plist
);
// Create a new query
$myquery = new WP_Query($args);
// set the menu_order
set_include_order($myquery, $plist);
// and actually sort the posts in our query
usort($myquery->posts, 'menu_order_sort');
So now we have our own query object, and the $myquery->posts
is sorted according to our custom menu_order_sort
function. The only tricky part now, is that we must construct our loop using our custom query object:
while($myquery->have_posts()) : $myquery->the_post();
?>
<div><a id="post_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>"><?php the_title(); ?></a> Post ID: <?php the_ID(); ?>
</div>
<?php
endwhile;
wp_reset_postdata();
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 the posts
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?
'orderby' => 'menu_order', 'order' => 'ASC'
'orderby' => 'menu_order, 'order' => 'ASC'
&order_by=date ID
for ex.