WP_LIST_Pages(),但仅显示您所在分支上的子项

时间:2012-03-14 作者:Scott

假设我有这个菜单:

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
等等,这样它就可以工作到任何深度。

Rarst提出了一个nice answer 但这是在使用WordPress菜单时使用的。我正在为wp\\u list\\u pages()寻找相同的内容。寻找使用助行器或过滤器/挂钩的答案。我知道如何用CSS解决这个问题,但这并不能解决将不必要的HTML发送到浏览器的问题。

3 个回复
最合适的回答,由SO网友:Scott 整理而成

我已经想出了自己的解决方案,但我不相信这是最好的。

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

SO网友:Nikolay Yordanov

您可以考虑将get\\u children()用于页面的子级和页面的同级,将get\\u post\\u祖先()用于祖先:

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>

SO网友:Eliut Islas

考虑使用参数“深度”

示例:

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

结束

相关推荐

WooCommerce dynamic menus

我有一个基本的WordPress网站,设置了Suffusion主题和WooCommerce插件。这在大多数情况下都很有效,但是当我让人们点击/悬停在“Shop”菜单图标上时,我希望它能够动态地下拉我定义的产品类别。我如何做到这一点?我肯定有关于这个主题的文档,但我不确定要查找什么。我主要是一名系统管理员。