Плагин для вывода многоуровневого иерархического меню wordpress

13.09.2019

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

pic1

Все пункты нужного меню получаем используя функцию wp_get_nav_menu_items, в моем силачи нужное меню в системе было с номером 2

Далее по ТЗ работать нужно было только с пунктами вложенными в Услуги (id 3415)

TODO:Есть слабое место, много раз перебирается массив со всеми элементами меню, но, учитывая кэширование, нагрузка создается всего один раз.

Инсталляция:

Копируем файл в /wp-content/plugins/somenu/somenu.php

Дальше активируем его в меню плагинов (/wp-admin/plugins.php):

pic1

Код:

 
<?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;
}*/


Категории: Web, WordPress
Яндекс.Метрика