Получение id текущего элемента из конкретного меню

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

Я пытаюсь получить current-menu-item-id на любой странице.
Я использовал это решение, которое очень близко к решению.

Проблема в том, что функция ниже проходит по всем меню на странице, а не по одному конкретному меню, которое я хочу проверить:

add_filter( 'wp_nav_menu_objects', 'wpse16243_wp_nav_menu_objects' );  
function wpse16243_wp_nav_menu_objects( $sorted_menu_items )  
{  
    foreach ( $sorted_menu_items as $menu_item ) {  
        if ( $menu_item->current ) {  
            $GLOBALS['wpse16243_title'] = $menu_item->ID;  
        }  
    }  
    return $sorted_menu_items;  
}  

…что означает, если вы ссылаетесь на одну и ту же страницу более одного раза в своих меню, вы рискуете, что эта функция вернет current-menu-item-id из неверного меню.

Есть ли способ ограничить эту функцию, чтобы она проходила только через конкретное меню, а не через все меню?
Я пытался передать конкретные элементы меню в переменной/параметре $sorted_menu_items, но это, кажется, не работает.

Это было решением моей проблемы:

Затем, что я бы сделал, так это сохранил кликнутую ссылку в cookie, используя Javascript, и прочитал его при загрузке новой страницы. $_SERVER[‘HTTP_REFERER’] здесь не будет надежен. – Luis Sanz 19 июля в 12:33

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

add_filter( 'wp_nav_menu_objects', 'wpse16243_wp_nav_menu_objects', 10, 2 );  
function wpse16243_wp_nav_menu_objects( $sorted_menu_items, $args )

В функции вы получите имя меню с помощью $args['menu'], так что

if ( $menu_item->current ) { 

должно быть изменено на

if ( $menu_item->current && $args['menu'] == 'name_of_menu_you_want_to_search' ) { 

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

Для решения задачи необходимо ограничить функцию поиска текущего элемента меню до конкретного меню в WordPress. Рассмотрим проблему подробнее и предоставим пошаговое решение.

Теория

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

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

Пример

Рассмотрим текущую реализацию функции:

add_filter('wp_nav_menu_objects', 'wpse16243_wp_nav_menu_objects');  
function wpse16243_wp_nav_menu_objects($sorted_menu_items)  
{  
    foreach ($sorted_menu_items as $menu_item) {  
        if ($menu_item->current) {  
            $GLOBALS['wpse16243_title'] = $menu_item->ID;  
        }  
    }  
    return $sorted_menu_items;  
}  

Эта функция проходит все доступные элементы меню и сохраняет ID текущего элемента в глобальной переменной $GLOBALS['wpse16243_title']. В случае наличия одинаковых URL в разных меню может произойти возврат ID элемента из неверного меню.

Применение

Чтобы ограничить функцию только конкретным меню, необходимо добавить второй аргумент $args в фильтр и использовать его для проверки соответствия текущему меню. Мы будем использовать $args['menu'] для проверки названия требуемого меню. Пример модификации функции:

add_filter('wp_nav_menu_objects', 'wpse16243_wp_nav_menu_objects', 10, 2);  
function wpse16243_wp_nav_menu_objects($sorted_menu_items, $args)  
{  
    $desired_menu_name = 'name_of_menu_you_want_to_search'; // Название меню, которое необходимо проверить

    foreach ($sorted_menu_items as $menu_item) {  
        if ($menu_item->current && $args['menu'] == $desired_menu_name) {  
            $GLOBALS['wpse16243_title'] = $menu_item->ID;  
        }  
    }  
    return $sorted_menu_items;  
}  

Здесь мы включаем дополнительную проверку $args['menu'] == $desired_menu_name, чтобы удостовериться, что мы работаем только с нужным меню. Такой подход позволяет резко повысить точность работы функции и устранить ошибку выбора неверного элемента.

Вывод

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

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

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

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