get_pages () sortiert nicht so wie es sollte

Ich verwende get_pages () -function, um alle Unterseiten von einer Seite wie dieser zu erhalten:

$childrens = get_pages(array('child_of' => 7, 'sort_column' => 'post_date', 'sort_order' => 'DESC', 'depth' => -1)); 

Dies ist angebracht, um mir eine Liste aller Seiten (egal ob direkte Kinder, Kinder von Kindern, etc.) bis zum Erstellungsdatum zu bestellen, aber stattdessen zeigt mir die Liste der Seiten in einer seltsamen Reihenfolge, hier ist die Ausgabe wann Ich führe eine foreach auf dem $ childrens Array aus und gebe das post_date auf jedem aus:

 2011-05-10 15:37:03 2011-05-10 15:35:59 2011-05-10 15:01:18 2011-05-10 17:12:32 2011-05-10 15:00:47 2011-05-10 14:00:14 2011-05-11 04:19:08 2011-05-10 23:52:54 2011-05-10 15:20:12 2011-05-10 15:05:10 

Wie Sie sehen können, sind sie nicht nach Datum absteigend sortiert. Ich habe versucht, andere Optionen im Schlüssel sort_column zu verwenden, aber keiner scheint richtig zu funktionieren. Weiß jemand, woran es liegen könnte?

Danke im Voraus!

Solutions Collecting From Web of "get_pages () sortiert nicht so wie es sollte"

Dies ist in der Tat ein Fehler und wahrscheinlich durch das Argument child_of verursacht.

Da child_of den gesamten Teilbaum der angegebenen Seite anfordert (nicht nur die direkten child_of , sondern auch die child_of usw.), fragt WordPress zuerst alle Seiten ab und wählt dann eine Teilmenge dieser Seiten aus . Die erste Abfrage respektiert die Reihenfolge, aber die zweite array_merge() dies, indem sie nur array_merge() .

Ich habe dafür ein Trac-Ticket erstellt .

Nachdem ich mich ein bisschen umgeschaut habe, habe ich es geschafft, es mit folgendem zu arbeiten:

 function sort_pages_by_date($a, $b){ if ($a->post_date == $b->post_date) return 0; if ($a->post_date < $b->post_date) return -1; return 1; } function get_filtered_news($pages) { usort($pages, 'sort_pages_by_date'); rsort($pages); return $pages; } add_filter('get_pages', 'get_filtered_news'); 

Ich benutze die usort-function, um das Array nach dem Datum der Objekte zu sortieren, und es umzukehren, damit es vom neuesten zum ältesten sortiert wird. Danke, dass Sie mich in die richtige Richtung weisen. Ich habe alle gewählt.

rsort() mir nicht sicher, wie man das Problem mit WordPress beheben kann – ich rsort() die gleichen Ergebnisse wie du, aber das kann mit den PHP-functionen sort() und rsort() und etwas schmutziger Arbeit mit foreach .

rsort() würde ein Array in umgekehrter Reihenfolge und sort() vom niedrigsten zum höchsten sort() .

Versuche dies:

 < ?php $children = get_pages( array( 'child_of' => 7 ) ); foreach ( $children as $child ) { // get post date of each page/child $post_date = $child->post_date; // populate the array with the post dates $dates[] = $post_date; } // Sort the array in reverse order rsort( $dates ); // or sort( $dates ) for the lowest to highest foreach ( $dates as $date ) { echo $date; echo '
'; } ?>

Einige Hürden bei der Suche nach einer Lösung:

  • Beim get_posts() dieses Tickets in trac ändern sich die Argumente mit einer kommenden Version, um sie mit den get_posts() Argumenten auszurichten.
  • Sie finden die function unter /core-root/wp-includes/post.php Zeile 3.284

Fragen:

  • Sind Sie sicher, dass Sie nicht 'include' als Argument verwenden? Dies setzt 'child_of' auf Null.

Probieren Sie das aus und erzählen Sie mir von dem Ergebnis, das Sie erhalten. Vielleicht kannst du sie dort neu bestellen, bis du eine befriedigende Lösung gefunden hast:

 function wpse16921_get_pages( $pages, $r ) { echo '
'; print_r($pages); echo '

'; } add_filter( 'get_pages', 'wpse16921_get_pages' );

Bearbeiten

Hier findest du eine Reihe von functionen, die dir dabei helfen, so lange zu arbeiten, bis der Patch in einer wp-Version erschienen ist:

 // First: Loop through your pages inside the filter function wpse16921_get_pages_filter( $pages, $r ) { # echo '
'; foreach ( $pages as $page ) { $page = (array) $page; $pages_temp[$page['post_date']] = $page; } # echo 'Before manipulation: '; print_r($pages_temp); $pages_temp = '/* handle sorting of your new date keys over here */'; # echo 'After manipulation: '; print_r($pages_temp); # echo '

'; return $pages = $pages_temp; } // Second: Attach the filter to the appropriate hook function wpse16921_get_pages_filter_hook() { add_filter( 'get_pages', 'wpse16921_get_pages_filter', 10, 2 ); } add_action( 'after_setup_theme', 'wpse16921_get_pages_filter_hook', 0 ); // Call your pages function wpse16921_get_pages_call() { $pages = get_pages(); # >>>> start modifying/preparing the output echo '

'; foreach ( $pages as $date => $page ) echo $date.'
'; echo '

'; # < <<< end modifying/preparing the output } add_action( 'after_setup_theme', 'wpse16921_get_pages_call' );

benutze stattdessen get_children – ersetze child_of durch post_parent / sort_column / sort_order – dh:

 $nav_args = array( 'sort_column' => 'date', 'sort_order' => 'desc', 'post_parent' => get_the_ID(), ); $list = get_children( $nav_args ); // list results ##