Как обернуть список пользовательским классом, используя wp_nav_menu?

Вопрос или проблема

Я хочу отобразить меню в подвале с 4 колонками. Но когда я добавляю новое меню, функция wp_nav_menu создает элемент <li> и добавляет в него все элементы меню.

вставьте описание изображения здесь

Теперь, как я могу обернуть каждый элемент li в пользовательский тег div с классом?

Мне нужен этот вывод:

вставьте описание изображения здесь

На изображении выше вы можете видеть, что каждое меню обернуто в div.

Я пробовал с wp_nav_menu(), но это не помогает. Поскольку я новичок в разработке тем для WordPress, я не знаю других вариантов.

Есть ли способ сказать WordPress добавить элемент div с пользовательским классом перед каждым элементом меню?

Спасибо 🙂

Лучше всего пройтись по всем элементам меню, чтобы получить их по отдельности, так. Это даст вам возможность добавлять классы как к ul, так и к элементам li.

    <?php $myMenu = get_nav_menu_locations();

// 'main-menu' - это имя вашего меню, вы можете найти его в разделе 'меню' на панели управления вашего сайта WordPress
$menuID = $myMenu['main-menu'];

$mainNav = wp_get_nav_menu_items($menuID);

?>
<ul>
    <?php foreach ($mainNav as $navItem): ?>

        <li>
            <a href="https://wordpress.stackexchange.com/questions/288486/<?php echo $navItem->url; ?>"
              title="<?php echo $navItem->title; ?>">
              <?php echo $navItem->title; ?>
          </a>
      </li>
  <?php endforeach; ?>
</ul>

Возможно, используйте nav_walker или фильтр на wp_nav_menu_objects

Вот простой nav_walker, который, когда выводится с помощью wp_nav_menu, обернет содержимое каждой ссылки в меню в элемент span

<?php
/**
 * Add_Span_Nav_Walker
 * класс walker для wp_nav_menu, который оборачивает содержимое каждой ссылки элемента меню в элемент span
 */

class Add_Span_Nav_Walker extends Walker_Nav_Menu {

    function start_lvl( &$output, $depth = 0, $args = [] ) {
        $indent = str_repeat( "\t", $depth );
        $output .= "\n$indent\n";
    }

    function end_lvl( &$output, $depth = 0, $args = [] ) {
        $indent = str_repeat( "\t", $depth );
        $output .= "$indent\n";
    }

    function start_el( &$output, $item, $depth = 0, $args = [], $id = 0 ) {
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        $class_names = $value="";

        $classes   = empty( $item->classes ) ? [] : (array) $item->classes;
        $classes[] = 'menu-item-' . $item->ID;

        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );

        $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';

        $id = apply_filters( 'nav_menu_item_id', 'menu-item-' . $item->ID, $item, $args );
        $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';

        $output .= $indent . '';

        $attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) . '"' : '';
        $attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) . '"' : '';
        $attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) . '"' : '';
        $attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) . '"' : '';

        $item_output = $args->before;
        $item_output .= '<li' . $class_names . '><a' . $attributes . '><span>';
        $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
        $item_output .= '</span></a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    }

    function end_el( &$output, $item, $depth = 0, $args = [] ) {
        $output .= "\n";
    }
}

Когда мы выводим наше nav_menu в теме, мы можем использовать Add_Span_Nav_Walker как класс walker:

<?php
if ( has_nav_menu( 'wpse288486_nav' ) ) :
    wp_nav_menu( [
        'theme_location' => 'wpse288486_nav',
        'walker'         => new Add_Span_Nav_Walker(),
    ] );
endif;

Ответ или решение

Для того чтобы обернуть каждый элемент списка на вашем меню WordPress в отдельный тег <div> с заданным классом, вы можете воспользоваться пользовательским классом Walker, который позволяет модифицировать вывод wp_nav_menu. Мы рассмотрим шаги, необходимые для создания такого решения.

Шаг 1: Создание пользовательского класса Walker

Вам нужно создать класс, который будет расширять функциональность стандартного Walker_Nav_Menu. Внутри этого класса вы сможете переопределить метод, который отвечает за вывод каждого элемента меню.

Вот пример, как это можно реализовать:

class Custom_Div_Nav_Walker extends Walker_Nav_Menu {

    function start_el(&$output, $item, $depth = 0, $args = [], $id = 0) {
        $indent = ($depth) ? str_repeat("\t", $depth) : '';

        // Получаем классы меню
        $classes = empty($item->classes) ? [] : (array) $item->classes;
        $classes[] = 'menu-item-' . $item->ID;

        // Применяем фильтры для классов
        $class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item, $args));
        $class_names = $class_names ? ' class="' . esc_attr($class_names) . '"' : '';

        // Начало элемента
        $output .= $indent . '<div class="custom-class"' . $class_names . '>';

        // Собираем атрибуты элемента
        $attributes = !empty($item->attr_title) ? ' title="' . esc_attr($item->attr_title) . '"' : '';
        $attributes .= !empty($item->target) ? ' target="' . esc_attr($item->target) . '"' : '';
        $attributes .= !empty($item->xfn) ? ' rel="' . esc_attr($item->xfn) . '"' : '';
        $attributes .= !empty($item->url) ? ' href="' . esc_attr($item->url) . '"' : '';

        // Сбор информации для вывода
        $item_output = '<a' . $attributes . '>' . apply_filters('the_title', $item->title, $item->ID) . '</a>';
        $output .= $item_output . '</div>';
    }

    function end_el(&$output, $item, $depth = 0, $args = []) {
        // Здесь можно добавить закрывающие теги, если это необходимо
    }
}

Шаг 2: Использование вашего класса для вывода меню

Теперь, когда вы создали класс для обертывания элементов меню, вы можете его использовать при выводе вашего меню. Вам нужно будет передать этот класс в параметре walker функции wp_nav_menu().

if (has_nav_menu('footer-menu')) {
    wp_nav_menu(array(
        'theme_location' => 'footer-menu',
        'walker' => new Custom_Div_Nav_Walker(),
    ));
}

Примечания

  1. Стилизация: Не забудьте добавить соответствующие стили для .custom-class, чтобы ваше меню выглядело так, как вы хотите.

  2. Изменение расположения меню: Параметр 'theme_location' должен соответствовать местоположению, которое вы зарегистрировали в вашей теме через функцию register_nav_menus(). Убедитесь, что это правильное название.

  3. Локализация: Если ваш сайт многоязычный, рекомендуется добавить поддержку перевода с помощью функции __() или _e().

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

Таким образом, вы сможете создать меню, в котором каждый элемент будет заключен в отдельный <div> с вашим классом, поддерживая гибкость и простоту стилизации.

Оцените материал
Добавить комментарий

Капча загружается...