web-dev-qa-db-fra.com

get_pages () ne commande pas comme il se doit

J'utilise la fonction get_pages () pour obtenir toutes les sous-pages d'une page comme celle-ci:

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

Ceci est supposé me donner une liste de toutes les pages (peu importe si les enfants directs, enfants d’enfants, etc.) sont ordonnées par la date de leur création, mais me montre la liste des pages dans un ordre étrange. Je lance un foreach sur le tableau $ childrens et édite le post_date sur chacun:

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

Comme vous pouvez le constater, ils ne sont pas classés par date décroissante. J'ai essayé d’utiliser d’autres options dans la clé sort_column, mais aucune ne semblait fonctionner correctement. Quelqu'un sait-il ce qui pourrait ne pas être correct?

Merci d'avance!

6

après avoir regardé autour de moi, j'ai réussi à le faire fonctionner en utilisant les éléments suivants:

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

J'utilise la fonction usort pour trier le tableau en fonction de la date des objets, et l'inverser pour le classer du plus récent au plus ancien, merci à tous de m'avoir dirigé dans la bonne direction. J'ai voté avec vous tous.

4

C'est en effet une erreur et probablement causée par l'argument child_of.

Étant donné que child_of demande la totalité de la sous-arborescence de la page donnée (non seulement les enfants directs, mais également les enfants de ces enfants, etc.), WordPress interroge d'abord toutes les pages et puis sélectionne un sous-ensemble de ces pages . La première requête respecte l'ordre, mais la deuxième sous-sélection le perturbe en utilisant simplement array_merge() .

J'ai créé un ticket Trac pour cela .

4
Jan Fabry

Quelques notes lors de la recherche d'une solution:

  • En lisant ce ticket à trac , les arguments changeront avec une version à venir pour s’aligner sur les arguments get_posts().
  • Vous pouvez trouver la fonction sur /core-root/wp-includes/post.php line 3.284

Des questions:

  • Êtes-vous sûr que vous n'utilisez pas 'include' comme argument? Ceci définit 'child_of' à zéro.

Essayez ceci et parlez-moi du résultat que vous obtenez. Vous pouvez peut-être les commander de nouveau jusqu'à ce que vous obteniez une solution satisfaisante:

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

Modifier

Ici, vous avez un ensemble de fonctions qui vous aident à travailler jusqu’à ce que le correctif soit entré dans une version wp:

// 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

Je ne sais pas comment remédier au problème avec WordPress - j'obtiens les mêmes résultats que vous, mais vous pouvez le faire avec les fonctions PHP, sort() et rsort(), ainsi qu'un peu de travail déplorable avec foreach.

rsort() trierait un tableau dans l'ordre inverse et sort() du plus bas au plus élevé.

Essaye ça:

<?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

utilisez get_children à la place - remplacez child_of par post_parent/sort_column/sort_order - c'est-à-dire:

$nav_args = array(
'sort_column' => 'date', 
'sort_order' => 'desc', 
'post_parent' => get_the_ID(),
);

$list = get_children( $nav_args ); // list results ##
1
Q Studio