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!
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.
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()
.
Quelques notes lors de la recherche d'une solution:
get_posts()
.Des questions:
'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' );
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' );
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 />';
}
?>
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 ##