web-dev-qa-db-ja.com

get_pages()が本来の順番通りに並んでいない

私はこのようなページからすべてのサブページを取得するためにget_pages()関数を使用しています:

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

これは私がすべてのページのリストを表示するために作られています(直接の子供、子供の子供など)、作成日順に並べ替えますが、代わりにページのリストを奇妙な順序で表示します。 $ childrens配列に対してforeachを実行し、それぞれにpost_dateを出力します。

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_columnキーで他のオプションを使用しようとしました、しかしどれも正しく働いているように見えませんでした。

前もって感謝します!

6

少し振り返ってみたところ、次のようにして動作するように管理しました。

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関数を使ってオブジェクトの日付で配列をソートし、それを逆にして最新のものから最も古いものの順に並べ替えています。

4

これは確かにエラーであり、おそらくchild_of引数によって引き起こされます。

child_ofは与えられたページのサブツリー全体(直接の子供だけでなくそれらの子供の子供なども)を要求するので、WordPressは最初にすべてのページを問い合わせ、そして そしてそれらのページのサブセットを選択します 。最初の問い合わせは順序を尊重しますが、 2番目の副選択はarray_merge() を使うことでこれをめちゃくちゃにします。

これ用のTracチケットを作成しました

4
Jan Fabry

解決策を探す際の注意点:

  • このチケットを trac に通して読むと、引数はget_posts()引数に合わせて次のバージョンで変更されます。
  • この関数は/core-root/wp-includes/post.phpの3.284行にあります。

質問:

  • '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' );
2
kaiser

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

   }
?>
2
VicePrez

get_children 代わりに - child_ofをpost_parent/sort_column/sort_orderに置き換えてください。

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

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