Добавление класса идентификатора страницы в пункты меню навигации


Я хотел бы добавить классы, содержащие идентификационные номера страниц, в пункты <li> в моем навигационном меню. Подобные классы генерируются wp_page_menu(), но по какой-то причине они не генерируются wp_nav_menu().

Я подумал, что, возможно, я мог бы использовать функциональность "walker" (которую я только сейчас открываю), чтобы добавить пользовательский класс в теги <li> и использовать get_post_meta( $item->ID, '_menu_item_object_id', true ); для получения идентификаторов, но у меня чертовски много времени, чтобы понять, как это сделать. Все на различных форумах, похоже, имеют вопросы об использовании класса walker для подменю и так далее, и я пробовал различные коды из своих поисков, но ничего не работает. Мне просто нужен пользовательский класс с идентификатором страницы в каждом теге <li>.

Мой текущий код меню является основным:

function abdmenu_nav()
{
wp_nav_menu(
array(
    'theme_location'  => 'header-menu',
    'menu'            => '',
    'container'       => 'div',
    'container_class' => 'menu-{menu slug}-container',
    'container_id'    => '',
    'menu_class'      => 'menu',
    'menu_id'         => '',
    'echo'            => true,
    'fallback_cb'     => 'wp_page_menu',
    'before'          => '',
    'after'           => '',
    'link_before'     => '',
    'link_after'      => '',
    'items_wrap'      => '<ul>%3$s</ul>',
    'depth'           => 0,
    'walker'          => ''
    )
);
}

Я уверен, что это проще, чем я это делаю, но я никогда раньше не имел дела с классом walker. Я даже не могу найти ничего о том, нужно ли это вообще для того, что я пытаюсь сделать. Если да, то как бы я его настроил?

Author: Shoelaced, 2016-08-31

1 answers

Мы можем добавить пользовательские классы навигационного меню через nav_menu_css_class фильтр.

Пример:

Следующее должно добавить класс CSS wpse-object-id-{object_id} в теги <li>:

// Add filter
add_filter( 'nav_menu_css_class', 'wpse_menu_item_id_class', 10, 2 ); 

// Your navigational menu
wp_nav_menu( $args );

// Remove filter
remove_filter( 'nav_menu_css_class', 'wpse_menu_item_id_class', 10, 2 );

Где мы определяем обратный вызов фильтра как:

/**
 * Custom Nav Menu Class For Page ID
 */
function wpse_menu_item_id_class( $classes, $item )
{
    if( isset( $item->object_id ) )
        $classes[] = sprintf( 'wpse-object-id-%d', $item->object_id );

    return $classes;
}

Здесь атрибут object_id должен дать нам соответствующий идентификатор страницы/публикации.

Мы можем видеть, что этот атрибут происходит от wp_setup_nav_menu_item() основная функция:

$menu_item->object_id = ! isset( $menu_item->object_id ) 
    ? get_post_meta( $menu_item->ID, '_menu_item_object_id', true ) 
    : $menu_item->object_id;
 5
Author: birgire, 2016-08-31 20:18:00