Я работаю над WordPress-Design, и я хочу создать пользовательское меню.
$items = wp_get_nav_menu_items('Menu', array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item', 'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true, 'update_post_term_cache' => false)); echo '<pre>'; print_r($items); echo '</pre>'; foreach($items as $item){ echo '<div class="menu_entry"><a href="'.$item->url.'">'.$item->title.'</a></div>'; }
Проблема в том, что мне нужна «текущая страница» – класс, который создается WordPress – в стандартном меню.
Любые идеи, как добавить этот класс?
Вы можете сравнить с текущим идентификатором страницы / cat и т. Д. С элементами меню object_id, который является идентификатором страницы / категории и т. Д., С которой она связана.
Что-то вроде (непроверено);
global $post; $thePostID = $post->ID; foreach($items as $item){ if($thePostID === $item->object_id) { echo '<div class="menu_entry"><a href="'.$item->url.'" class="current-menu-item">'.$item->title.'</a></div>'; }else{ echo '<div class="menu_entry"><a href="'.$item->url.'">'.$item->title.'</a></div>'; } }
Время решения:
Функция WordPress, добавляющая эти классы, – _wp_menu_item_classes_by_context()
. Это вызывается уже при использовании wp_nav_menu
но не wp_get_nav_menu_items
. К счастью, последний обеспечивает фильтр, поэтому мы можем сделать это сами:
add_filter( 'wp_get_nav_menu_items', 'prefix_nav_menu_classes', 10, 3 ); function prefix_nav_menu_classes($items, $menu, $args) { _wp_menu_item_classes_by_context($items); return $items; }