我对@MattKey的答案投了赞成票,因为后端可配置菜单系统是处理此类问题的好方法,并且还可以使菜单在后端保持可编辑状态。
然而这个答案并不能直接回答您将如何仅基于页面结构来实现这一点的问题。我想到的答案是为wp_list_pages
.
class No_Top_Link_Walker extends Walker_Page {
static $parent = false;
function start_lvl( &$output, $depth = 0, $args = array() ) {
$indent = str_repeat("\\t", $depth);
$output .= "\\n$indent%s<ul class=\'children\'>\\n";
}
function start_el( &$output, $page, $depth, $args, $current_page = 0 ) {
if ( $depth ) {
$indent = str_repeat("\\t", $depth);
} else {
$indent = \'\';
}
extract($args, EXTR_SKIP);
$css_class = array(\'page_item\', \'page-item-\'.$page->ID);
if ( !empty($current_page) ) {
$_current_page = get_post( $current_page );
if ( in_array( $page->ID, $_current_page->ancestors ) )
$css_class[] = \'current_page_ancestor\';
if ( $page->ID == $current_page )
$css_class[] = \'current_page_item\';
elseif ( $_current_page && $page->ID == $_current_page->post_parent )
$css_class[] = \'current_page_parent\';
} elseif ( $page->ID == get_option(\'page_for_posts\') ) {
$css_class[] = \'current_page_parent\';
}
$css_class = implode( \' \', apply_filters( \'page_css_class\', $css_class, $page, $depth, $args, $current_page ) );
$href = (0 === $depth && $args[\'has_children\']) ? \'%s\' : get_permalink($page->ID);
$tli = \'\';
if (false !== static::$parent) {
$tli = sprintf(static::$parent,get_permalink($page->ID));
static::$parent = false;
}
$output = sprintf($output,$tli);
$li = $indent . \'<li class="\' . $css_class . \'"><a href="\' . $href . \'">\' . $link_before . apply_filters( \'the_title\', $page->post_title, $page->ID ) . $link_after . \'</a>\';
if ( !empty($show_date) ) {
if ( \'modified\' == $show_date )
$time = $page->post_modified;
else
$time = $page->post_date;
$li .= " " . mysql2date($date_format, $time);
}
if (0 === $depth && $args[\'has_children\']) {
static::$parent = $li;
} else {
$output .= $li;
}
}
function end_el( &$output, $page, $depth = 0, $args = array() ) {
if (false === static::$parent) {
$output .= "</li>\\n";
}
}
}
$args = array(
\'walker\' => new No_Top_Link_Walker,
\'title_li\' => \'Pages\'
);
echo \'<ul>\';
wp_list_pages($args);
echo \'</ul>\';
助行器伸出
Walker_Page
并替换了几种方法。上面的代码本质上是walker的
methods 除了我在哪里做的更改,不包括一些琐碎的格式和语法更改。
walker在到达那里之前不知道子URL是什么,所以我保存了没有子菜单的顶级菜单的标记,并在开始为子菜单添加标记之前插入了它们。
我在开发过程中对它进行了一点测试,它似乎在验证程序中工作。w3。org给它一个“绿色”。然而,没有承诺。我只是编出来的。