Wie man Ergebnisse einer get_posts () in einer explizit definierten Reihenfolge zurückgibt

Ich versuche eine Schleife von explizit geordneten Posts zu erstellen, zum Beispiel:

 '1,3,8,4,12' ); ?>  

Die Ergebnisse werden standardmäßig nach Datum sortiert, und es gibt keine Option orderby, um die Posts in der Reihenfolge zurückzugeben, in der sie eingegeben wurden. Es gab mehrere Bug / Feature-Anfragen in Trac, aber bisher kein Glück. Ich habe ein wenig in den coredateien herumgespuckt, bin aber damit nicht weitergekommen.

Kann jemand eine Abhilfe für dieses Verhalten vorschlagen?

Prost, Dalton

Solutions Collecting From Web of "Wie man Ergebnisse einer get_posts () in einer explizit definierten Reihenfolge zurückgibt"

Okay, ich war entschlossen, einen Weg zu finden, und ich denke, ich habe es geschafft. Ich hatte gehofft, eine einfachere Lösung zu finden und zu vermeiden, ein neues WP_Query-Objekt zu verwenden, aber es ist einfach zu tief in die functionsweise der Schleife eingearbeitet. Zuerst haben wir ein paar nützliche functionen:

 // 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; } 

menu_order können wir die menu_order Eigenschaft basierend auf unserer eigenen Liste menu_order und dann die Posts in einem darauf basierenden Abfrageobjekt sortieren.

So können wir die Beiträge abfragen und sortieren:

 $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'); 

Nun haben wir unser eigenes Abfrageobjekt und die $myquery->posts werden nach unserer benutzerdefinierten menu_order_sort function sortiert. Der einzige schwierige Teil besteht nun darin, dass wir unsere Schleife mit unserem benutzerdefinierten Abfrageobjekt konstruieren müssen:

 while($myquery->have_posts()) : $myquery->the_post(); ?> 
< ?php the_title(); ?> Post ID: < ?php the_ID(); ?>
< ?php endwhile; wp_reset_postdata();

Offensichtlich würden Sie dort den Schleifenvorlagencode reparieren.

Ich hoffte, eine Lösung zu finden, die die Verwendung eines benutzerdefinierten Abfrageobjekts nicht erforderte, vielleicht durch Verwendung von query_posts() und Ersetzen der Postings propery in der globalen $wp_query , aber ich konnte es einfach nicht richtig arbeiten lassen. Mit etwas mehr Zeit, um daran zu arbeiten, könnte das machbar gewesen sein.

Wie auch immer, ob das dich dahin bringt, wohin du gehen musst?

Sie können dies versuchen:

 add_filter('posts_orderby', 'enforce_specific_order'); $posts = get_posts($args); remove_filter( current_filter(), __FUNCTION__ ); function enforce_specific_order($orderby) { global $wpdb; return "FIND_IN_SET(".$wpdb->posts.".ID, '1,3,8,4,12') ASC"; } 

Ich denke, das ist der schnellste Weg, um die Ergebnisse eines get_posts in einer definierten Reihenfolge zurückzugeben. Und außerdem ist es eine native Lösung ohne Hacks

 < ?php $posts_order = array('1,3,8,4,12'); $args = array( 'post__in' => $posts_order, 'orderby' => 'post__in' ); get_posts( $args ); ?> 

Seit WordPress 3.5 ist diese function jetzt im core. Sie können Posts explizit mit dem Parameter “post__in” bestellen. http://core.trac.wordpress.org/ticket/13729

Wie wäre es, die orderby mit einem Filter zu orderby ? Bevor Sie Ihre Posts abfragen, geben Sie Folgendes ein:

 add_filter('posts_orderby', '__return_false'); 

Dann, nachdem Ihre Schleife fertig ist:

 remove_filter('posts_orderby', '__return_false'); 

Der Grund für das erneute Entfernen des Filters besteht darin, dass Sie andere Schleifen auf der Seite haben (z. B. von Widgets), die ihre normale explizite Reihenfolge benötigen.