Hide Parent if No Children

时间:2013-05-18 作者:AndrettiMilas

codex提供了一种显示子页面和父页面的方式,以用作子菜单。但是,即使父页面没有子页面,此代码也会在列表中显示父页面。如何修改此代码,使其仅在父级具有页面时显示?

功能。php

if(!function_exists(\'get_post_top_ancestor_id\')){
/**
 * Gets the id of the topmost ancestor of the current page. Returns the current
 * page\'s id if there is no parent.
 * 
 * @uses object $post
 * @return int 
 */
function get_post_top_ancestor_id(){
    global $post;

    if($post->post_parent){
        $ancestors = array_reverse(get_post_ancestors($post->ID));
        return $ancestors[0];
    }

    return $post->ID;
}}
称之为:

<?php wp_list_pages( array(\'title_li\'=>\'\',\'include\'=>get_post_top_ancestor_id()) ); ?>
<?php wp_list_pages( array(\'title_li\'=>\'\',\'depth\'=>1,\'child_of\'=>get_post_top_ancestor_id()) ); ?>

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

<?php     
    if ($post->post_parent) { //We are a child, print out sub menu
            wp_list_pages( array(\'title_li\'=>\'\',\'include\'=>$post->post_parent) );
            wp_list_pages( array(\'title_li\'=>\'\',\'depth\'=>1,\'child_of\'=>$post->post_parent) );
    }

//We are not a child but do we have children
$children = wp_list_pages(array(\'child_of\' => $post->ID, \'echo\' => 0));

if ( !empty($children) ) {
    //If so print out the sub menu
    wp_list_pages( array(\'title_li\'=>\'\',\'include\'=>$post->ID) );
    wp_list_pages( array(\'title_li\'=>\'\',\'depth\'=>1,\'child_of\'=>$post->ID) );
} 
//Not a child and not a parent so show nothing and continue 
?>
我对此进行了测试,正如您所提到的那样,我无法理解该函数,但也许有人可以使用该函数发布更好的解决方案。

SO网友:eselk

我采取了不同的方法,并用CSS解决了这个问题。可能没有那么强大,但为了在需要时快速修复,我使用了以下内容:

html .main-navigation li.menu-item-263{
    display: none;
}
html .main-navigation li.menu-item-263.menu-item-has-children{
    display: inline-block;
}
菜单项263是我的父菜单项,有时没有子菜单项(针对由于无法访问子页面而未登录的非成员)。我想如果我的菜单ID发生变化,它就会中断,我必须重复CSS来处理其他菜单。。。所以不完美,但快速简单,不太可能破坏任何东西或需要大量重新测试。

现在,对于阅读本文的非开发人员来说,显而易见的是:

我将以上内容置于我的主题风格中。css文件。要获取菜单项ID,我只需在FireFox中右键单击它并选择“inspect element”--ID将位于菜单元素的类中。上述代码的前3行隐藏了具有该ID的菜单项,如果设置了“菜单项有子项”类(仅当它有子项时),则最后3行覆盖(显示它)。

SO网友:ian

此解决方案由MichaelH编写,链接如下:http://wordpress.org/support/topic/how-to-only-list-pages-if-they-have-no-children.

这不使用列表页面,而是使用get\\u页面,因此它可能不是百分之百相关的。我稍微修改了这段代码,在“empty”之前添加了一个感叹号。您可以将其删除以查看其工作情况。

<?php
//get all \'first level\' pages, then iterate through those results,
//then for each result, see if there are child pages, and if there
//are no child pages for that page, then display
$pages = get_pages(\'parent=0\');
foreach ($pages as $page) {
  $child = get_pages(\'child_of=\'.$page->ID);
  if (!empty($child)) {
    ?>
    <li><a href="<?php echo get_page_link($page->ID) ?>"><?php echo $page->post_title;?></a></li>
    <?php
  }
}
?>

结束

相关推荐