问题描述
是可能的,没有 javascript 黑客?喜欢这个:
<ul class="my_menu">
<li class="first"> ... </li>
<li> ... </li>
<li> ... </li>
<li class"with_sub"> ...
<ul class="my_menu_sub">
<li class="first"> ... </li>
<li> ... </li>
<li> ... </li>
<li class="last"> ... </li>
</ul>
</li>
<li> ... </li>
<li> ... </li>
<li class="last"> ... </li>
</ul>
最佳解决方案
一个更好和更简单的方法:
function add_first_and_last($items) {
$items[1]->classes[] = 'first-menu-item';
$items[count($items)]->classes[] = 'last-menu-item';
return $items;
}
add_filter('wp_nav_menu_objects', 'add_first_and_last');
次佳解决方案
这是一个粗略的代码段,它负责修改菜单输出,并将第一个/最后一个添加到第一个和最后一个类 (外部 ul
在此阶段不被应用,因此不计算) 。注意 – 需要 PHP5 for strripos()
add_filter( 'wp_nav_menu_items', 'first_last_class' );
function first_last_class( $items ) {
$first = strpos( $items, 'class=' );
if( false !== $first )
$items = substr_replace( $items, 'first ', $first+7, 0 );
$last = strripos( $items, 'class=');
if( false !== $last )
$items = substr_replace( $items, 'last ', $last+7, 0 );
return $items;
}
我有点困惑如何使它处理嵌套列表,但它应该让你开始至少。
第三种解决方案
这是一个仅将第一个/最后一个类添加到父菜单项的功能。对于大多数 CSS 样式,这一切都是必要的。
function nav_menu_add_classes( $items, $args ) {
//Add first item class
$items[1]->classes[] = 'menu-item-first';
//Add last item class
$i = count($items);
while($items[$i]->menu_item_parent != 0 && $i > 0) {
$i--;
}
$items[$i]->classes[] = 'menu-item-last';
return $items;
}
add_filter( 'wp_nav_menu_objects', 'nav_menu_add_classes', 10, 2 );
第四种方案
在 wordpress 3 中了解更多关于 new Menus API 的信息。您可以手动给任何元素自己的类。此外,一旦掌握,它使菜单成为一个喜好的编辑。
第五种方案
如果您有嵌套菜单
function add_first_and_last($items) {
// first class on parent most level
$items[1]->classes[] = 'first';
// separate parents and children
$parents = $children = array();
foreach($items as $k => $item){
if($item->menu_item_parent == '0'){
$parents[] = $k;
} else {
$children[$item->menu_item_parent] = $k;
}
}
// last class on parent most level
$last = end(array_keys($parents));
foreach ($parents as $k => $parent) {
if ($k == $last) {
$items[$parent]->classes[] = 'last';
}
}
// last class on children levels
foreach($children as $child){
$items[$child]->classes[] = 'last';
}
// first class on children levels
$r_items = array_reverse($items, true);
foreach($r_items as $k => $item){
if($item->menu_item_parent !== '0'){
$children[$item->menu_item_parent] = $k;
}
}
foreach($children as $child){
$items[$child]->classes[] = 'first';
}
return $items;
}
add_filter('wp_nav_menu_objects', 'add_first_and_last');
我喜欢 Ismaelj 答案的简单性,但是如果你想要 sub-menu 类,需要更多。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。