web-dev-qa-db-fra.com

Obtenir la page suivante/précédente de la cousine

Hé les gars, j'essaye de construire des liens de pagination pour la page de cousin suivante/précédente. Par exemple, ma structure de page est la suivante:

  • Haut niveau
    • UNE
      • a1
      • a2
    • B
      • b1
      • b2

Lorsque je suis sur a2, je veux que le lien "Page précédente" aille vers a1, mais que le lien "Page suivante" aille vers b1 (saute B).

J'utilise un excellent plugin page suivante, pas de publication suivante pour le moment, mais il ne peut aller que sur la page suivante exemple ci-dessus).

J'essaie de le modifier pour ne montrer que les cousins, mais j'ai quelques problèmes. Jusqu'ici j'ai ceci:

    // 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.'">';
    }

Alors, comment est-ce que je ferais ce saut B, et aller à b1 et ainsi de suite?

Merci pour l'aide!

-A dessiné

3
Drew Baker

J'ai résolu ce problème en récupérant toutes les pages, en les assignant par niveau, puis en obtenant la page suivante du même niveau. Si vous souhaitez également afficher la page précédente, vous devez probablement mettre en cache la fonctionnalité qui regroupe les pages par niveau.

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