Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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

share|improve this question
    
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
add comment

3 Answers

up vote 3 down vote accepted

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...

share|improve this answer
    
Thanks for the help! –  romulodl Sep 7 '11 at 10:05
add comment

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;
share|improve this answer
add comment

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.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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