Get_Pages()没有按其应有的顺序排序

时间:2011-05-11 作者:Javier Villanueva

我使用get\\u pages()函数从如下页面获取所有子页面:

$childrens = get_pages(array(\'child_of\' => 7, 
                             \'sort_column\' => \'post_date\', 
                             \'sort_order\' => \'DESC\', 
                             \'depth\' => -1));
这是一个按创建日期排序的所有页面(无论是直接子页面、子页面的子页面等)的列表,但它以奇怪的顺序显示页面列表,下面是我在$childrens数组上运行foreach并在每个页面上输出post\\u日期时的输出:

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
正如您所看到的,它们不是按日期降序排列的,我尝试在sort\\u列键中使用其他选项,但似乎没有一个选项正常工作,有人知道可能出现了什么问题吗?

提前谢谢!

5 个回复
最合适的回答,由SO网友:Javier Villanueva 整理而成

环顾四周后,我通过以下方法使其正常工作:

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\');
我正在使用usort函数按对象的日期对数组进行排序,并将其反转,使其从最新到最旧排序,感谢大家为我指明了正确的方向,我投票支持你们。

SO网友:Jan Fabry

这确实是一个错误,可能是由于child_of 论点

因为child_of 请求给定页面的整个子树(不仅是直接子树,还包括这些子树的子树等等),WordPress首先查询所有页面和then selects a subset of those pages. 第一个查询尊重订单,但the second subselection messes this up by just using array_merge().

我有created a Trac ticket for this.

SO网友:kaiser

搜索解决方案时的一些旁注:

通读this ticket at trac, 参数将随即将发布的版本而更改,以与get_posts() 参数

你确定你没有使用\'include\' 作为论据?此设置\'child_of\' 归零

function wpse16921_get_pages( $pages, $r )
{
    echo \'<pre>\'; print_r($pages); echo \'</pre>\';
}
add_filter( \'get_pages\', \'wpse16921_get_pages\' );
编辑这里有一组功能可以帮助您解决问题,直到补丁进入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\' );

SO网友:VicePrez

我不知道如何解决WordPress的问题-我得到的结果与您的相同,但这可以通过使用PHP函数来实现sort()rsort() 还有一些肮脏的工作foreach.

rsort() 将按相反顺序对数组进行排序sort() 从最低到最高。

尝试以下操作:

<?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 />\';

   }
?>

SO网友:Q Studio

使用get_children 相反-将的子项替换为post\\u父项/sort\\u列/sort\\u顺序-即:

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

$list = get_children( $nav_args ); // list results ##

结束

相关推荐

Sort plugins by rating

当我想安装一个新的Wordpress插件时,我会搜索我想要的插件,并收到一个结果列表。有没有办法按评级或名称对结果进行排序?如果没有,它将是Wordpress的一个有用的补充。