2010-12-01 25 views
0

En ce moment, je fais:WordPress obtenir des postes spécifiques dans un ordre arbitraire

$posts = get_posts(array('post_type' => 'page', 'post__in' => array(1, 3, 2, 9, 7))); 

et je avoir deux questions:

  1. Post 3 est de 'post_type' => 'post', de sorte qu'il ne soit pas sélectionné , mais je le veux! Si j'omets 'post_type' => 'page', alors seul le post 3 est sélectionné (car il doit supposer 'post_type' => 'post'.).
  2. Je veux être en mesure de order the posts arbitrarily by their ids. Si je savais comment utiliser MySQL, je pouvais faire:

    SELECT * FROM wp_posts WHERE ID IN (1, 3, 2, 9, 7) 
    ORDER BY FIND_IN_SET(ID, '1,3,2,9,7'); 
    

Mais, comment dois-je faire avec WordPress?

Répondre

0
  1. Kawauso sur le canal IRC#wordpress m'a informé que "post_type prend un tableau de valeurs." De là, je trouve que ce qui suit sélectionne également après 3:

  2. Alors, je l'ai fait ce qui suit:

    $post_ids = array(1 => 0, 3 => 1, 2 => 2, 9 => 3, 7 => 4); 
    $posts = get_posts(array('post_type' => array('post', 'page'), 
             'post__in' => array_keys($post_ids))); 
    $ordered_posts = array(0,0,0,0,0); // size of five; keeps order 
    foreach ($posts as $p) { 
        setup_postdata($p); 
        $ordered_posts[$post_ids[$p->ID]] = array(
        'permalink' => get_permalink($p->ID), 
        'title' => $p->post_title, 
        'excerpt' => get_the_excerpt(), 
        'date' => date('F j, Y', strtotime($p->post_date))); 
    } 
    
1

d'abord chercher tous les messages arbitrairement par leurs cartes d'identité et ensuite en boucle à travers tous les postes

Vous pouvez le faire de cette façon: -

$posts=$wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE ID IN (1, 3, 2, 9, 7) 
ORDER BY FIND_IN_SET(ID, '1,3,2,9,7')"); 
$count=count($posts); 
for ($counter=0 ; $counter < $count; $counter++) 
{ 
    $post=get_post($posts[$counter]->ID, $output); 
    //do your stuffs with posts 
} 

Hope this helps

+0

Cela fonctionnerait, mais je pense que vous faites des requêtes SQL excessives. AFAIK, 'get_post' fait une requête SQL. Donc, vous pouvez simplement remplacer la première ligne par '$ order => array (1, 3, 2, 9, 7)'. Mais alors vous seriez encore en train de faire cinq requêtes SQL, une pour chaque poste, Aussi, 'foreach' est plus rapide et plus propre dans ce cas et la plupart du temps. Voir cette [réponse] (http://stackoverflow.com/questions/4329800/wordpress-get-specific-posts-in-arbitrary-order/4337226#4337226). – ma11hew28

0

Selon this thread, vous pouvez utiliser ce code, puis utilisez WordPress classique loop:

$args = array( 
'post_type'=>'page', 
    'orderby'=>'menu_order', 
    'order'=>'ASC' 
); 
query_posts($args); 
+0

C'est bon à savoir, mais dans ce cas, ce ne sont pas toutes des pages, et je pense qu'elles sont dans un ordre différent de celui du menu. – ma11hew28