Wordpress простенький плагин для вывода трехуровневого меню.

Все пункты нужного меню получаем используя функцию 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;
}*/