web-dev-qa-db-ja.com

次/前のいとこのページを取得する

こんにちは、私は次/前のいとこのページのためのページネーションリンクを構築しようとしています。たとえば、私のページ構造は次のようになります。

  • トップレベル
    • A
      • a1
      • a2
    • B
      • b1
      • b2

A2にいるときは、 'Previous Page'リンクをa1に移動し、 'Next Page'リンクをb1に移動する必要があります(Bをスキップ)。

現時点では素晴らしい 次のページ、次の投稿ではない プラグインを使用していますが、次のページにしか移動できません(そのためBには上記の例).

いとこだけを見せるように修正しようとしていますが、いくつかの問題が発生しています。これまでのところ私はこれを持っています:

    // query gand parent page level, go to next parent page, and then loop to find it's next child, eke!
    // get grandparent id
    $parentInfo = get_page($post->post_parent);

    // query the level above's pages
    // $getParentPages = get_pages('child_of='.$parentInfo->post_parent.'&parent='.$parentInfo->post_parent.'&'.$getPagesQuery);
    $getParentPages = get_pages($getPagesQuery);
    $parentPageCount = count($getParentPages);      

    for($pp=0; $pp < $parentPageCount; $pp++) {
        // get the array key for our entry
        // if ($post->post_parent == $getParentPages[$pp]->ID) break;
        if ($post->ID == $getParentPages[$pp]->ID) break;
    }

    // assign our next key
    $parentNextKey = $pp+1;

    if (isset($getParentPages[$parentNextKey])) {
        $anchorName = $getParentPages[$parentNextKey]->post_title;

        $output = '<a href="'.get_permalink($getParentPages[$parentNextKey]->ID).'" title="'.$anchorName.'">';
    }

それでは、どのようにしてそれをBをスキップさせてb1に進むのでしょうか。

助けてくれてありがとう!

- 描いた

3
Drew Baker

これを解決するために、すべてのページを取得し、それらをレベルで割り当ててから、同じレベルの次のページを取得しました。前のページも必要な場合は、おそらくページをレベルでグループ化する機能をキャッシュする必要があります。

function wpse16875_next_page_same_level_link()
{
    $next_page_same_level = wpse16875_next_page_same_level();
    if ( $next_page_same_level ) {
        return '<a href="' . get_permalink( $next_page_same_level ) . '">' . get_the_title( $next_page_same_level ) . '</a>';
    }
    return '';
}

function wpse16875_next_page_same_level()
{
    $current_page = $GLOBALS['post'];
    $current_page_level = null;

    $all_pages = get_pages();
    $pages_by_id = array();
    $page_ids_by_parent_id = array();
    $page_ids_by_level = array();
    foreach ( $all_pages as $page ) {
        $pages_by_id[$page->ID] = $page;
        if ( ! array_key_exists( $page->post_parent, $page_ids_by_parent_id ) ) {
            $page_ids_by_parent_id[$page->post_parent] = array();
        }
        $page_ids_by_parent_id[$page->post_parent][] = $page->ID;
    }
    foreach ( $all_pages as $page ) {
        $ancestor_page_id = $page->post_parent;
        $level = 0;
        while ( 0 != $ancestor_page_id ) {
            $ancestor_page_id = $pages_by_id[$ancestor_page_id]->post_parent;
            $level++;
        }
        if ( $page->ID == $current_page->ID ) {
            $current_page_level = $level;
        }
        if ( ! array_key_exists( $level, $page_ids_by_level ) ) {
            $page_ids_by_level[$level] = array();
        }
        $page_ids_by_level[$level][] = $page->ID;
    }

    $current_level_page_ids = $page_ids_by_level[$current_page_level];

    $current_page_pos_by_level = array_search( $current_page->ID, $current_level_page_ids );
    if ( array_key_exists( $current_page_pos_by_level + 1, $current_level_page_ids ) ) {
        return $pages_by_id[$current_level_page_ids[$current_page_pos_by_level + 1]];
    }
    return null;
}
1
Jan Fabry