2015-10-04 71 views
0

我正在使用自定义Walker function来自定义Wordpress中菜单的显示。获取wp_nav_menu元素的兄弟的数量

为了向前迈进一步,我想为超过X个元素的子菜单使用不同的HTML标记。

有没有一种方法可以检查给定项目的元素数量start_el函数中的沃克Walker_Nav_Menu

+0

我认为你将不得不这样做与jQuery – mdarmanin

回答

2

它不使用沃克类最简单的事情,所以我想到了一个解决方案的使用DOMDocument解析菜单HTML和菜单已建成之后算子菜单儿童(使用wp_nav_menu_{$menu->slug}_items过滤器):

add_filter('wp_nav_menu_{MENU_SLUG}_items', function($items, $args) { 

    $dom = new DOMDocument(); 
    $dom->loadHTML($items); 

    // get the .sub-menu elements 
    $submenus = $dom->getElementsByTagName('ul'); 

    // for each one if it has children add a class 
    // like has-{num}-children 
    foreach ($submenus as $ul) { 
     if($ul->hasChildNodes()) { 
      // number of child nodes divided by 2 
      // to exclude the text nodes 
      $numChildren = $ul->childNodes->length/2; 
      $class = "has-$numChildren-children"; 
      $ul->setAttribute(
       'class', $ul->getAttribute('class') . ' ' . $class 
      ); 
     } 
    } 

    // save the changes 
    $html = $dom->saveHtml($dom->documentElement); 
    // remove html and body tags added by $dom->loadHTML 
    $items = preg_replace('~</?(html|body)>~', '', $html); 

    return $items; 

}, 10, 2); 

这应该添加一个类has-{num}-children与每个子菜单与儿童(其中{num}是儿童的人数),以便您可以针对任何你想要的。

它可以很容易地更改为仅适用于具有最少子女人数的子菜单。

记得用你的菜单slu change更改{MENU_SLUG}

+0

有趣的方法。你以后如何在Walker上课以获得兄弟姐妹的数量?添加一个'data-siblings'属性不是更容易吗? – Alvaro

+0

您无法访问Walker中的类,因为此时Walker已经完成:我正在处理Walker生成的HTML。在这种情况下,如果要更改子菜单HTML标记的其他部分(如添加元素),可以通过更改dom文档来完成。 – d79

+0

嗯...这远非理想。在这种情况下,我甚至不需要过滤器。我可以直接使用jQuery。 – Alvaro