Wordpress - как узнать, есть ли у пункта меню дочерние элементы?

Я разрабатываю тему wordpress с вложенными подменю. Мне нужно сделать элементы без детей визуально отличными от тех, у которых есть дети. Прямо сейчас у меня есть это меню, но это может измениться:

A
  a1
  a2
B
  b1
  b2
C

Как видите, у A и B есть дети. C - нет - мне нужно, чтобы он отличался на уровне CSS.

В идеале я хотел бы иметь класс has-children в A и B, но не в C.

Пока мне удалось создать PHP-класс «Menu Walker», который Я могу создать экземпляр и перейти к wp_nav_menu . Его конструктор выглядит так:

class My_Walker_Nav_Menu extends Walker_Nav_Menu {
  function start_el(&$output, $item, $depth, $args) {
    ...
    if(??? $item has children???) {
      // I know what to do here
    }
  }
}

Итак, как мне узнать, есть ли у $ item дочерние элементы или это лист?

РЕДАКТИРОВАТЬ: на этот вопрос ответил некто по имени «keesiemeijer» в Wordpress форумы. Я оставляю эту награду просроченной на случай, если он захочет вернуть ее. В противном случае я отмечу свой ответ как действительный.

24
задан kikito 10 December 2012 в 10:24
поделиться

3 ответа

Просто вы используете этот способ:

Объясните: я создаю меню с помощью «Уокер»:

$walker = new Nav_Walker;
wp_nav_menu(array(
        'container'=>'nav',
        'container_class'=>'menu',
        'menu_class'=>'list-unstyled list-inline',
        'walker'=>$walker
    ));

Класс Уокер:

class Nav_Walker extends Walker_Nav_Menu
{ 
      public function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0)
    {
        if($args->walker->has_children)
        {
            //code...
        }   
    }
}

У нас есть объект ' walker ', вы можете var_dump ($ args) увидеть больше вещей. Я использую для своего проекта!

17
ответ дан 28 November 2019 в 22:24
поделиться

Добавьте это в свои functions.php

add_filter('wp_nav_menu_objects', 'menu_has_children', 10, 2);

function menu_has_children($sorted_menu_items, $args) {
    $parents = array();
    foreach ( $sorted_menu_items as $key => $obj )
            $parents[] = $obj->menu_item_parent;
    foreach ($sorted_menu_items as $key => $obj)
        $sorted_menu_items[$key]->has_children = (in_array($obj->ID, $parents)) ? true : false;
    return $sorted_menu_items;
}

. Затем вы можете проверить, является ли $ item-> has_children истинным или ложным

2
ответ дан 28 November 2019 в 22:24
поделиться

Поскольку этот вопрос является одним из первых результатов поиска Google, на него ссылались другие веб-страницы, и большинство ответов здесь устарели, я думал, что выложу этот ответ.

start_el () содержит классов как часть объекта $ item . Таким образом, вы можете добавить это в start_el ():

   if(in_array('menu-item-has-children', $item->classes) && $depth != 0)
   {
       // Your Code
   }

Обратите внимание, что $ глубина не требуется в условиях, но в случае удаления ваш код будет применен к первому элементу (то есть элементу). с 0 глубиной).

Что касается совместимости, класс 'menu-item-has-children' был добавлен в WordPress 3.7 (октябрь 2013 г.) , и я протестировал его на последней WordPress 4.4 (на момент публикации этого ответа).

1
ответ дан 28 November 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: