2016-07-21 1 views
0

У меня здесь два разных дисплея. 1 для мобильных устройств, а другой для рабочего стола. Мне нужно вывести другой html для обоих только для 1 пункта меню (последний 1) в меню. Например, учитывая следующую структуру меню:WP_Nav_Walker расширяется, нужно знать количество элементов подменю

- Menu Item 1 
-- Child 1 
-- Child 2 
-- Child 3 
- Menu Item 2 
-- Child 1 
-- Child 2 
-- Child 3 
-- Child 4 
- Menu Item 3 
-- Child 1 
-- Child 2 
-- Child 3 
-- Child 4 
-- Child 5 
-- Child 6 

Мне нужно, чтобы иметь возможность вывести следующую структуру для рабочего стола:

<ul> 
    <li>Menu Item 1 
    <ul> 
     <li>Child 1</li> 
     <li>Child 2</li> 
     <li>Child 3</li> 
    </ul> 
    </li> 
    <li>Menu Item 2 
    <ul> 
     <li>Child 1</li> 
     <li>Child 2</li> 
     <li>Child 3</li> 
     <li>Child 4</li> 
    </ul> 
    </li> 
    <li>Menu Item 3 
    <ul> 
     <li>Child 1</li> 
     <li>Child 2</li> 
     <li>Child 3</li> 
    </ul> 
    </li> 
    <li>&nbsp; 
    <ul> 
     <li>Child 4</li> 
     <li>Child 5</li> 
     <li>Child 6</li> 
    </ul> 
    </li> 
</ul> 

Последний пункт родительское меню с $depth === 0 необходимо разбить пополам в отдельные предметы. Но на мобильном дисплее его не нужно разделить пополам, он должен идеально отображаться для мобильных устройств.

Итак, у меня есть 2 разных класса WP_Nav_Walker. 1 для мобильных устройств, а другой для настольных ПК, которые обрабатывают меню по-разному, однако проблема, с которой я столкнулась, заключается в том, как получить общее количество элементов подменю. Я понимаю, как узнать, есть ли в меню дети или нет $args->has_children, но как получить общее количество детей?

Я создал переменную знать, какие подменю пункт я на в end_el функции:

class Custom_Nav_Walker extends Walker_Nav_Menu { 

    function __construct() { 
     $this->boxitem_index = 0; 
    } 

    public function start_lvl(&$output, $depth = 0, $args = array()) 
    { 
     if ($depth === 0 && $this->menu_type == 'header') 
     { 
      echo '<pre>', var_dump($item), '</pre>'; 
     } 
    } 
} 

Я также установить пользовательское свойство menu_type, который получает набор в функции start_el что присоединяется к последнему меню здесь, поэтому я могу знать, что это меню, которое я хочу.

В принципе, мне нужно разделить его пополам, а не на 3, но я не знаю, что такое половина. И, конечно, я не хочу выполнять оператор if в последнем элементе. Таким образом, это поможет узнать, сколько у нас элементов, которые составляют $ depth === 1 для последнего родительского меню. Это возможно?

Выход я для $item это:

