web-dev-qa-db-fra.com

WP_Query orderby post__in reste inefficace dans la boucle

J'essaie d'interroger un tableau personnalisé de publications pour la page d'accueil, en essayant de maintenir l'ordre indiqué dans le tableau. Dans une certaine mesure, cela fonctionne bien, WordPress trouve les publications, mais dans la boucle, l'ordre est à nouveau mélangé.

Tout d’abord, j’utilise le hook pre_get_posts pour modifier la requête principale sur la page d’accueil, qui ressemble à ceci:

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

L'ordre sur la page d'accueil est tout mélangé! Cela ne suit ni le tableau spécifié, ni les dates de publication (qui est la valeur par défaut). Au lieu de cela, il s’agit des 127, 103, 14, 115.

Je var_dumped le global $wp_query sur la page d'accueil, juste pour vérifier ce qui s'est passé, et le SQL qu'il a demandé était en effet

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

Donc pas de problème là-bas! C’est exactement ce qui devrait arriver. Le tableau de messages dans $wp_query->posts a cependant un ordre incorrect.

Vous remarquerez peut-être qu’un type de publication personnalisé 'product' est inclus dans la requête. Est-ce le coupable? Une idée où regarder?

4
Max

Définissez orderby sur post__in. Cela préserve l'ordre de post-ID donné dans le tableau post__in (disponible avec la version 3.5).

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

Totalement mon mauvais, j'avais une vieille fonction accrochée à the_posts qui faisait son propre tri. Ancien code que j'ai oublié de supprimer. Maintenant, ça fonctionne très bien.

0
Max