Добавить упаковщик ссылок в 1 выпадающее меню в WordPress

Итак, я создал пользовательский класс 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;
});

1

Решение

Вы могли бы переопределить 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 с тем, что вы предпочитаете.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]