object(WP_Post)#723 (40) { 
    ["ID"]=> 
    int(73) 
    ["post_author"]=> 
    string(1) "1" 
    ["post_date"]=> 
    string(19) "2016-07-14 18:09:44" 
    ["post_date_gmt"]=> 
    string(19) "2016-07-14 18:09:44" 
    ["post_content"]=> 
    string(0) "" 
    ["post_title"]=> 
    string(11) "Quick Links" 
    ["post_excerpt"]=> 
    string(0) "" 
    ["post_status"]=> 
    string(7) "publish" 
    ["comment_status"]=> 
    string(6) "closed" 
    ["ping_status"]=> 
    string(6) "closed" 
    ["post_password"]=> 
    string(0) "" 
    ["post_name"]=> 
    string(13) "quick-links-3" 
    ["to_ping"]=> 
    string(0) "" 
    ["pinged"]=> 
    string(0) "" 
    ["post_modified"]=> 
    string(19) "2016-07-21 17:12:08" 
    ["post_modified_gmt"]=> 
    string(19) "2016-07-21 17:12:08" 
    ["post_content_filtered"]=> 
    string(0) "" 
    ["post_parent"]=> 
    int(0) 
    ["guid"]=> 
    string(30) "http://0b90b21a.ngrok.io/?p=73" 
    ["menu_order"]=> 
    int(12) 
    ["post_type"]=> 
    string(13) "nav_menu_item" 
    ["post_mime_type"]=> 
    string(0) "" 
    ["comment_count"]=> 
    string(1) "0" 
    ["filter"]=> 
    string(3) "raw" 
    ["db_id"]=> 
    int(73) 
    ["menu_item_parent"]=> 
    string(1) "0" 
    ["object_id"]=> 
    string(2) "73" 
    ["object"]=> 
    string(6) "custom" 
    ["type"]=> 
    string(6) "custom" 
    ["type_label"]=> 
    string(11) "Custom Link" 
    ["title"]=> 
    string(11) "Quick Links" 
    ["url"]=> 
    string(0) "" 
    ["target"]=> 
    string(0) "" 
    ["attr_title"]=> 
    string(0) "" 
    ["description"]=> 
    string(0) "" 
    ["classes"]=> 
    array(5) { 
    [0]=> 
    string(0) "" 
    [1]=> 
    string(9) "menu-item" 
    [2]=> 
    string(21) "menu-item-type-custom" 
    [3]=> 
    string(23) "menu-item-object-custom" 
    [4]=> 
    string(22) "menu-item-has-children" 
    } 
    ["xfn"]=> 
    string(0) "" 
    ["current"]=> 
    bool(false) 
    ["current_item_ancestor"]=> 
    bool(false) 
    ["current_item_parent"]=> 
    bool(false) 
} 
+0

_ «Последний элемент родительского меню с глубиной $ == должен быть разделен пополам на отдельные элементы» _ - почему? Пожалуйста, объясните, что вы на самом деле пытаетесь выполнить. Могут быть и другие варианты, которые не создают субоптимальную структуру HTML и используют CSS для достижения желаемого эффекта. – CBroe

+0

Я разделяю столбцы для дисплеев рабочего стола. Это единственный способ поддержать IE8, поскольку сайт уже делает. Я объединяю сайт из ASP.NET (используя Umbraco CMS) в PHP (используя Wordpress) и должен поддерживать эту структуру HTML по причинам совместимости. –

+0

Вы посмотрели, что содержит структура данных $ item в этой точке? – CBroe

ответ

3

Вы можете использовать эту функцию фильтра, чтобы получить два дополнительных свойства _children_count и _parent_children_count по каждому пункту, который позже можно оценить в меню ходок:

function my_wp_nav_menu_objects_filter($sorted_menu_items) { 
    foreach($sorted_menu_items as &$item) { 
     $item->_children_count = 0; 
     for($i=1, $l=count($sorted_menu_items); $i<=$l; ++$i) { 
      if($sorted_menu_items[$i]->menu_item_parent == $item->ID) { 
       $item->_children_count++; 
      } 
     }   
    } 
    foreach($sorted_menu_items as &$item) { 
     $item->_parent_children_count = 0; 
     for($i=1, $l=count($sorted_menu_items); $i<=$l; ++$i) { 
      if($item->menu_item_parent == $sorted_menu_items[$i]->ID) { 
       $item->_parent_children_count = $sorted_menu_items[$i]->_children_count; 
       break;      
      } 
     } 
    } 
    unset($item); 
    return $sorted_menu_items;  
} 
add_filter('wp_nav_menu_objects', 'my_wp_nav_menu_objects_filter'); 

достаточно Жутко, это выглядит как $ sorted_menu_items массив численно индексированные , начиная с 1.
Добавил _ перед новыми объектами в качестве псевдо-имен, чтобы избежать столкновений с возможными будущими официальными свойствами.

+0

Спасибо, это было очень полезно. –

Смежные вопросы