Intereting Posts
Как проверить, пусто ли пользовательское поле профиля пользователя Удалить пользовательскую структуру постоянной ссылки из пользовательского типа сообщения без изменения register_post_type () напрямую Выполнение `createimagefrompng ()` из save_post hook (или эквивалентного крючка) Создание настраиваемых полей при загрузке изображений Ссылка FROM attachment на полный пост и получить значения настраиваемых полей на странице вложений? Получите первый HTML-код для встраивания видео и добавленный идентификатор отправленного видео из сообщения Связанные сообщения по таксономии с использованием плагина Advance Custom Fields Динамический URL-адрес и передача данных в iframe Расширенный или не очень продвинутый запрос pre_get_posts Получать сообщения с несколькими метазначениями переадресация пароля переадресация на страницу входа в систему WordPress Loop через отдельные страницы Сортировка сообщений последним измененным Два (или более) параллельных (суб) TLD, которые сохраняются при серфинге на сайте / динамически задают адрес сайта? Удаляются ли дополнительные файлы плагинов во время обновления?

current_page_item отсутствует внутри wp_nav_menu

Я использую функцию wp_nav_menu следующим образом:

 <?php wp_nav_menu( array( 'container' => false, 'echo' => true, 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '', 'depth' => 0, 'walker' => new my_walker()) ); ?> class my_walker extends Walker_Nav_Menu { function start_el(&$output, $item, $depth, $args) { global $wp_query; $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; $class_names = $value = ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) ); $class_names = ' class="'. esc_attr( $class_names ) . '"'; $output .= $indent . '<li class="menu-item-'. $item->ID . '"' . $value . '>'; $attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : ''; $attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : ''; $attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : ''; $attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : ''; $prepend = '<div>'; $append = '</div>'; $description = ! empty( $item->description ) ? '<span>'.esc_attr( $item->description ).'</span>' : ''; if($depth != 0) { $description = $append = $prepend = ""; } $item_output = $args->before; $item_output .= '<a'. $attributes .'>'; $item_output .= '<p>'.$args->link_before .apply_filters( 'the_title', $item->title, $item->ID ); $item_output .= $description.$args->link_after.'</p>'; $item_output .= $prepend; $item_output .= $append; $item_output .= '</a>'; $item_output .= $args->after; $output .= apply_filters('walker_nav_menu_start_el', $item_output, $item, $depth, $args); } } 

Но в этом меню отсутствует класс current_page_item . Что-то не так в моем коде? Как добавить этот класс?
Благодаря!

Если вы фактически не используете настраиваемое навигационное меню , почему вы не просто wp_page_menu() напрямую?

проблема

По мере выполнения ваш ходок никогда не будет выполнен (или, точнее, вы не сможете контролировать , выполняется ли он), потому что вы не проходите 'theme_location' (правильное использование) или 'menu' (неоптимальное использование) в массив args.

Вот как работает wp_nav_menu() :

  1. WordPress ищет 'menu' определенное в массиве args. Это значение соответствует пули пользовательского навигационного меню, созданного пользователем . Поэтому, если пользователь создает меню с именем «Short Header Menu», slug будет 'short-header-menu' , что соответствует 'menu' => 'short-header'menu' . Если меню найдено, оно используется.
  2. WordPress ищет 'theme_location' определенный в массиве args. Это значение соответствует пользовательскому пользовательскому навигационному меню, назначаемому пользователем, в «Местоположение темы» . Таким образом, если пользователь создает меню с названием «Короткое меню заголовков» и назначает его теме (Theme-defined) Theme Location «Основное меню» (определяется темой через register_nav_menus( array( 'primary-menu' => "Primary Menu 0 0 ), 'short-header-menu' будет возвращенным меню. Если он найден, он используется.
  3. Если ни 'menu' ни 'theme_location' не определяется массив args, WordPress запрашивает все пользовательские пользовательские навигационные меню. Если пользователь создал пользовательские навигационные меню, WordPress использует первый, который имеет пункты меню.
  4. Если все вышеперечисленное не выполнено, WordPress выводит резервное меню, как определено через 'fallback_cb' .

Таким образом, в вашем примере вы не передаете 'menu' или 'theme_location' в массив args. Если пользователь (например, вы) не создал никаких пользовательских навигационных меню, WordPress выводит 'fallback_cb' , который по определению является wp_page_menu() .

Теперь wp_nav_menu() передает свой массив $args в wp_page_menu() функцию, но wp_page_menu() не принимает параметр 'walker' . Поэтому ваш пользовательский ходок игнорируется.

Решение

  1. Правильно зарегистрируйте пользовательское навигационное меню. Расположение объектов, через register_nav_menus()
  2. Создание пользовательских навигационных меню через Appearance -> Menus
  3. Назначьте настраиваемое навигационное меню для зарегистрированного местоположения темы
  4. Передайте параметр wp_nav_menu() массив wp_nav_menu() $args

добавление

Обратите внимание, если единственной целью вашего пользовательского ходока является добавление .current-page-item , то вам совсем не нужен ваш пользовательский ходок. wp_nav_menu() обратно совместимы с wp_page_menu() , что означает, что .current-page-item уже wp_nav_menu() .