Итак, я создал пользовательский класс Walker, позволяющий мне оборачивать элементы раскрывающегося меню в контейнере, чтобы я мог добавить собственный фон и управлять стилем. Длинный список причин, почему, я и моя команда просто решили, что мы так поступим. Тем не менее, выпадающий список на ОДНОМ элементе теперь должен быть обернут в тег для ссылки на спонсора. Конечно, я могу манипулировать пользовательским Уокером, но это добавит ссылку на все целевые элементы.
Итак, что я хочу знать, так это то, можно ли просто нацелиться на ОДИН выпадающий список, который мне нужен. Допустим, это li # menu-item-18
Вот мой пользовательский код Уокера
class My_Custom_Walker_Class extends Walker_Nav_Menu {
function start_lvl( &$output, $depth ) {
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$output .= $indent . '<ul class="sub-menu"><div class="sub-menu-child">';
}
function end_lvl( &$output, $depth ) {
$indent = str_repeat("\t", $depth);
$output .= $indent . '</div></ul>';
}
}
/**
* Add the Menu_With_Data_Attr walker to the wp_nav_menu() used by genesis_do_nav()
*/
add_filter( 'wp_nav_menu_args', function( $args ){
if( isset( $args['menu_class'] ) && 'menu genesis-nav-menu menu-primary' === $args['menu_class'] ) {
if( class_exists( 'My_Custom_Walker_Class' ) ) {
$args['walker'] = new My_Custom_Walker_Class();
}
}
return $args;
});
Вы могли бы переопределить start_el
метод родительского класса в вашем пользовательском классе, но кажется, что много кода дублируется для минимального изменения (мне это не нравится).
Лучшее решение — использовать фильтр-крюк в конце родительского метода, walker_nav_menu_start_el
, добавить обертку только для нужного вам элемента, например так:
add_filter('walker_nav_menu_start_el', function($item_output, $item, $depth, $args){
if( 18 == $item->ID && 'menu genesis-nav-menu menu-primary' === $args['menu_class'] )
return sprintf('<div class="targeted">%s</div>', $item_output);
return $item_output;
}, 10, 4);
Поменяйте обертку div
с тем, что вы предпочитаете.
Других решений пока нет …