web-dev-qa-db-ger.com

WP_Query orderby post__in bleibt in der Schleife unwirksam

Ich versuche, ein benutzerdefiniertes Array von Posts für die Homepage abzufragen und dabei die in dem Array angegebene Reihenfolge beizubehalten. Bis zu einem gewissen Grad funktioniert dies gut, WordPress findet die Beiträge, aber in der Schleife ist die Reihenfolge wieder durcheinander.

Zunächst verwende ich den Hook pre_get_posts, um die Hauptabfrage auf der Startseite zu ändern, die ungefähr 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 alles durcheinander! Es folgt weder dem angegebenen Array noch den Veröffentlichungsdaten (dies ist die Standardeinstellung). Stattdessen ist es 127, 103, 14, 115.

Ich habe den global $wp_query auf der Homepage var_dumped, nur um zu überprüfen, was passiert ist, und die SQL, die er abgefragt hat, 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 der Beiträge in $wp_query->posts weist jedoch die falsche Reihenfolge auf.

Möglicherweise stellen Sie fest, dass die Abfrage einen benutzerdefinierten Beitragstyp 'product' enthält. Ist das der Täter? Irgendeine Idee, wo sie suchen sollen?

4
Max

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

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

Ganz und gar mein Problem, ich hatte eine alte Funktion, die mit the_posts verknüpft war und eine eigene Sortierung durchführte. Alter Code, den ich vergessen habe, zu entfernen. Jetzt läuft es prima.

0
Max