web-dev-qa-db-fra.com

Navigation précédente/suivante pour la page actuelle?

Comment puis-je obtenir une navigation Précédent/Suivant qui ne fait que naviguer dans les pages enfants de la page en cours?

Par cela, je veux dire url.com/page/ child1 , url.com/page/ child2 et ainsi de suite ..

J'ai cherché beaucoup mais je suis toujours perdu.

Il semble que vous ne puissiez pas le faire selon wordpress (ils recommandent des plugins ..)

3
Phife Dawz

Très bien, la voilà qui fonctionne à fond:

<?php
$pagelist = get_pages("child_of=".$post->post_parent."&parent=".$post->post_parent."&sort_column=menu_order&sort_order=asc");
$pages = array();
foreach ($pagelist as $page) {
   $pages[] += $page->ID;
}

$current = array_search($post->ID, $pages);
$prevID = $pages[$current-1];
$nextID = $pages[$current+1];
?>

<div class="navigation">
<?php if (!empty($prevID)) { ?>
<div class="previous">
<a href="<?php echo get_permalink($prevID); ?>" title="<?php echo get_the_title($prevID); ?>">Previous</a>

</div>
<?php }
if (!empty($nextID)) { ?>
<div class="Next">
<a href="<?php echo get_permalink($nextID); ?>" title="<?php echo get_the_title($nextID); ?>">Next</a>
</div>
<?php } ?>
</div>

Une petite chose cosmétique doit être corrigée , c'est que les liens "Précédent" et "Suivant" doivent toujours être affichés, qu'il y ait ou non d'autres pages ...

6
Phife Dawz

Super bidouille, il a fait ce que je cherchais. Je pense que certains d’entre vous pourraient être intéressés par ce que j’ai ajouté, à savoir: des liens alternatifs

  • à la première page enfant lorsque vous parcourez la page parent
  • au parent lorsque vous parcourez la première page enfant

la navigation ne s'affiche pas lorsqu'elle n'est pas nécessaire, le style correspond à celui que le thème des vingt-treize applique à la navigation dans les publications.

