1

I have another database which stores post's IDs and I want do display them using WP_query to use the WP default pagination. I'm using orderby => none to preserve the original order, but the result reorders them by IDs.

$ids = array (60, 23, 78, 46, 105, 130)

$args = array (
    'posts_per_page' => -1,
    'post__in' => $ids,
    'orderby' => 'none'
);

$query = new WP_Query ( $args );

while ( have_posts() ) : the_post();
    echo '<li>';
    the_title();
    echo '</li>';
endwhile;

Could anyone help me?

Thanks, Romulo De Lazzari

  • Please add solutions you came up with as separate answers, not edits to existing ones. It is completely appropriate and recommended, even when answering your own question. – Rarst Sep 7 '11 at 11:33
3

You can order them manually after the query is complete:

$ids = array (60, 23, 78, 46, 105, 130)

$args = array (
    'posts_per_page' => -1,
    'post__in' => $ids,
    'orderby' => 'none'
);

$query = new WP_Query ( $args );

$ordered_posts = array();
foreach($ids as $rpid)
 foreach($query->posts as $index => $fpid)
   if($fpid->ID === $rpid) $ordered_posts[] = $query->posts[$index];

$query->posts = $ordered_posts;

while ($query->have_posts() ) : $query->the_post();
    echo '<li>';
    the_title();
    echo '</li>';
endwhile;

And like Mamaduka posted, if it's a custom loop use the $query methods instead of the global functions...

1

Try following snippet:

$ids = array (60, 23, 78, 46, 105, 130)

$args = array (
    'posts_per_page' => -1,
    'post__in' => $ids,
    'orderby' => 'none'
);

$query = new WP_Query ( $args );

while ( $query->have_posts() ) : $query->the_post();
    echo '<li>';
    the_title();
    echo '</li>';
endwhile;
1

orderby none simply uses the order MySQL returns without explicitly ordering by a field, which is typically going to be in order of ID, since that's how MySQL uniquely identifies each post and how it is able to most efficiently retrieve them from the database.

If you want your custom order, you'll have to loop through your array of IDs and match them against the returned posts.

0

A better way to use post__in for an order which is you have entered same order list managed in a post.

More info

$ids = array (60, 23, 78, 46, 105, 130)

$args = array (
    'posts_per_page' => -1,
    'post__in' => $ids,
    'orderby' => 'post__in', 
    'order' => 'ASC', 
);

$query = new WP_Query ( $args );

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.