Добавьте выпадающее меню, используя “add_filter => wp_nav_menu_items”

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

Мой проект: WordPress, Woocommerce, Bootstrap 4, bs4navwalker

Моя проблема: пользовательский элемент выпадающего списка, добавленный фильтром WP. У меня есть одна навигационная панель, 3 различных меню внутри (используя bs4navwalker), значок для корзины и форма поиска. Смотрите код.

Я использую фильтр (add_filter( ‘wp_nav_menu_items’,) для добавления деталей логина, логаута и моего аккаунта в навигационную панель, все в порядке, но я хотел бы добавить эти элементы внутрь выпадающего списка. Фильтр просто создает один или два дополнительных элемента в меню ‘пользователь’.

Я понимаю, что это происходит, потому что я добавляю <li>, но я не смог понять, как добавить весь код, необходимый bootstrap для управления выпадающим списком.

Это возможно?

front-page.php КОД

<div class="nav-custom">
  <div class="container">

      <nav class="navbar-nav navbar-toggleable-sm navbar-inverse">

        <a class="navbar-brand" href="<?php echo get_home_url(); ?>">
              <img src="<?php bloginfo('template_url'); ?>/img/logo.png" class="d-inline-block align-top" alt="">
        </a>

           <?php
           wp_nav_menu([
             'menu'            => 'top',
             'theme_location'  => 'top',
             'container'       => false,
             'container_id'    => 'bs4navbar',
             'container_class' => 'collapse navbar-collapse',
             'menu_id'         => false,
             'menu_class'      => 'navbar-nav mr-auto no-md-view',
             'depth'           => 2,
             'fallback_cb'     => 'bs4navwalker::fallback',
             'walker'          => new bs4navwalker()
           ]);

          ?>

        <!-- Форма поиска -->
        <?php get_product_search_form(); ?>

        <!-- Пользовательское меню -->
        <?php 
          wp_nav_menu([
           'menu'            => 'user',
           'theme_location'  => 'user',
           'container'       => false,
           //'container_id'    => 'bs4navbar',
           //'container_class' => 'collapse navbar-collapse',
           'menu_id'         => false,
           'menu_class'      => 'navbar-nav mr-auto no-md-view',
           'depth'           => 2,
           'fallback_cb'     => 'bs4navwalker::fallback',
           'walker'          => new bs4navwalker()
         ]);
        ?>

        <!-- Меню корзины -->
        <?php 
          wp_nav_menu([
           'menu'            => 'Cart',
           'theme_location'  => 'Cart',
           'container'       => false,
           //'container_id'    => 'bs4navbar',
           //'container_class' => 'collapse navbar-collapse',
           'menu_id'         => false,
           'menu_class'      => 'navbar-nav mr-auto',
           'depth'           => 2,
           'fallback_cb'     => 'bs4navwalker::fallback',
           'walker'          => new bs4navwalker()
         ]);
        ?>
                <!-- код для значка НАЧАЛО -->
        <?php
        if ( WC()->cart->get_cart_contents_count() !== 0 ) {
          ?>  
          <span class="badge badge-pill badge-warning no-md-view">
            <a class="cart-customlocation" href="<?php echo wc_get_cart_url(); ?>" title="<?php _e( 'Просмотреть свою корзину' ); ?>"><?php echo sprintf ( _n( '%d товар', '%d товаров', WC()->cart->get_cart_contents_count() ), WC()->cart->get_cart_contents_count() ); ?></a>
          <?php 
        }
        ?>

        </span>
    </nav>

  </div>
</div>

functions.php КОД

<?php

add_filter( 'wp_nav_menu_items', 'my_account_loginout_link', 10, 2 );
/**
 * Добавить WooCommerce Мой аккаунт Логин/Логаут в меню
 * 
 * @see https://support.woothemes.com/hc/en-us/articles/203106357-Add-Login-Logout-Links-To-The-Custom-Primary-Menu-Area
 */
function my_account_loginout_link( $items, $args ) {
    if (is_user_logged_in() && $args->theme_location == 'user') { //измените расположение меню темы на ваше

        $items .= '                 
                    <li><a class="nav-link" href="' . get_permalink( wc_get_page_id( 'myaccount' ) ) . '">Мои Данные</a></li>
                    <li><a class="nav-link" href="'. wp_logout_url( get_home_url() ) .'">Выйти</a></li>
                    '; //измените ссылку выхода, здесь она ведет на 'shop', вы можете изменить её на 'myaccount'
    }
    elseif (!is_user_logged_in()  && $args->theme_location == 'user') {//измените расположение меню темы на ваше

        $items .= '<li><a class="nav-link" href="' . get_permalink( wc_get_page_id( 'myaccount' ) ) . '">Войти</a></li>';
    }
    return $items;
}

Результат

Как вы можете видеть, элемент был добавлен в мое пользовательское меню (иконка пользователя + Войти), но не как выпадающий список.

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

Я думаю, это сделает то, что вы хотите добиться. В основном, таким образом вы подключаетесь до генерации HTML, чтобы добавить свои элементы меню. У меня пока не было возможности это протестировать, но это должно сработать.

ИЗМЕНЕНИЕ: Поскольку вы хотите, чтобы это было под выпадающим списком, вам нужно установить menu_item_parent. Если элемент меню с иконкой пользователя будет статичным, вы можете взять ID элемента меню, посмотрев исходный код этого элемента меню и взяв число, которое идет после menu-item- в ID.

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

Например, в этом случае 103191 является ID элемента меню (обратите внимание, что это не то же самое, что объект/пост/страница/CPT и т.д., на который указывает элемент меню).

function my_account_loginout_link( $items, $menu, $args ) {
    if ( $args->theme_location !== 'user' ) {
        return $items;
    }

    if ( is_user_logged_in() ) {
        $added_menu_items = array(
            array(
                'title' => 'Мои Данные',
                'url' => get_permalink( wc_get_page_id( 'myaccount' ) )
            ),
            array(
                'title' => 'Выйти',
                'url' => wp_logout_url( get_home_url() )
            )
        );
    } else {
        $added_menu_items = array(
            array(
                'title' => 'Войти',
                'url' => get_permalink( wc_get_page_id( 'myaccount' ) )
            )
        );
    }

    $parent_menu_id = 103191;
    $menu_order = count( $items ) + 1;
    foreach ( $added_menu_items as $added_item ) {
        $nav_menu_item = new stdClass;
        $nav_menu_item->menu_item_parent = $parent_menu_id;
        $nav_menu_item->url = $added_item['url'];
        $nav_menu_item->title = $added_item['title'];
        $nav_menu_item->menu_order = $menu_order;
        $items[] = $nav_menu_item;
        $menu_order++;
    }
    return $items;
}
add_filter( 'wp_get_nav_menu_items', 'my_account_loginout_link', 10, 3 );

Адаптировано от:

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

Добавление выпадающего меню в WordPress с помощью wp_nav_menu_items

В данном руководстве мы рассмотрим, как добавить элементы выпадающего меню в вашу навигацию WordPress, используя фильтр wp_nav_menu_items, в контексте проекта с использованием WooCommerce и Bootstrap 4.

Исходные данные проекта

Вы уже настроили навигационное меню для пользователей с помощью фильтра, который добавляет ссылки для "Входа", "Выхода" и "Моих данных". Однако эти элементы отображаются в виде отдельных пунктов меню. Мы добьемся того, чтобы они были организованы в выпадающем списке под статическим элементом (например, иконкой пользователя).

Шаг 1: Настройка HTML для выпадающего меню

Ваша задача заключается в добавлении HTML-структуры для выпадающего элемента. Предположим, что иконка пользователя с идентификатором (menu_item_id) 103191 будет родительским элементом для нового выпадающего меню.

Вот как будет выглядеть структура выпадающего меню в HTML:

<li class="nav-item dropdown">
    <a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
        <i class="icon-user"></i> Пользователь
    </a>
    <div class="dropdown-menu" aria-labelledby="userDropdown">
        <!-- Навигационные элементы будут добавлены здесь -->
    </div>
</li>

Шаг 2: Модификация функции добавления элементов меню

Теперь необходимо изменить функцию my_account_loginout_link, чтобы она добавляла элементы под родительским элементом, используя свойства класса объекта. Ниже приведен обновленный код функции:

add_filter( 'wp_get_nav_menu_items', 'my_account_loginout_link', 10, 3 );
function my_account_loginout_link( $items, $menu, $args ) {
    // Проверяем, что используется правильное меню
    if ( $args->theme_location !== 'user' ) {
        return $items;
    }

    // Создаем массив дополнительных пунктов меню
    $added_menu_items = [];
    if ( is_user_logged_in() ) {
        $added_menu_items[] = [
            'title' => 'Мои Данные',
            'url' => get_permalink( wc_get_page_id( 'myaccount' ) )
        ];
        $added_menu_items[] = [
            'title' => 'Выйти',
            'url' => wp_logout_url( get_home_url() )
        ];
    } else {
        $added_menu_items[] = [
            'title' => 'Войти',
            'url' => get_permalink( wc_get_page_id( 'myaccount' ) )
        ];
    }

    // Идентификатор родительского элемента
    $parent_menu_id = 103191;
    $menu_order = count( $items ) + 1;

    // Добавляем новые элементы в массив меню
    foreach ( $added_menu_items as $added_item ) {
        $nav_menu_item = new stdClass;
        $nav_menu_item->ID = uniqid(); // Генерируем уникальный ID
        $nav_menu_item->menu_item_parent = $parent_menu_id; // Устанавливаем родительский ID
        $nav_menu_item->url = $added_item['url'];
        $nav_menu_item->title = $added_item['title'];
        $nav_menu_item->menu_order = $menu_order;
        $nav_menu_item->classes = ['dropdown-item']; // Класс Bootstrap для выпадающего меню

        $items[] = $nav_menu_item; // Добавляем пункт в меню
        $menu_order++;
    }

    return $items;
}

Шаг 3: Подключение необходимых скриптов Bootstrap

Также убедитесь, что вы подключили необходимые JavaScript и CSS файлы Bootstrap для обработки выпадающих меню, если они еще не добавлены. Добавьте следующее в файл functions.php вашего шаблона:

function enqueue_bootstrap_scripts() {
    wp_enqueue_style('bootstrap-css', 'https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css');
    wp_enqueue_script('jquery');
    wp_enqueue_script('bootstrap-js', 'https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js', ['jquery'], null, true);
}
add_action('wp_enqueue_scripts', 'enqueue_bootstrap_scripts');

Заключение

Теперь, после выполнения всех шагов, ваши элементы меню "Вход", "Выход" и "Мои данные" должны отображаться в виде выпадающего меню под иконкой пользователя. Это организует навигацию на вашем сайте более эстетично и удобно для пользователей.

Если у вас возникли дополнительные вопросы или трудности, не стесняйтесь обращаться за помощью!

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

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