Добавьте кнопку «Выйти» в подменю.

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

Я пытаюсь добавить кнопку «выход» в главное навигационное меню под родительским меню «аккаунт». Но кнопка не отображается.

В разделе Внешний вид > Меню я добавляю страницу «аккаунт» в активное меню. (ссылка активирована)
Я добавляю фрагмент кода
Код здесь;

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’.

enter image description here

enter image description here

enter image description here

Если у вас есть идеи, буду очень признателен.

.

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

Для добавления кнопки «Выйти» (Logout) под родительское меню «Аккаунт» в главном навигационном меню WordPress необходимо учитывать несколько важных технических аспектов. Вы указали, что используете тему OceanWP и уже проверили, что функция запускается, но кнопка по какой-то причине не отображается как ожидается. Давайте разберем возможные источники проблемы и предложим детальное решение.

Теория

  1. Структура меню и работа функций: В WordPress меню управления навигацией реализовано через систему «меню», где каждое меню может содержать несколько элементов, включая страницы, пользовательские ссылки и категории. Они могут быть сгруппированы в родительские и дочерние элементы. В вашем случае, требуется добавить дочерний элемент под родительский элемент «Аккаунт». Функция wp_get_nav_menu_items позволяет манипулировать элементами меню перед их выводом на страницу.

  2. API WordPress: Для корректной работы нужно учитывать аргументы и возвращаемые значения функций WordPress. В случае с wp_get_nav_menu_items, вы должны возвращать массив объектов типа WP_Post, что и происходит в вашем коде.

  3. Тема и стили: 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 );

Применение

  1. Диагностика проблемы:

    • Убедитесь, что переменная $account_page_id действительно получает значение. Возможно, страница «аккаунт» не имеет нужного slug или она не добавлена в меню сначала.
    • Проверьте, правильно ли срабатывает условие на проверку slug’а $menu->slug !== 'main-menu'.
    • Для диагностики можно временно добавить error_log со значениями переменных на разных этапах выполнения функции.
  2. Совместимость с OceanWP:

    • Проверьте стили темы. Убедитесь, что класс account-auth-link определяется в CSS и не скрывает элемент. Иногда темы используют JavaScript для динамического показа/скрытия элементов.
    • Проверьте конфликтующие скрипты: в DevTools браузера убедитесь в отсутствии ошибок JavaScript, которые могут препятствовать добавлению элемента.
  3. Логика авторизации:

    • Поскольку логика зависит от авторизации (is_user_logged_in()), убедитесь, что вызовы wp_logout_url() и wp_login_url() возвращают корректные URLs. Также, убедитесь, что указанные ссылки должным образом обрабатываются сервером.
  4. Отладка через шаблон:

    • Обновите тему и плагины до последней версии. Иногда это помогает решать неожиданные проблемы совместимости.
    • Сделайте тест, сменив тему на одну из стандартных, чтобы понять, происходит ли это из-за OceanWP.

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

Также, учитывая, что WordPress — это платформа с множеством сторонних решений, возможно рассмотреть использование плагинов для управления навигацией или их кастомизации, если ручная модификация вызывает значительные сложности.

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

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

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