Wordpress простенький плагин для вывода трехуровневого меню.
Плагин для вывода многоуровневого иерархического меню wordpress
13.09.2019
Все пункты нужного меню получаем используя функцию wp_get_nav_menu_items, в моем силачи нужное меню в системе было с номером 2
Далее по ТЗ работать нужно было только с пунктами вложенными в Услуги (id 3415)
TODO:Есть слабое место, много раз перебирается массив со всеми элементами меню, но, учитывая кэширование, нагрузка создается всего один раз.
Инсталляция:
Копируем файл в /wp-content/plugins/somenu/somenu.php
Дальше активируем его в меню плагинов (/wp-admin/plugins.php):
Код:
<?php /* Plugin Name: Меню Услуги Version: 1.0 Author: Oddler Author URI: https://oddler.ru/ */ class soMenu { protected $_aAllItems = array(); function __construct() { $this->_aAllItems = wp_get_nav_menu_items( 2, array( 'order' => 'DESC' ) ); } function makeTitle($oItem, $level) { $sRet = ''; if ($oItem->url == "#") { $sRet = $oItem->title; } else { $sRet = '<a href="'.$oItem->url.'">'.$oItem->title.'</a>'; } return $sRet; } function getItems($id_parnt) { $aTMP = array(); foreach($this->_aAllItems as $oItem) { if($oItem->menu_item_parent == $id_parnt) { $aTMP[] = $oItem; } } return count($aTMP)?$aTMP:NULL; } } function soMenu_shortcode() { ob_start(); ?> <link rel="stylesheet" type="text/css" href="/wp-content/plugins/somenu/style.css" media="all" /> <div id="somenu" class="container soflex111"> <div> <? $oMenu = new soMenu(); $aLevel1 = $oMenu->getItems(3415); // Услуги $iHalf = round(count($aLevel1) / 2); $i = 0; foreach($aLevel1 as $oItemLv1) { if( $i == $iHalf) { ?> </div><div> <? } ?> <div> <h4 class='av-special-heading-tag '> <?=$oMenu->makeTitle($oItemLv1, 1);?> </h4> <? $aLevel2 = $oMenu->getItems($oItemLv1->ID); if(count($aLevel2)) { ?> <ul class="nolist"> <? foreach($aLevel2 as $oItemLv2) { ?> <li> <b> <span class="iconlist-char " aria-hidden="true" data-av_icon="?" data-av_iconfont="entypo-fontello"></span> <?=$oMenu->makeTitle($oItemLv2, 2);?> </b> <? $aLevel3 = $oMenu->getItems($oItemLv2->ID); if(count($aLevel3)) { ?> <ul> <? foreach($aLevel3 as $oItemLv3) { ?> <li> <?=$oMenu->makeTitle($oItemLv3, 3);?> </li> <? } ?> </ul> <? } ?> </li> <? } ?> </ul> <? } ?> <hr /> </div> <? $i++; } ?> </div> </div> <?php $sRet = ob_get_clean(); return $sRet; } add_shortcode('somenu', 'soMenu_shortcode');
#somenu { max-width: 900px; margin: 0 auto; } .soflex111 { flex-direction: column; display: flex; justify-content: space-between; } .soflex111 > div{ } @media only screen and (min-width: 800px) { .soflex111 { flex-direction: row; } .soflex111 > div:nth-of-type(1) { width: 50%; padding-left: 50px; } } #somenu ul.nolist { margin-left: 0; padding-left: 0; } #somenu .nolist > li { list-style-type: none; } #somenu .special-heading-border { margin-bottom: 20px; margin-top: -20px; } /*.soflex111 > div:nth-of-type(1) { width: 50%; padding-left: 100px; }*/