Intereting Posts
Изменения в структуре permalink приводят к ошибке 404 для всех страниц, кроме дома Тема Dashicons не отображается Сохранение данных для разных пользовательских сообщений Удалить wp_add_inline_style Как правильно вставить таблицу стилей в wp_head борется с синтаксисом для the_post_thumbnail (); Есть ли способ избежать использования add_image_size? Лучший способ управления изображениями Как отобразить количество отображаемых продуктов из суммы в категории – WordPress / Woocommerce Добавить html слово перед категорией Проблема при обновлении url при использовании запроса на обновление WordPress пользовательское правило перезаписи htaccess для страницы remove_action условно для пользовательского типа сообщения – не работает Как добавить настраиваемый обмен на экран администратора управления меню? Как передать идентификатор сообщения на URL-адрес страницы? Ошибка загрузки файла в галерее после перемещения сервера

Добавить пользовательский html в последний элемент подменю

Я добавляю пользовательское меню к теме WordPress. Мне нужно добавить пользовательский html в конечный элемент подменю – до того, как основное подменю закрывается </ul>

Я зарегистрировал свое новое меню

 //functions.php function register_my_menus() { register_nav_menus( array( 'accessories' => __( 'Accessories Menu' ) ) ); } 

и я назвал свое новое меню в своем заголовке

 //header.php wp_nav_menu( array( 'theme_location' => 'accessories', 'walker' => BENZ_Walker_Nav_Menu_ACC ) ); 

Я попытался изменить новый Уокер, чтобы добавить этот div в мое подменю, однако это добавило div для каждого пункта меню

 // functions.php ==this adds one div foreach li==comment out class BENZ_Walker_Nav_Menu_ACC extends Walker_Nav_Menu { function start_lvl(&$output, $depth) { $output .= '<ul class="sub-menu">'; } function end_lvl(&$output, $depth) { //$output .='<div>the div that I want to show only once</div></ul>'; $output .= '</ul>'; } } } 

Снова приведенный выше пример закомментирован, потому что он не работает для моих нужд

Я также попытался добавить append некоторые html в конце меню со следующими двумя eaxmples …

 //functions.php == this shows custom html after the top-level `<li>` function BENZ_menu_extras($menu, $args) { if( 'accessories' !== $args->theme_location ) return $menu; return $menu . '<div>the div that I want to show only once</div>'; } add_filter('wp_nav_menu_items','BENZ_menu_extras', 10, 2); 

это очень близко, но мне не нужен html в верхнем уровне иерархии в меню, но на одном уровне глубже.

Я также пробовал этот пример.

 function add_last_nav_item($items, $args) { if (!is_admin() && $args->theme_location == 'accessories') { $items .= '<div>the div that I want to show only once</div>'; } return $items; } add_filter( 'wp_nav_menu_items', 'add_last_nav_item', 10, 2 ); 

однако это делает то же самое, что и первый пример, указанный …

Как мы можем использовать любую из вышеперечисленных функций с переменной $depth чтобы добавить мой div здесь ….

 <div class="accessories menu"> <ul id="menu-accessories" class="menu sf-menu"> <li id="menu-item-1905"> <a class="sf-with-ul" href="http://#">ACCESSORIES</a> <ul class="sub-menu"> <li id="menu-item-1897"> <a class="sf-with-ul" href="http://#">stuff</a> <ul class="sub-menu"> <li id="menu-item-1899">stuff1</li> <li id="menu-item-1898">stuff1</li> </ul> </li> <li id="menu-item-1903"> <a class="sf-with-ul" href="http://#">other stuff</a> <ul class="sub-menu"> <li id="menu-item-1906">other stuff1</li> <li id="menu-item-1907">other stuff2</li> </ul> </li> <li id="menu-item-1911"> <a class="sf-with-ul" href="http://#">blue stuff</a> <ul class="sub-menu"> <li id="menu-item-1912">blue stuff 1</li> <li id="menu-item-1913">blut stuff 2</li> </ul> </li> <!--This is where i want to put one div so its in the main submenu--> <div>the div that I want to show only once</div> </ul> </li> </ul> </div> 

https://jsfiddle.net/qpbpofpp/3/

Спасибо за прочтение.

–BEGIN EDIT – Это самое близкое, что я получил ..

  //functions.php class BENZ_Walker_Nav_Menu_ACC extends Walker_Nav_Menu { function start_lvl(&$output, $depth) { $output .= '<ul class="sub-menu">'; } function end_lvl(&$output, $depth) { if ($depth = 2){ $output .= '<div>the div that I want to show only once</div></ul>'; } else { $output .= '</ul>'; } } } 

за исключением того, что теперь отображается после всех трех подменю, мне просто нужно это показать один раз

Итак, получается, что по умолчанию функция $depth в функции end_lvl() начинается с 0, когда она является подменю и увеличивается с увеличением глубины. Поэтому нам нужно проверить, если {$depth} равна 0, чтобы применить его только к первому набору подменю:

 function end_lvl( &$output, $depth, $args ) { if( 0 == $depth ) { $output .= '<div>the div that I want to show only once</div>'; } $indent = str_repeat( "\t", $depth ); $output .= "{$indent}</ul>\n"; } 

Фильтр на wp_nav_menu_items должен быть способ сделать это. Выполните следующее (просто взломайте тему header.php временно:

 function add_last_nav_item($items, $args) { // if (!is_admin() && $args->theme_location == 'accessories') { $items .= '<div>the div that I want to show only once</div>'; // } return $items; } add_filter( 'wp_nav_menu_items', 'add_last_nav_item', 10, 2 ); wp_nav_menu(); 

Вы должны точно увидеть эффект, который вы описываете. Если вы видите, что вывод кода на каждом уровне, что-то не так, возможно, с вашим пользовательским ходоком. Если вы посмотрите на источник , вы увидите, что в Core этот фильтр применяется один раз после того, как дерево меню было «пройдено». Он не должен добавлять больше одного элемента в конец уже существующих элементов меню.

Чтобы контролировать, на каком уровне отображается ваш код, измененный ходок будет лучшим подходом:

 class BENZ_Walker_Nav_Menu_ACC extends Walker_Nav_Menu { private $insert = true; function start_lvl(&$output, $depth) { $output .= '<ul class="sub-menu">'; } function end_lvl(&$output, $depth) { if ($depth = 2 && $this->insert === true){ $output .= '<div>the div that I want to show only once</div></ul>'; $this->insert = false; } else { $output .= '</ul>'; } } } wp_nav_menu(array('walker' => new BENZ_Walker_Nav_Menu_ACC)); 

Обратите внимание на свойство $insert class. Для первой вставки установлено значение false чтобы убедиться, что оно появляется только один раз.