这是codex中最常用于侧栏菜单的代码。它显示顶级祖先和祖先本身的子页面。
这段代码有一点我想更改——如果没有子级,我不想显示顶级祖先!有一个指向自身的单链接菜单没有多大意义。
如何编辑此代码以实现此目的?我以前也问过类似的问题,但从未得到正确的答案。给出的所有答案还列出了父母子女的子女(第二级子女页面)。
在函数中。php
// Sub-pages menu
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;
}}
称之为:
<ul class="subpages">
<?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()) ); ?>
</ul>
此代码检查页面是否有子级,我很好奇是否可以将其与上面的代码合并以创建正确的代码:
$children = get_pages(\'child_of=\'.$post->ID);?>
if( count( $children ) != 0 ) { show list as normal }
else { show "no parent" text }
最合适的回答,由SO网友:TheDeadMedic 整理而成
就个人而言,我认为这是最简洁、最不密集(数据库查询)的解决方案:
<?php
$parentid = $post->post_parent ? @ array_pop( get_post_ancestors( $post ) ) : $post->ID;
$children = wp_list_pages(
array(
\'child_of\' => $parentid,
\'title_li\' => \'\',
\'echo\' => false,
)
);
if ( $children ) : ?>
<ul class="subpages">
<li><a href="<?php echo get_permalink( $parentid ) ?>"><?php echo get_the_title( $parentid ) ?></a></li>
<?php echo $children ?>
</ul>
<?php else : ?>
Nothing!
<?php endif ?>
SO网友:Howdy_McGee
这可能不是你想要的,但我使用弗兰肯斯坦的方法,它完成了工作:
首先,让我们检查是否需要显示子页面,这将确保此页面具有子页面或是子页面,并且我们不在404页面上-如果为true,我们将获得祖先(父)ID,然后运行两次WP\\U List\\U页面,以便我们在同一列表中显示父和子页面。
<?php if((hasChildren($post->ID) || $post->post_parent) && !is_404()) : $ancestorID = getAncestorID(); ?>
<ul class="subpages">
<?php wp_list_pages(array(\'title_li\' => \'\', \'include\' => $parentID, \'echo\' => 1)); ?>
<?php wp_list_pages(array(\'title_li\' => \'\', \'child_of\' => $parentID, \'echo\' => 1)); ?>
</ul>
<?php endif; ?>
Into your functions.php
File
/** Function to get Ancestor ID **/
function getAncestorID(){
global $post;
$id = $post->ID;
if ($post->post_parent){
$ancestors=get_post_ancestors($post->ID);
$root=count($ancestors)-1;
$id = $ancestors[$root];
}
else if(is_singular(\'post\') || is_archive() || (is_home() && !is_front_page())){
$id = get_option(\'page_for_posts\');
}
return $id;
}
/** Check if page Has Children **/
function hasChildren($pid) {
$children = get_pages(\'child_of=\'.$pid);
if($children)
return true;
else
return false;
}