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?
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'
);
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.