drake035
Después de crear una matriz plana de ID de publicación, quiero mostrar esas publicaciones a través de una consulta personalizada en el mismo orden que en mi matriz. El documento Establece que post__in
“Conservará el orden de ID de publicación dado en la matriz post__in”. Sin embargo, en mi caso no es así. ¿Por qué?
Creación de mi matriz de ID de publicación:
if (have_rows('cases')) :
while (have_rows('cases')) : the_row();
$array_cases[] = get_sub_field('case');
endwhile;
endif;
print_r($array_cases);
Resultado:
Array
(
[0] => 2959
[1] => 919
[2] => 914
...
)
WP_Query():
$args = array(
'post_type' => 'iw-project',
'post__in' => $array_cases,
'orderby' => 'post__in'
);
$query_cases = new WP_Query($args);
print_r($query_cases);
Resultado:
WP_Query Object
(
...
[posts] => Array
(
[0] => WP_Post Object
(
[ID] => 2959
...
)
[1] => WP_Post Object
(
[ID] => 914
...
)
[2] => WP_Post Object
(
[ID] => 1974
...
)
)
)
El orden en el resultado de la consulta resultante es incorrecto. Las publicaciones segunda y tercera deberían ser 919 y 914, no 914 y 1974.
A continuación se muestra el SQL sin procesar del objeto WP_Query:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
JOIN wp_icl_translations t ON wp_posts.ID = t.element_id AND t.element_type = CONCAT('post_', wp_posts.post_type)
WHERE 1=1
AND wp_posts.ID IN (2959,919,914,1593,1583,1974,1649,993,675)
AND wp_posts.post_type="iw-project"
AND (wp_posts.post_status="publish" OR wp_posts.post_status="acf-disabled")
AND ((t.language_code="en" AND wp_posts.post_type IN ('post', 'page', 'iw-project', 'iw-contact', 'iw-slide', 'iw-client')) OR wp_posts.post_type NOT IN ('post','page','iw-project','iw-contact','iw-slide','iw-client'))
ORDER BY wp_posts.menu_order, FIELD(wp_posts.ID, 2959, 919, 914, 1593, 1583, 1974, 1649, 993 ,675)
LIMIT 0, 8
cueva johnson
Si miras el WP_Query
código SQL generado que proporcionó, debe tener en cuenta este fragmento que maneja el pedido:
ORDER BY wp_posts.menu_order, FIELD(wp_posts.ID, 2959,919,914,1593,1583,1974,1649,993,675)
Lo que esto significa es que está ordenando por wp_posts.menu_order
antes hace el pedido en función de los ID de publicación en su matriz (2959,919,914,...
). Se ve como un filter
está anulando el orden predeterminado de WP_Query
resultados. Esto podría ser causado por un tema o un complemento.
La solución es evitar que otros filtros modifiquen su consulta pasando el parámetro 'suppress_filters' => true
. Además, debe llamar remove_all_actions('pre_get_posts');
antes de su WP_Query
. Esto debería evitar que otros filtros modifiquen su consulta.
Parte del crédito por la solución es para esta respuesta WP.SE para una pregunta muy similar.
¿Puede confirmar que la publicación 919 está en su matriz de resultados? ¿La publicación 919 tiene el tipo de publicación ‘iw-project’ y no se elimina? No veo 919 en su resultado en absoluto. Entonces, tal vez simplemente no coincida con las condiciones de su consulta.
– Cueva Johnson
31 de enero de 2018 a las 18:03
Buena pregunta. Pero sí lo es, en 7ª posición. Y pertenece, de hecho, al tipo de publicación “iw-project”.
– drake035
1 de febrero de 2018 a las 12:31
¿Puedes probar todas las soluciones publicadas por la respuesta aceptada aquí y decirme si funciona? wordpress.stackexchange.com/questions/220014/…
– Cueva Johnson
2 de febrero de 2018 a las 3:57
Acabo de intentar instalar wordpress para reproducir su problema pero no pude reproducirlo. Mi consulta está preservando correctamente el orden de las publicaciones del
post__in
matriz (incluso sin agregar elorder
parámetro). ¿Puede intentar obtener el sql sin procesar de su objeto wp_query? Puede hacer esto imprimiendo la propiedad de solicitud de esta manera:print_r($query_cases->request)
. Eso debería darte el SQL sin procesar. Edite el SQL que obtiene en su pregunta.– Cueva Johnson
2 de febrero de 2018 a las 8:39
@KodosJohnson gracias, edité mi pregunta y agregué el SQL sin formato
– drake035
2 de febrero de 2018 a las 14:28