私はこのメニューがあるとしましょう:
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
これを使ってそのメニューをリストすることができます:
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 );
これは問題ありませんが、すべてのページアイテムを表示したくはありません。私が欲しいのはあなたがいるページのimediateの子だけが表示されるということです。
それで私がTop
ページにいるならば、メニューはそのように見えるべきです:
Top
|___ Sub 1
|___ Sub 2
|___ Sub 3
|___ Sub 4
Top/Sub 3
ページにいる場合は、メニューは次のようになります。
Top
|___ Sub 1
|___ Sub 2
|___ Sub 3
|___ Sub Sub 1
|___ Sub Sub 2
|___ Sub Sub 3
|___ Sub Sub 4
|___ Sub 4
そしてそれは、それがあらゆる深さまで機能することができるように。
最も悪いのは いい答え ですが、これはWordPressのメニューを使うときのためです。私はwp_list_pages()についても同じことを探しています。 Walkerまたはフィルタ/フックを使用した回答を探しています。私はCSSでこの問題を解決する方法を知っていますが、これはブラウザに送られる不要なHTMLの問題を解決しません。
私は自分の解決策を思いついたが、それが最善だとは思わない。
$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 );
ウォーカー:
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 );
}
}
あなたは、ページとページの兄弟のためにget_children()を、そして先祖のためにget_post_ancestors()を混在させることを考慮することができます。
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);
編集 - いくつかのクリーンアップを使用することができますアイデアの簡単なデモンストレーション:
<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>
引数「depth」の使用を検討してください
例:
wp_list_pages( 'sort_column=menu_order&title_li=&child_of=' . $post->ID . '&echo=0&depth=1'