Die Sortierung nach „post__in“ führt nicht zur korrekten Reihenfolge

Lesezeit: 3 Minuten

Benutzeravatar von drake035
drake035

Nachdem ich ein flaches Array von Beitrags-IDs erstellt habe, möchte ich diese Beiträge über eine benutzerdefinierte Abfrage in derselben Reihenfolge wie in meinem Array anzeigen. Der Arzt besagt, dass post__in wird „Post-ID-Reihenfolge im post__in-Array beibehalten“. In meinem Fall ist dies jedoch nicht der Fall. Warum?

Erstellung meines Arrays von Beitrags-IDs:

if (have_rows('cases')) :
  while (have_rows('cases')) : the_row();
    $array_cases[] = get_sub_field('case');
  endwhile;
endif;
print_r($array_cases);

Ergebnis:

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

Ergebnis:

WP_Query Object
(
  ...
  [posts] => Array
    (
      [0] => WP_Post Object
        (
          [ID] => 2959
          ...
        )

      [1] => WP_Post Object
        (
          [ID] => 914
          ...
        )

      [2] => WP_Post Object
        (
          [ID] => 1974
          ...
        )
    )
)

Die Reihenfolge im resultierenden Abfrageergebnis ist falsch. Der zweite und dritte Beitrag sollten 919 und 914 lauten, nicht 914 und 1974.

Unten ist die Roh-SQL des WP_Query-Objekts:

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

  • Können Sie bestätigen, dass Beitrag 919 überhaupt in Ihrem Ergebnisarray enthalten ist? Hat Beitrag 919 den Beitragstyp „iw-project“ und wird er nicht gelöscht? Ich sehe 919 überhaupt nicht in Ihrem Ergebnis. Vielleicht passt es also einfach nicht zu Ihren Abfragebedingungen.

    – Cave Johnson

    31. Januar 2018 um 18:03 Uhr


  • Gute Frage. Aber ja, das ist es, auf Platz 7. Und es gehört tatsächlich zum Beitragstyp „iw-project“.

    – drake035

    1. Februar 2018 um 12:31 Uhr

  • Können Sie alle in der akzeptierten Antwort hier veröffentlichten Lösungen ausprobieren und mir mitteilen, ob sie funktionieren? wordpress.stackexchange.com/questions/220014/…

    – Cave Johnson

    2. Februar 2018 um 3:57

  • Ich habe gerade versucht, WordPress zu installieren, um Ihr Problem zu reproduzieren, konnte es aber nicht reproduzieren. Meine Abfrage behält die Reihenfolge der Beiträge aus dem korrekt bei post__in Array (auch ohne Hinzufügen des order Parameter). Können Sie bitte versuchen, das Roh-SQL von Ihrem wp_query-Objekt abzurufen? Sie können dies tun, indem Sie die Anforderungseigenschaft wie folgt ausdrucken: print_r($query_cases->request). Das sollte Ihnen das Roh-SQL liefern. Bearbeiten Sie die SQL, die Sie in Ihre Frage einfügen.

    – Cave Johnson

    2. Februar 2018 um 8:39


  • @KodosJohnson danke, ich habe meine Frage bearbeitet und das Roh-SQL hinzugefügt

    – drake035

    2. Februar 2018 um 14:28

Benutzeravatar von Cave Johnson
Cave Johnson

Wenn man sich das anschaut WP_Query-generierten SQL-Code, den Sie bereitgestellt haben, sollten Sie dieses Snippet beachten, das die Bestellung verarbeitet:

ORDER BY wp_posts.menu_order, FIELD(wp_posts.ID, 2959,919,914,1593,1583,1974,1649,993,675)

Das bedeutet, dass nach sortiert wird wp_posts.menu_order Vor Die Reihenfolge erfolgt basierend auf den Beitrags-IDs in Ihrem Array (2959,919,914,...). Es sieht aus wie ein filter überschreibt die Standardreihenfolge von WP_Query Ergebnisse. Dies kann entweder durch ein Theme oder ein Plugin verursacht werden.

Die Lösung besteht darin, zu verhindern, dass andere Filter Ihre Abfrage ändern, indem Sie den Parameter übergeben 'suppress_filters' => true. Außerdem sollten Sie anrufen remove_all_actions('pre_get_posts'); vor deinem WP_Query. Dies sollte verhindern, dass andere Filter Ihre Abfrage ändern.

Ein Teil der Anerkennung für die Lösung geht an diese WP.SE-Antwort für eine sehr ähnliche Frage.

1451270cookie-checkDie Sortierung nach „post__in“ führt nicht zur korrekten Reihenfolge

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy