Disons que j'ai ce menu:
Top
|___ Sub 1
|___ Sub Sub 1
|___ Sub Sub 2
|___ Sub Sub 3
|___ Sub Sub 4
|___ Sub 2
|___ Sub Sub 1
|___ Sub Sub 2
|___ Sub Sub 3
|___ Sub Sub 4
|___ Sub 3
|___ Sub Sub 1
|___ Sub Sub 2
|___ Sub Sub 3
|___ Sub Sub 4
|___ Sub 4
|___ Sub Sub 1
|___ Sub Sub 2
|___ Sub Sub 3
|___ Sub Sub 4
Je peux lister ce menu en utilisant ceci:
if( 0 == $post->post_parent && 0 == count( $children ) )
return;
if( 0 == $post->post_parent )
{
$child_of = $post->ID;
}
else {
$parents = get_post_ancestors( $post->ID );
$child_of = end( $parents );
}
$args = array
(
'child_of' => $child_of,
'echo' => 0,
'title_li' => ''
);
$pages = wp_list_pages( $args );
C'est bien, mais je ne veux pas afficher tous les éléments de page. Ce que je veux, c'est que seuls les enfants immédiats de la page sur laquelle vous vous trouvez soient affichés.
Donc, si je suis à la page Top
, le menu devrait ressembler à ceci:
Top
|___ Sub 1
|___ Sub 2
|___ Sub 3
|___ Sub 4
Si je suis sur la page Top/Sub 3
, le menu devrait ressembler à ceci:
Top
|___ Sub 1
|___ Sub 2
|___ Sub 3
|___ Sub Sub 1
|___ Sub Sub 2
|___ Sub Sub 3
|___ Sub Sub 4
|___ Sub 4
Et ainsi de suite, afin que cela puisse fonctionner à n'importe quelle profondeur.
Rarst a mis en place une bonne réponse mais c'était pour l'utilisation de menus WordPress. Je cherche la même chose pour wp_list_pages (). Vous cherchez une réponse qui utilise un Walker ou des filtres/crochets. Je sais comment résoudre ce problème avec CSS, mais cela ne résout pas le problème de l'envoi inutile de HTML au navigateur.
J'ai proposé ma propre solution mais je ne suis pas convaincue que ce soit la meilleure.
$parents = array( $post->ID );
if( 0 != $post->post_parent )
{
$parents = array_merge( $parents, get_post_ancestors( $post->ID ) );
}
$child_of = end( $parents );
$args = array
(
'child_of' => $child_of,
'echo' => 0,
'title_li' => '',
'walker' => new chg_Sub_Page_Navigation_Walker( $parents )
);
$pages = wp_list_pages( $args );
Walker:
class chg_Sub_Page_Navigation_Walker extends Walker_Page
{
var $parents = array();
function __construct( $parents )
{
$this->parents = $parents;
}
function start_el( &$output, $page, $depth, $args, $current_page )
{
if( in_array( $page->post_parent, $this->parents ) )
parent::start_el( &$output, $page, $depth, $args, $current_page );
}
function end_el( &$output, $page, $depth )
{
if( in_array( $page->post_parent, $this->parents ) )
parent::end_el( &$output, $page, $depth );
}
}
Vous pouvez envisager d'utiliser une combinaison de get_children () pour les enfants de la page et de la page frères et soeurs et de get_post_ancestors () pour les ancêtres:
global $post;
$pages =& get_children(array(
'post_type' => 'page',
'post_parent' => $post->ID,
));
$siblings = get_children(array(
'post_type' => 'page',
'post_parent' => $post->post_parent,
));
$ancestors = get_post_ancestors($post->ID);
Edit - une démonstration rapide de l’idée qui peut utiliser un peu de nettoyage:
<ul>
<?php
global $post;
$children =& get_children(array(
'post_type' => 'page',
'post_parent' => $post->ID,
));
$siblings = get_children(array(
'post_type' => 'page',
'post_parent' => $post->post_parent,
));
$ancestors = get_post_ancestors($post->ID);
if(!empty($ancestors)):
$ancestors = array_reverse($ancestors);
foreach($ancestors as $aid):
$p = get_post($aid);
?>
<li>
<?php echo $p->post_title ?>
<ul>
<?php endforeach?>
<?php if(!empty($siblings)): ?>
<?php foreach($siblings as $sibling): ?>
<li>
<?php echo $sibling->post_title?>
<?php if($sibling->ID == $post->ID && !empty($children)): ?>
<ul>
<?php foreach($children as $child): ?>
<li><?php echo $child->ID ?></li>
<?php endforeach?>
</ul>
<?php endif ?>
</li>
<?php endforeach ?>
<?php endif ?>
<?php foreach ($ancestors as $aid):?>
</ul></li>
<?php endforeach ?>
<?php endif ?>
</ul>