Я разрабатываю тему 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 форумы. Я оставляю эту награду просроченной на случай, если он захочет вернуть ее. В противном случае я отмечу свой ответ как действительный.
Просто вы используете этот способ:
Объясните: я создаю меню с помощью «Уокер»:
$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) увидеть больше вещей. Я использую для своего проекта!
Добавьте это в свои 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 истинным или ложным
Поскольку этот вопрос является одним из первых результатов поиска 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 (на момент публикации этого ответа).