我正在为我的wordpress主题添加自定义菜单。我需要在主子菜单关闭之前,将自定义html添加到最后一个子菜单项</ul>
我已经注册了我的新菜单
//functions.php
function register_my_menus() {
register_nav_menus(
array(
\'accessories\' => __( \'Accessories Menu\' )
)
);
}
我在标题中调用了我的新菜单
//header.php
wp_nav_menu( array( \'theme_location\' => \'accessories\',
\'walker\' => BENZ_Walker_Nav_Menu_ACC
) );
我试图修改一个新的Walker,将这个div添加到我的子菜单中,但是这为每个菜单项添加了div
// functions.php ==this adds one div foreach li==comment out
class BENZ_Walker_Nav_Menu_ACC extends Walker_Nav_Menu {
function start_lvl(&$output, $depth) {
$output .= \'<ul class="sub-menu">\';
}
function end_lvl(&$output, $depth) {
//$output .=\'<div>the div that I want to show only once</div></ul>\';
$output .= \'</ul>\';
}
}
}
同样,上面的例子被注释掉了,因为它不适合我的需要
我还尝试使用以下两个eaxmples在菜单末尾添加一些html。。。
//functions.php == this shows custom html after the top-level `<li>`
function BENZ_menu_extras($menu, $args) {
if( \'accessories\' !== $args->theme_location )
return $menu;
return $menu . \'<div>the div that I want to show only once</div>\';
}
add_filter(\'wp_nav_menu_items\',\'BENZ_menu_extras\', 10, 2);
这非常接近,但是我不需要在菜单层次结构的顶层使用html,而是需要更深一层。
我也试过这个例子。。
function add_last_nav_item($items, $args) {
if (!is_admin() && $args->theme_location == \'accessories\') {
$items .= \'<div>the div that I want to show only once</div>\';
}
return $items;
}
add_filter( \'wp_nav_menu_items\', \'add_last_nav_item\', 10, 2 );
但是,这与列出的第一个示例相同。。。
如何将上述函数之一用于$depth
变量将我的div添加到此处。。。。
<div class="accessories menu">
<ul id="menu-accessories" class="menu sf-menu">
<li id="menu-item-1905">
<a class="sf-with-ul" href="http://#">ACCESSORIES</a>
<ul class="sub-menu">
<li id="menu-item-1897">
<a class="sf-with-ul" href="http://#">stuff</a>
<ul class="sub-menu">
<li id="menu-item-1899">stuff1</li>
<li id="menu-item-1898">stuff1</li>
</ul>
</li>
<li id="menu-item-1903">
<a class="sf-with-ul" href="http://#">other stuff</a>
<ul class="sub-menu">
<li id="menu-item-1906">other stuff1</li>
<li id="menu-item-1907">other stuff2</li>
</ul>
</li>
<li id="menu-item-1911">
<a class="sf-with-ul" href="http://#">blue stuff</a>
<ul class="sub-menu">
<li id="menu-item-1912">blue stuff 1</li>
<li id="menu-item-1913">blut stuff 2</li>
</ul>
</li>
<!--This is where i want to put one div so its in the main submenu-->
<div>the div that I want to show only once</div>
</ul>
</li>
</ul>
</div>
https://jsfiddle.net/qpbpofpp/3/
感谢阅读。
--开始编辑--这是我得到的最接近的。。
//functions.php
class BENZ_Walker_Nav_Menu_ACC extends Walker_Nav_Menu {
function start_lvl(&$output, $depth) {
$output .= \'<ul class="sub-menu">\';
}
function end_lvl(&$output, $depth) {
if ($depth = 2){
$output .= \'<div>the div that I want to show only once</div></ul>\';
} else {
$output .= \'</ul>\';
}
}
}
除了在所有三个子菜单之后显示now之外,我只需要它显示一次
SO网友:s_ha_dum
过滤器打开wp_nav_menu_items
应该是这样做的。运行以下命令(直接进入主题header.php
暂时:
function add_last_nav_item($items, $args) {
// if (!is_admin() && $args->theme_location == \'accessories\') {
$items .= \'<div>the div that I want to show only once</div>\';
// }
return $items;
}
add_filter( \'wp_nav_menu_items\', \'add_last_nav_item\', 10, 2 );
wp_nav_menu();
你应该确切地看到你描述的效果。如果您在每个级别都看到了代码输出,那么您的自定义walker可能有问题。如果你
look at the source, 您将看到,在核心中,在“遍历”菜单树之后,该过滤器只应用一次。它不应向菜单中已存在项的末尾添加多个项。
要控制代码的显示级别,最好的方法是使用经过修改的walker:
class BENZ_Walker_Nav_Menu_ACC extends Walker_Nav_Menu {
private $insert = true;
function start_lvl(&$output, $depth) {
$output .= \'<ul class="sub-menu">\';
}
function end_lvl(&$output, $depth) {
if ($depth = 2 && $this->insert === true){
$output .= \'<div>the div that I want to show only once</div></ul>\';
$this->insert = false;
} else {
$output .= \'</ul>\';
}
}
}
wp_nav_menu(array(\'walker\' => new BENZ_Walker_Nav_Menu_ACC));
请注意
$insert
类属性。设置为
false
在第一次插入时,确保它只出现一次。