我有一个循环,仅显示当前页面的所有子页面:
<?php
$args = array(
'parent' => $post->ID,
'post_type' => 'page',
'sort_order' => 'ASC'
);
$pages = get_pages($args); ?>
<?php foreach( $pages as $page ) { ?>
<div>
<p><?php echo $page->post_title; ?></p>
</div>
<?php } ?>
此页面的导航看起来像这样:
Parent Page
- Child page
- Child page
- Child page
- Custom Link (added in appearance > menus)
- Custom link (added in appearance > menus)
- Page which has another parent (added in appearance > menus)
上面的代码正确显示了所有直接子页面,但我希望它显示自定义链接和我添加到菜单下拉菜单中的其他页面。
我曾尝试使用wp_get_nav_menu_items
代替get_pages
并也使用'post_type' => 'page'
,但是我似乎无法正常工作。我可以显示所有页面的完整列表,也可以显示直接子页面。
有人可以告诉我我要去哪里了吗?我看来这应该是一件非常容易的事情...
答案 0 :(得分:0)
好吧,我已经找到了一种方法,可以使用functions.php文件中的自定义walker类来使其工作,如下所示:
class Selective_Walker extends Walker_Nav_Menu
{
function walk( $elements, $max_depth) {
$args = array_slice(func_get_args(), 2);
$output = '';
if ($max_depth < -1) //invalid parameter
return $output;
if (empty($elements)) //nothing to walk
return $output;
$id_field = $this->db_fields['id'];
$parent_field = $this->db_fields['parent'];
// flat display
if ( -1 == $max_depth ) {
$empty_array = array();
foreach ( $elements as $e )
$this->display_element( $e, $empty_array, 1, 0, $args, $output );
return $output;
}
/*
* need to display in hierarchical order
* separate elements into two buckets: top level and children elements
* children_elements is two dimensional array, eg.
* children_elements[10][] contains all sub-elements whose parent is 10.
*/
$top_level_elements = array();
$children_elements = array();
foreach ( $elements as $e) {
if ( 0 == $e->$parent_field )
$top_level_elements[] = $e;
else
$children_elements[ $e->$parent_field ][] = $e;
}
/*
* when none of the elements is top level
* assume the first one must be root of the sub elements
*/
if ( empty($top_level_elements) ) {
$first = array_slice( $elements, 0, 1 );
$root = $first[0];
$top_level_elements = array();
$children_elements = array();
foreach ( $elements as $e) {
if ( $root->$parent_field == $e->$parent_field )
$top_level_elements[] = $e;
else
$children_elements[ $e->$parent_field ][] = $e;
}
}
$current_element_markers = array( 'current-menu-item', 'current-menu-parent', 'current-menu-ancestor' ); //added by continent7
foreach ( $top_level_elements as $e ){ //changed by continent7
// descend only on current tree
$descend_test = array_intersect( $current_element_markers, $e->classes );
if ( !empty( $descend_test ) )
$this->display_element( $e, $children_elements, 2, 0, $args, $output );
}
/*
* if we are displaying all levels, and remaining children_elements is not empty,
* then we got orphans, which should be displayed regardless
*/
/* removed by continent7
if ( ( $max_depth == 0 ) && count( $children_elements ) > 0 ) {
$empty_array = array();
foreach ( $children_elements as $orphans )
foreach( $orphans as $op )
$this->display_element( $op, $empty_array, 1, 0, $args, $output );
}
*/
return $output;
}
}
然后将其用于我的模板页面以简化菜单:
<?php
$menuParameters = array(
'theme_location' =>'primary',
'walker'=>new Selective_Walker()
);
echo wp_nav_menu( $menuParameters );
?>
这有助于显示当前页面标题以及所有子导航项,而不仅仅是页面项。