web-dev-qa-db-ja.com

wp_list_pages()しかしあなたがいるブランチ上の子だけを表示する

私はこのメニューがあるとしましょう:

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の問題を解決しません。

1
Brady

私は自分の解決策を思いついたが、それが最善だとは思わない。

    $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 );
    }
}
1
Brady

あなたは、ページとページの兄弟のために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>
0

引数「depth」の使用を検討してください

例:

wp_list_pages( 'sort_column=menu_order&title_li=&child_of=' . $post->ID . '&echo=0&depth=1' 
0
Eliut Islas