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() .