WP_Query orderby post__in permanece inefectivo en el Loop

1 ago 2013, 12:23:09
Vistas: 30.3K
Votos: 11

Estoy intentando consultar un array personalizado de posts para la página de inicio, tratando de mantener el orden dado en el array. Hasta cierto punto funciona bien, WordPress encuentra los posts, pero en el Loop el orden está todo mezclado de nuevo.

En primer lugar, estoy usando el hook pre_get_posts para cambiar la consulta principal en la página de inicio, que se ve algo así:

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

¡El orden en la página de inicio está todo mezclado! No sigue ni el array especificado, ni las fechas de publicación (que es el valor predeterminado). En su lugar, es 127, 103, 14, 115.

Hice un var_dump del global $wp_query en la página de inicio, solo para verificar qué sucedió, y el SQL que consultó fue efectivamente

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

¡Así que no hay problema ahí! Eso es exactamente lo que debería suceder. Sin embargo, el array de posts en $wp_query->posts tiene el orden incorrecto.

Podrás notar que hay un tipo de post personalizado 'product' incluido en la consulta. ¿Es ese el culpable? ¿Alguna idea de dónde buscar?

4
Comentarios

No creo que post__in sea un parámetro aceptado para orderby.

helgatheviking helgatheviking
1 ago 2013 12:56:07

Sí, aparentemente lo es desde WordPress 3.5. Estoy usando la versión 3.5.2. Revisa http://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

Max Max
1 ago 2013 13:16:01

Tienes razón. Esto es nuevo para mí.

helgatheviking helgatheviking
1 ago 2013 16:14:22

Fuera de tema tal vez, pero Google lleva aquí, y antes no conocía 'orderby' => 'post__in', así que +1.

DomQ DomQ
11 abr 2018 15:40:41
Todas las respuestas a la pregunta 2
1
43

Establece orderby a post__in. Esto preserva el orden de IDs de entrada dado en el array post__in (disponible desde la Versión 3.5).

$args = array (
    'posts_per_page' => -1,
    'post__in' => $ids,
    'orderby' => 'post__in' 
);
28 dic 2013 18:52:20
Comentarios

No tienes idea del alivio que me dio esta respuesta.

Mark Mark
24 abr 2019 06:33:58
0

Totalmente mi culpa, tenía una función antigua enganchada a the_posts que hacía su propio ordenamiento. Código viejo que olvidé eliminar. Ahora funciona perfectamente.

2 ago 2013 16:22:20