Ordenar por “post__in” no da como resultado el orden correcto

3 minutos de lectura

avatar de usuario de drake035
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

  • ¿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 el order 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

Avatar de usuario de Cave Johnson
cueva johnson

Si miras el WP_Querycó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.

¿Ha sido útil esta solución?