将自定义html添加到最后一个子菜单项

时间:2015-12-16 作者:RobBenz

我正在为我的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之外,我只需要它显示一次

2 个回复
最合适的回答,由SO网友:Howdy_McGee 整理而成

好的,结果是默认情况下,$depthend_lvl() 作用starts at 当它是一个子菜单时为0,并且随着深度的增加而增加。所以我们需要测试一下{$depth} 等于0以仅将其应用于第一组子菜单:

function end_lvl( &$output, $depth, $args ) {
    if( 0 == $depth ) {
        $output .= \'<div>the div that I want to show only once</div>\';
    }

    $indent = str_repeat( "\\t", $depth );
    $output .= "{$indent}</ul>\\n";
}

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 在第一次插入时,确保它只出现一次。

相关推荐

Making sub-menus exclusive

我真的不知道该怎么解释我在这里找的东西,我在这里找得太露骨了。在我的网站上,我有一个附带菜单,其中包含一系列子类别,每个子类别中都有一些项目。我想知道当我打开另一个子类别时,是否有办法关闭所有其他打开的子类别,例如:1. Animals ----A. Cats ----B. Dogs 2. People ----A. Samantha ----B. Daniel 当我按下“动物”时,我希望“人”关闭,反之亦