WP_Query orderby post__in bleibt im Loop unwirksam

Ich versuche, ein benutzerdefiniertes Array von Posts für die Homepage abzufragen, wobei ich versuche, die im Array angegebene Reihenfolge beizubehalten. Bis zu einem gewissen Grad funktioniert das gut, WordPress findet die Posts, aber im Loop ist die Reihenfolge wieder durcheinander.

Zuerst pre_get_posts ich den pre_get_posts Hook, um die Hauptabfrage auf der Homepage zu ändern, die in etwa so aussieht:

 if ( is_home() && $query->is_main_query() ) { $query->set( 'post_type', array( 'post', 'page', 'product' ) ); $query->set( 'post__in', array( 103, 14, 127, 115 ) ); $query->set( 'orderby', 'post__in' ); } 

Die Bestellung auf der Homepage ist durcheinander! Es folgt weder dem angegebenen Array noch den Veröffentlichungsdaten (dies ist der Standardwert). Stattdessen sind es 127, 103, 14, 115.

Ich var_dumped die global $wp_query auf der Homepage, nur um zu überprüfen, was passiert ist, und die SQL-Abfrage war in der Tat

 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.ID IN (103,14,127,115) AND wp_posts.post_type IN ('post', 'page', 'product') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') ORDER BY FIELD( wp_posts.ID, 103,14,127,115 ) LIMIT 0, 10 

Also kein Problem da! Genau das sollte passieren. Das Array von Posts in $wp_query->posts jedoch die falsche Reihenfolge.

Möglicherweise stellen Sie fest, dass in der Abfrage ein benutzerdefinierter Posttyp 'product' enthalten ist. Ist das der Schuldige? Irgendeine Idee, wo man schaut?

Solutions Collecting From Web of "WP_Query orderby post__in bleibt im Loop unwirksam"

Stellen Sie orderby auf post__in . Dadurch wird die Post-ID-Reihenfolge beibehalten, die im Array post__in (verfügbar mit Version 3.5) angegeben wurde.

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

Ganz mein Schlechter, ich hatte eine alte function, die an the_posts , die ihre eigene Sortierung vorgenommen hat. Alter Code, den ich vergessen habe zu entfernen. Jetzt läuft es gut.