<?php // display nav only if there are child pages
if ($post->post_parent) { // applies only to child pages 
$pagelist = get_pages("child_of=".$post->post_parent."&parent=".$post->post_parent."&sort_column=menu_order&sort_order=asc");
$pages = array();
foreach ($pagelist as $page) {
$pages[] += $page->ID;
}
$current = array_search($post->ID, $pages);
$prevID = $pages[$current-1];
$nextID = $pages[$current+1];
?>

<nav class="navigation post-navigation" role="navigation">
<div class="nav-links">
    <?php if (!empty($prevID)) { /* if we are browsing first child, then link to parent page*/ ?>
        <a rel="prev" href="<?php echo get_permalink($prevID); ?>" title="<?php echo get_the_title($prevID); ?>"><span class="meta-nav">&larr;</span> <?php echo get_the_title($prevID); ?></a>
    <?php }
    else { // else, link to previous child ?>
        <a rel="prev" href="<?php echo get_permalink($post->post_parent); ?>"><span class="meta-nav">&larr;</span> <?php echo get_the_title($post->post_parent); ?></a>
    <?php }

    if (!empty($nextID)) { ?>
    <a rel="next" href="<?php echo get_permalink($nextID); ?>" title="<?php echo get_the_title($nextID); ?>"><?php echo get_the_title($nextID); ?> <span class="meta-nav">&rarr;</span></a>
    <?php } ?>
</div>
</nav>                      
                    <?php }
                    else { // if we are browsing parent page, then link to first child
$child_pages = get_pages("child_of=".$post->ID."&parent=".$post->ID."&sort_column=menu_order&sort_order=asc");
$first_child = $child_pages[0]; ?>
<?php if (!empty($first_child)) { ?>
<nav class="navigation post-navigation" role="navigation">
<div class="nav-links">
    <a rel="next" href="<?php echo get_permalink($first_child->ID); ?>"><?php echo get_the_title($first_child->ID); ?> <span class="meta-nav">&rarr;</span></a>

</div>
1
Mars

La solution ' wpse5422_the_page_siblings () ' fonctionne très bien, je ne peux pas en parler car mon représentant est trop bas, mais mon seul changement est de créer cette ligne:

'sort_column'=>'menu_order',

Pour être ceci:

'sort_column'=>'menu_order title',

Ainsi, si l'utilisateur laisse l'ordre de tri de chaque page égal à 0, il triera par défaut le titre alphabétique par titre de page.

Merci!

0
Purple Tentacle

Vous pouvez utiliser find la page parent de la publication en cours en utilisant post-> parent_page, puis l'insérer dans get_page_children , en obtenant tous les frères et soeurs de la page parent, puis rechercher les éléments suivant et précédent dans le tableau renvoyé.

0
fdsa

Si vous êtes ouvert à la route des plugins, ce que je suis personnellement pour ce genre de chose, le plugin Ambrosite Page suivante/Page précédente Link Plus est plutôt génial. Il prend en charge les fonctionnalités que vous recherchez et bien d’autres.

0
Dave Romsey

Non testé, mais cela devrait fonctionner:

Commencez par utiliser get_pages pour rechercher toutes les autres pages (ou CPT) ayant le même parent que la page actuelle. Trouvez ensuite les pages "précédente" et "suivante".

function wpse5422_the_page_siblings(){
    $post_id = get_the_ID();
    $parent_id = wp_get_post_parent_id($post_id);
    $post_type = get_post_type($post_id);

    $sibling_list = get_pages(array(
         'sort_column'=>'menu_order',
         'sort_order' =>'asc',
         'child_of' =>$parent_id,
         'post_type'=> $post_type
    ));

    if( !$sibling_list || is_wp_error($sibling_list) )
        return false;

    $pages = array();
    foreach ($sibling_list as $sibling ) {
         $pages[] = $sibling->ID;
     }

    $current = array_search($post_id, $pages);
    $prevID = isset($pages[$current-1]) ? $pages[$current-1] : false;
    $nextID = isset($pages[$current+1]) ? $pages[$current+1] : false;

    echo wpse5422_display_prev_next($prevID, $nextID);
 }

La fonction ci-dessus doit être utilisée à l'intérieur de la boucle - elle prend la page actuelle (ou tout type de publication hiérarchique) et recherche la page précédente et suivante (c'est-à-dire du même parent que la page actuelle) en fonction de leur ordre de menu date ou titre).

Il utilise ensuite la fonction suivante qui prend deux ID en argument et est simplement responsable de la production de la sortie:

 function wpse5422_display_prev_next($prevID=false, $nextID=false){
    if( empty($prevID) && empty($nextID) )
       return false;

    $html = '<div class="navigation">';

    if( !empty($prevID) ){
         $html .= '<div class="alignleft">';
         $html .= '<a href="'.get_permalink($prevID).'">Previous</a>';
         $html .= '</div>';
     }

    if( !empty($nextID) ){
         $html .= '<div class="alignright">';
         $html .= '<a href="'.get_permalink($nextID).'">Next</a>';
         $html .= '</div>';
     }

    $html .= '</div><!-- .navigation -->';

    return $html;
}

Où mettre ce code

Idéalement, vous devriez créer un plug-in. Cela fonctionnera dans functions.php - mais vraiment, il ne devrait pas y vivre.

Usage

Dans la boucle, que vous souhaitiez afficher les liens de page: wpse5422_the_page_siblings();.

0
Stephen Harris

Pour afficher les liens suivants et précédents indépendamment de la présence ou non de pages supplémentaires, vous devez ajouter des instructions conditionnelles: (édité le contenu inutile elseif)

<div class="navigation">
<?php if (!empty($prevID)) : ?>
<div class="previous">
<a href="<?php echo get_permalink($prevID); ?>" 
title="<?php echo get_the_title($prevID); ?>">Previous</a>
</div>
<?php else : ?>
<div class="previous disabled">
<a href="#">Previous</a>
</div>
<?php endif; ?>
<?php if (!empty($nextID)) : ?>
<div class="next">
<a href="<?php echo get_permalink($nextID); ?>" 
title="<?php echo get_the_title($nextID); ?>">Next</a>
</div>
<?php else : ?>
<div class="next disabled">
<a href="#">Next</a>
</div>
<?php endif; ?>
</div>
0
Chris