Вопрос или проблема
Я пытаюсь добавить кнопку «выход» в главное навигационное меню под родительским меню «аккаунт». Но кнопка не отображается.
В разделе Внешний вид > Меню я добавляю страницу «аккаунт» в активное меню. (ссылка активирована)
Я добавляю фрагмент кода
Код здесь;
function my_insert_primary_nav_login_link( $items, $menu, $args ) {
if( is_admin() )
return $items;
// Выход если это меню не является main-menu или главное меню загружается в панели управления.
if( $menu->slug !== 'main-menu' || is_admin() )
return $items;
// Найти ID страницы с именем account в элементах меню.
foreach( $items as $item ) {
if( $item->post_type !== 'page' || $item->post_name !== 'account' )
continue;
$account_page_id = $item->ID;
break;
}
// Выход, если страницы аккаунта нет в этом меню.
if( ! isset( $account_page_id ) )
return $items;
$logged_in = is_user_logged_in();
$link_title = __( $logged_in ? 'Log In' : 'Log Out', 'oceanwp' );
// Вставить новый объект WP_Post для ссылки.
$items[] = new WP_Post(
(object) [
'ID' => 'user-login',
'menu_item_parent' => $account_page_id,
'classes' => [ 'account-auth-link' ],
'type' => 'virtual',
'object' => 'virtual',
'title' => $link_title,
'attr_title' => $link_title,
'url' => $logged_in ? wp_logout_url() : wp_login_url(),
]
);
return $items;
}
add_filter( 'wp_get_nav_menu_items', 'my_insert_primary_nav_login_link', 10, 3 );
Я использую тему OceanWP. Я проверил, что функция запускается, а сокращение меню — main-menu, но по какой-то причине она, по-видимому, не добавляет родительское меню ‘account’.
Если у вас есть идеи, буду очень признателен.
.
Ответ или решение
Для добавления кнопки «Выйти» (Logout) под родительское меню «Аккаунт» в главном навигационном меню WordPress необходимо учитывать несколько важных технических аспектов. Вы указали, что используете тему OceanWP и уже проверили, что функция запускается, но кнопка по какой-то причине не отображается как ожидается. Давайте разберем возможные источники проблемы и предложим детальное решение.
Теория
-
Структура меню и работа функций: В WordPress меню управления навигацией реализовано через систему «меню», где каждое меню может содержать несколько элементов, включая страницы, пользовательские ссылки и категории. Они могут быть сгруппированы в родительские и дочерние элементы. В вашем случае, требуется добавить дочерний элемент под родительский элемент «Аккаунт». Функция
wp_get_nav_menu_items
позволяет манипулировать элементами меню перед их выводом на страницу. -
API WordPress: Для корректной работы нужно учитывать аргументы и возвращаемые значения функций WordPress. В случае с
wp_get_nav_menu_items
, вы должны возвращать массив объектов типаWP_Post
, что и происходит в вашем коде. -
Тема и стили: OceanWP может иметь специфические стили и скрипты, которые либо переопределяют, либо по-своему интерпретируют стандартные выходы функций меню. Важно проверить соответствие вашего кода с ожиданиями этой темы.
Пример
Ваш текущий код, выполняющий добавление кнопки, выглядит следующим образом:
function my_insert_primary_nav_login_link( $items, $menu, $args ) {
if( is_admin() )
return $items;
// Прекратить выполнение, если это не 'main-menu' или меню загружается в админ-панели.
if( $menu->slug !== 'main-menu' || is_admin() )
return $items;
foreach( $items as $item ) {
if( $item->post_type !== 'page' || $item->post_name !== 'account' )
continue;
$account_page_id = $item->ID;
break;
}
// Прекратить выполнение, если страница 'аккаунт' отсутствует в меню.
if( ! isset( $account_page_id ) )
return $items;
$logged_in = is_user_logged_in();
$link_title = __( $logged_in ? 'Log In' : 'Log Out', 'oceanwp' );
$items[] = new WP_Post(
(object) [
'ID' => 'user-login',
'menu_item_parent' => $account_page_id,
'classes' => [ 'account-auth-link' ],
'type' => 'virtual',
'object' => 'virtual',
'title' => $link_title,
'attr_title' => $link_title,
'url' => $logged_in ? wp_logout_url() : wp_login_url(),
]
);
return $items;
}
add_filter( 'wp_get_nav_menu_items', 'my_insert_primary_nav_login_link', 10, 3 );
Применение
-
Диагностика проблемы:
- Убедитесь, что переменная
$account_page_id
действительно получает значение. Возможно, страница «аккаунт» не имеет нужного slug или она не добавлена в меню сначала. - Проверьте, правильно ли срабатывает условие на проверку slug’а
$menu->slug !== 'main-menu'
. - Для диагностики можно временно добавить
error_log
со значениями переменных на разных этапах выполнения функции.
- Убедитесь, что переменная
-
Совместимость с OceanWP:
- Проверьте стили темы. Убедитесь, что класс
account-auth-link
определяется в CSS и не скрывает элемент. Иногда темы используют JavaScript для динамического показа/скрытия элементов. - Проверьте конфликтующие скрипты: в DevTools браузера убедитесь в отсутствии ошибок JavaScript, которые могут препятствовать добавлению элемента.
- Проверьте стили темы. Убедитесь, что класс
-
Логика авторизации:
- Поскольку логика зависит от авторизации (
is_user_logged_in()
), убедитесь, что вызовыwp_logout_url()
иwp_login_url()
возвращают корректные URLs. Также, убедитесь, что указанные ссылки должным образом обрабатываются сервером.
- Поскольку логика зависит от авторизации (
-
Отладка через шаблон:
- Обновите тему и плагины до последней версии. Иногда это помогает решать неожиданные проблемы совместимости.
- Сделайте тест, сменив тему на одну из стандартных, чтобы понять, происходит ли это из-за OceanWP.
Этот подход и отладка должны помочь найти источник проблемы и успешно добавить кнопку выхода под меню «Аккаунт». Наконец, не забывайте тестировать изменения в различных браузерах и устройствах, чтобы убедиться в кроссбраузерной совместимости.
Также, учитывая, что WordPress — это платформа с множеством сторонних решений, возможно рассмотреть использование плагинов для управления навигацией или их кастомизации, если ручная модификация вызывает значительные сложности.
Обязательно документируйте изменения и создайте резервную копию сайта перед внедрением подобных исправлений. Это поможет в случае необходимости вернуться к предыдущей версии, если текущее решение не принесет ожидаемого результата.