it-swarm.com.de

get_pages () bestellt nicht wie es sollte

Ich benutze die Funktion get_pages (), um alle Unterseiten von einer Seite wie dieser abzurufen:

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

Es wird vorausgesetzt, dass ich eine Liste aller Seiten (egal ob direkte Kinder, Kinder von Kindern usw.) erhalte, die nach dem Erstellungsdatum sortiert sind. Stattdessen wird mir die Liste der Seiten in einer seltsamen Reihenfolge angezeigt. Hier ist die Ausgabe wann Ich führe ein foreach im $ childrens-Array aus und gebe das post_date für jedes 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 absteigendem Datum sortiert. Ich habe versucht, andere Optionen im sort_column-Schlüssel zu verwenden, aber keine schien korrekt zu funktionieren. Weiß jemand, was falsch sein könnte?

Danke im Voraus!

6

nachdem ich mich ein bisschen umgesehen hatte, schaffte ich es, dass es funktionierte, indem ich folgendes verwendete:

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-Funktion, um das Array nach dem Datum der Objekte zu sortieren, und die Umkehrung, um es vom neuesten zum ältesten zu sortieren. Vielen Dank, dass Sie mich in die richtige Richtung gelenkt haben. Ich habe alle für Sie gestimmt.

4

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

Da child_of den gesamten Teilbaum der angegebenen Seite anfordert (nicht nur die direkten Kinder, sondern auch die Kinder dieser Kinder 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 Unterauswahl bringt dies durch einfaches Verwenden von array_merge() durcheinander.

Ich habe ein Trac-Ticket für dieses erstellt .

4
Jan Fabry

Einige Randbemerkungen bei der Suche nach einer Lösung:

  • Wenn Sie dieses Ticket unter trac lesen, ändern sich die Argumente mit der kommenden Version, um sie an die get_posts()-Argumente anzupassen.
  • Sie finden die Funktion unter /core-root/wp-includes/post.php in Zeile 3.284

Fragen:

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

Probieren Sie es aus und teilen Sie mir das Ergebnis mit. Vielleicht können Sie sie dort nachbestellen, bis Sie eine zufriedenstellende Lösung gefunden haben:

function wpse16921_get_pages( $pages, $r )
{
    echo '<pre>'; print_r($pages); echo '</pre>';
}
add_filter( 'get_pages', 'wpse16921_get_pages' );

Bearbeiten

Hier finden Sie eine Reihe von Funktionen, die Sie bei der Arbeit unterstützen, bis der Patch in eine WP-Version übergegangen ist:

// First: Loop through your pages inside the filter
function wpse16921_get_pages_filter( $pages, $r )
{
    # echo '<pre>'; 
        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 '</pre>';

    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 '<pre>'; 
        foreach ( $pages as $date => $page )
            echo $date.'<br />';     
    echo '</pre>';
    # <<<< end modifying/preparing the output
} 
add_action( 'after_setup_theme', 'wpse16921_get_pages_call' );
2
kaiser

Ich bin mir nicht sicher, wie ich das Problem mit WordPress beheben kann - ich erhalte die gleichen Ergebnisse wie Sie, aber dies kann mit den PHP Funktionen sort() und rsort() und ein bisschen schmutziger Arbeit mit foreach erreicht werden.

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

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 '<br />';

   }
?>
2
VicePrez

benutze get_children stattdessen - 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 ##
1
Q Studio