Вопрос или проблема
Я пытаюсь получить 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, минимизируя ошибки выбора некорректных данных.
Со временем навыки и опыт разработки усилят вашу способность разбираться в документации и правильно применять существующий код в различных контекстах, создавая пользовательские решения для специфических потребностей вашего проекта.