Установить порядок элементов с помощью wp_nav_menu_{$menu->slug}_items

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

У меня есть код, который добавляет пункт меню в меню, используя wp_nav_menu_{$menu->slug}_items.

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

Если в фильтре нет метода для этого, есть ли другой способ достичь того же результата?

Вы всегда можете использовать поиск и замену по строке или регулярному выражению в выводимом HTML отфильтрованных $items.
в любом случае, если вы нацеливаетесь на обычные элементы меню, вы можете добавить $post объекты и упорядочить элементы через wp_nav_menu_objects фильтр, если нет, вот основной пример кода:

function replace_itemcart_in_menu( $items, $args ) { 
    $url = home_url('my-item');
    $previtem = '<li id="menu-item-11" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-11"><a href="'.$carturl."https://wordpress.stackexchange.com/">My Item</a>'; 
    $newitem = '<li>New Item</li>'; 
    $items = str_replace($previtem, $previtem.$newitem, $items); 
    return $items; 
}

Вы можете достичь этого, манипулируя массивом пунктов меню до его рендеринга

function custom_menu_order($items, $args) {
    // Проверьте, является ли это нужным меню
    if ($args->theme_location == 'primary') {
        // Создайте ваш пользовательский пункт меню
        $custom_item = new stdClass();
        $custom_item->ID = 'custom-item';
        $custom_item->title="Custom Item";
        $custom_item->url="#";
        $custom_item->menu_order = 3; // Установите порядок здесь
        
        // Вставьте ваш пользовательский пункт меню в нужной позиции
        array_splice($items, 2, 0, array($custom_item));
    }
    return $items;
}
add_filter('wp_nav_menu_objects', 'custom_menu_order', 10, 2);

как вы видите, вышеуказанная функция выполняет работу

 -  Используйте фильтр wp_nav_menu_objects, чтобы изменить массив пунктов меню.
 -  Найдите позицию, где вы хотите вставить ваш пользовательский пункт меню.
 -  Вставьте ваш пользовательский пункт меню в массив на нужной позиции.
 -  Верните измененный массив

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

Конечно! Настройка порядка элементов меню в WordPress может быть реализована с помощью фильтров и манипуляции с массивом элементов меню, что позволяет добиться необходимой последовательности элементов без изменений в исходном коде шаблона. Рассмотрим это более подробно, применяя методика TEA (Теория, Пример, Применение).

Теория

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

Фильтр wp_nav_menu_objects предоставляет массив объектов меню, которые вы можете изменить. Это дает возможность добавлять, удалять или изменять порядок элементов меню. При необходимости добавления нового элемента на определённую позицию в меню, вы можете вспомогаться PHP-функцией array_splice(), которая модифицирует массив, вставляя элементы в заданную позицию.

Пример

Рассмотрим пример, где будет добавлен новый элемент меню в третью позицию основного (primary) меню:

function custom_menu_order($items, $args) {
    // Проверка, что это нужное меню
    if ($args->theme_location == 'primary') {
        // Создаём новый элемент меню
        $custom_item = new stdClass();
        $custom_item->ID = 'custom-item-id';
        $custom_item->title = "Мой кастомный элемент";
        $custom_item->url = "#";

        // Вставляем новый элемент на третью позицию
        array_splice($items, 2, 0, array($custom_item)); // Индексы массива начинаются с 0
    }
    return $items;
}
add_filter('wp_nav_menu_objects', 'custom_menu_order', 10, 2);

В этом примере, мы создаём объект $custom_item, представляющий новый элемент меню. Он добавляется на третье место в массиве $items с помощью array_splice.

Применение

Чтобы применить подход выше, следуйте этим шагам:

  1. Поместите код в functions.php: Добавьте функцию custom_menu_order в файл functions.php, находящийся в директории используемой темы. Это позволит ей загружаться и применяться всякий раз, когда загружается ваше меню.

  2. Определите правильное местоположение: Убедитесь, что параметр theme_location соответствует нужному меню, например ‘primary’, как указано в нашем примере. Это то, через что фильтр знает, на каком меню применить пользовательские изменения.

  3. Настройте ID и другие атрибуты: Измените свойства $custom_item, такие как ID, title и url, чтобы они соответствовали вашим нуждам.

  4. Тестируйте на своём сайте: Проверьте отображение меню на вашём сайте, чтобы убедиться, что новый элемент появился в желаемой позиции.

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

Таким образом, используя фильтр wp_nav_menu_objects, вы обладаете мощным инструментом для настройки элементов меню в WordPress. Это позволяет поддерживать современное и удобное для пользователя меню на вашем сайте.

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

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