У меня есть 2 разных дисплея здесь. 1 для мобильного, а другой для настольного компьютера. Мне нужно вывести разные HTML для обоих только для одного пункта меню (последний 1) в меню. Например, с учетом следующей структуры меню:
- 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>
<ul>
<li>Child 4</li>
<li>Child 5</li>
<li>Child 6</li>
</ul>
</li>
</ul>
Последний родительский элемент меню с $depth === 0
нужно разделить пополам на отдельные предметы. Но на мобильном дисплее его не нужно делить пополам, он должен отображаться идеально для мобильного телефона.
Так у меня 2 разных WP_Nav_Walker
продление классов. 1 для Mobile и другой для Desktop, которые обрабатывают меню по-разному, однако проблема, с которой я сталкиваюсь, заключается в том, как получить общее количество элементов подменю. Я понимаю, как узнать, есть ли в меню дети или нет $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 для последнего элемента. Таким образом, было бы полезно узнать, сколько у нас элементов, которые равны $ глубине === 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)
}
Вы можете использовать эту функцию фильтра, чтобы получить два дополнительных свойства _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.
Добавил _
перед новыми свойствами, такими как псевдо-пространство имен, чтобы избежать столкновений с возможными будущими официальными свойствами.
Других решений пока нет …