子导航菜单-调整为在父母、孩子和孙子页面上显示相同的菜单?

时间:2012-10-08 作者:jamie

我在wp codex上发现了这段非常有用的代码,它基本上列出了父、子和孙页面,我在侧边栏中使用它,它对父和子页面效果很好,但是当你转到孙页面时,菜单会发生变化,现在只显示子/孙页面,而不是父和子页面上的相同菜单;子页面。如何使其在所有页面上都显示相同的内容?

此外,我希望家长标题是一个实际的链接,而不仅仅是文本,我似乎无法理解这一点。非常感谢您的帮助!!

            <?php 
                if($post->post_parent) {
                $children = wp_list_pages("title_li=&child_of=".$post->post_parent."&echo=0");
                $titlenamer = get_the_title($post->post_parent) ;
                }

                else {
                $children = wp_list_pages("title_li=&child_of=".$post->ID."&echo=0");
                $titlenamer = get_the_title($post->ID);
                }
                if ($children) { ?>

                <h2> <?php echo $titlenamer; ?> </h2>
                <ul>
                <?php echo $children; ?>
                </ul>
            <?php } ?>

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

我终于弄明白了。我不希望它出现在没有子级的页面上,因此第一个if语句检查并仅在父级有子级时显示菜单。无论您位于父、子或孙页面,此菜单都保持不变。:)

<?php if (  has_children() ) { //makes menu title only show up on pages with descendents ?> 

                    <?php if ( 0 == $post->post_parent ) { //sets parent page title ?>
                        <li>
                            <div class="widget">
                                <h2><?php the_title(); ?></h2>
                    <?php } else { //puts topmost parent page title
                        $parents = get_post_ancestors( $post->ID );
                        echo \'
                        <li>
                            <div class="widget">
                                <h2>\' . apply_filters( "the_title", get_the_title( end ( $parents ) ) ) . \'</h2>\';

                    }?>

                <?php } ?>

                <?php //shows children & grandchildren of page no matter what level you\'re on
                if(!$post->post_parent){
                    // will display the subpages of this top level page
                     $children = wp_list_pages("title_li=&child_of=".$post->ID."&echo=0");
                 } else {

                    if($post->ancestors) {

                        $ancestors = end($post->ancestors);
                        $children = wp_list_pages("title_li=&child_of=".$ancestors."&echo=0");
                     }
                    }

                if ($children) { ?>
                    <ul>
                        <?php echo $children; ?>
                    </ul>
                <?php echo \'</div></li>\'; } ?>

SO网友:Jen

https://gist.github.com/3853924

这是我创建的一个插件,通常用于此类功能。关键是文件底部的一个小函数,用于搜索顶级祖先。当你在博客或搜索页面上时,还有一部分代码可以打印出类别而不是页面;您可以通过注释掉第43行来关闭它。

它将显示任意多个级别的页面层次结构,并且始终显示顶级父页面级别。

您可以通过下载文件、将其添加到插件文件夹并激活来安装它。如果您想在代码中使用它,而不是在小部件区域中使用它,可以执行以下操作:

$nav = new DTW_Navigation_Widget;
$nav->widget();
小部件的相关部分如下:

// Somewhere in your functions file
/** Find the top-level parent of this post */
function my_get_ancestor_id($post) {
    if ( $post->post_parent ) {
        $ancestors = get_post_ancestors($post->ID);
        $root = count($ancestors)-1;
        $parent = get_post($ancestors[$root]);
    } else {
        $parent = $post;
    }
    return $parent->ID;
}
还有这个:

// Also in your functions file
/** Find the top-level parent of this post */
function related_pages() {
    // Where are we?
    global $post;
    $parent_id = my_get_ancestor_id($post);
    $title = get_the_title($parent_id);
    $link =  get_permalink($parent_id); 
    $title = "<a href=\'$link\' title=\'$title\'>$title</a>";

    if (  !empty($parent_id)  ) {
        $args = array(
            \'title_li\' => \'\',
            \'child_of\' => $parent_id,
            \'echo\' => 0,
            \'sort_column\' => \'menu_order\'
        );
        $nav = wp_list_pages($args);
    }
    // Let\'s hide this if there aren\'t any sub-pages or sibling pages... it tends to break.
    if ( !empty($nav) ) {
        echo "<ul id=\\"sidebar-subnav\\">" . $nav  . "</ul>";
    }
}
然后,无论您想在哪里获得子页面/同级页面列表:<?php related_pages(); ?>

SO网友:Rarst

行为改变的原因是因为该代码只检查直接父级。所以它不去寻找孩子的父母。

要遍历整个层次结构,您需要检索和处理它get_post_ancestors().

结束

相关推荐

Order Admin sub-menu items?

我正在使用向CPT管理菜单添加项目add_submenu_page 这很好,但它们被添加到CPT选项后的子菜单底部。我希望能够将它们放在最上面,但我想这个问题也可以应用于订购所有基于管理员的子菜单项。我所尝试的(不起作用,我尝试了几种变体),function custom_menu_order($menu_ord) { if (!$menu_ord) return true; return array( \'edi