2015-10-04 70 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