【问题标题】:Add a link wrapper to 1 dropdown menu in Wordpress将链接包装器添加到 Wordpress 中的 1 个下拉菜单
【发布时间】:2015-07-19 21:19:25
【问题描述】:

所以,我创建了一个自定义 walker 类,允许我将下拉菜单项包装在一个容器中,以便我可以添加自定义背景并控制样式。一长串原因,为什么,我和我的团队刚刚决定我们这样做。但是,现在需要将 ONE 元素的下拉列表包装在 a 标签中以链接到赞助商。当然,我可以操纵自定义 Walker,但这会将链接添加到所有目标元素。

所以我想知道是否可以只针对我需要的一个下拉菜单。假设是 li#menu-item-18

这是我的自定义 Walker 代码

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;
});

【问题讨论】:

    标签: php wordpress drop-down-menu submenu


    【解决方案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

    【讨论】:

    • 谢谢!我会在星期一试试这个并报告!
    • 嗨,你试过了吗?它奏效了吗?我很好奇:)
    • 我试过了,可惜没用。它只是传递了函数。我考虑将你的函数与我的函数合并,并分别运行它们。
    猜你喜欢
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2015-03-25
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多