Получить все элементы подменю и контейнер WordPress - PullRequest
2 голосов
/ 19 февраля 2020

У меня есть следующая структура меню в WordPress:

  • Parent 1
    • Подменю 1
    • Подменю 2
    • Подменю 3
  • Parent 2
    • Подменю 4
    • Подменю 5
  • Parent 3
    • Подменю 6

Я использую фильтр WordPress wp_nav_menu_objects для извлечения всех элементов подменю. Который я должен работать с кодом ниже:

add_filter( 'wp_nav_menu_objects', 'my_wp_nav_menu_objects_sub_menu', 10, 2 );

// filter_hook function to react on sub_menu flag
function my_wp_nav_menu_objects_sub_menu( $sorted_menu_items, $args ) {


  if ( isset( $args->sub_menu ) ) {

    foreach ( $sorted_menu_items as $key => $item ) {

      if ( $item->menu_item_parent == '0' ) { // only get sub-menu items
        unset( $sorted_menu_items[$key] );
      }

    }

    return $sorted_menu_items;

  } else {
    return $sorted_menu_items;
  }
}

Слишком отображать Nav:

wp_nav_menu( array(
    'theme_location' => 'main-menu',
    'menu_id' => 'sub-menus',
    'menu_class'=>'menu',
    'container'=>'ul',
    'sub_menu' => true,
) );

Что приводит к HTML:

<ul>
  <li>Submenu 1</li>
  <li>Submenu 2</li>
  <li>Submenu 3</li>
  <li>Submenu 4</li>
  <li>Submenu 5</li>
  <li>Submenu 6</li>
</ul>

В идеале я хотел бы, чтобы каждая "подгруппа" подменю была в своем собственном <ul> контейнере, но я не могу понять, как это можно сделать. Ниже приведен пример предпочтительного результата.

<ul>
  <ul>
    <li>Submenu 1</li>
    <li>Submenu 2</li>
    <li>Submenu 3</li>
  </ul>
  <ul>
    <li>Submenu 4</li>
    <li>Submenu 5</li>
  </ul>
  <ul>
    <li>Submenu 6</li>
  </ul>
</ul>

Любые советы о том, как подойти к этой проблеме, будут с благодарностью!

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Вы можете добавить еще один параметр в $ args, передаваемый фильтру. В этом случае это будет массив, который будет содержать html. Вы сделали это с помощью $ args -> sub_menu в своем текущем коде, и вы ссылаетесь на него с помощью оператора isset.

0 голосов
/ 24 февраля 2020

Вы не можете вставить html, так как Wordpress обрабатывает результат. Но вы можете вставить некоторый код в for l oop, чтобы создать массив всего html. Затем текст и ссылки для каждой записи могут быть переданы в любой код, с которым вы хотите его обработать.

Таким образом, вы должны заменить оператор unspe c в l oop кодом для построения массива просто html, как в вашем примере желаемого вывода. Вы также создадите новый параметр для обработки этого нового массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...