不乱于心,不困于情。
不畏将来,不念过往。如此,安好。

wp_nav_menu 函数输出去除div,ul,li

在定制主题的时候,想去除一些 wp_nav_menu 函数输出的html代码,下面是一些解决方法。

去掉li多余的css

add_filter('nav_menu_css_class', 'rm_css_attributes_filter', 100, 1);
add_filter('nav_menu_item_id', 'rm_css_attributes_filter', 100, 1);
add_filter('page_css_class', 'rm_css_attributes_filter', 100, 1);
function rm_css_attributes_filter($var) {
    return is_array($var) ? array() : '';
}
 
如果你需要保留其中一些css,只需要简单修改一下即可。
 
 
function rm_css_attributes_filter($var) {
    return is_array($var) ? array_intersect($var, array('current-menu-item', 'current-menu-parent')) : '';
}

去除菜单没有设置时候的默认值

fallback_cb 参数设置为 false 即可。

去除div

去除 div 标签最简单,只需要配置一个参数container为false即可。

去除ul

去除外层的 ul 标签,需要借助 items_wrap 参数,通过查看源代码:wp-includes/nav-menu-template.php,发现 items_wrap 的默认值是:

<ul id="%1$s" class="%2$s">%3$s</ul>
 
我们通过参数即可去掉
 
'items_wrap' => '%3$s'

注意:如果菜单是多级的,子菜单仍然有ul,如果这个也想去掉可以参考下面的去li的方法

去除li

这里需要用php的函数strip_tags(),trip_tags() 函数可以剥去字符串中的 HTML、XML 以及 PHP 的标签

这里我们先设置echo为false,然后获取到菜单的内容,例如:

$footer_menu = wp_nav_menu( array( 
    'echo' => false, 
    'container' => false, 
    'fallback_cb' =>false, 
    'theme_location' => 'footer_menu' ) );

然后通过strip_tags函数过滤掉一些标签

echo strip_tags( $footer_menu , '<a>' );

第二个参数是保留的标签,可以写多个标签例如:

echo strip_tags( $footer_menu , '<a><span>' );

通过 Walker_Nav_Menu 控制

这次在定制主题的时候,最终想要的是这样的:

<a class="list-group-item" target="_blank" href="http://www.baidu.com/">Baidu</a>
<a class="list-group-item" target="_blank" href="http://www.google.com/">Google</a>

a 标签里有默认的样式,而且target默认为 blank。

div和ul是通过上面的方式处理的,li和a的处理是通过扩展Walker_Nav_Menu实现的,具体代码如下:

class wp_link_navwalker extends Walker_Nav_Menu {
 
    function start_el(&$output, $item, $depth, $args) {
        $attributes  = ' class="list-group-item"';
        $attributes .= ' target="_blank"';
        $attributes .= empty($item->attr_title) ? '' : ' title="'.esc_attr($item->attr_title).'"';
        $attributes .= empty($item->url) ? '' : ' href="'.esc_attr($item->url).'"';
        
        $item_output .= '<a'. $attributes .'>';
        $item_output .= apply_filters( 'the_title', $item->title, $item->ID );
        $item_output .= '</a>';
 
        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    }
 
    function end_el(&$output, $item, $depth, $args) {
        $output .= '';
    }
}

输出

<?php
    wp_nav_menu(array(
        'container'     => false, // 去除最外层的div
        'items_wrap'    => '%3$s', // 去除ul
        'fallback_cb'   => false,
        'walker'        => new wp_link_navwalker(),
        'theme_location'=> 'friend_link_menu'
    ));
?>
赞(1) 打赏
未经允许不得转载:seo优化_前端开发_渗透技术 » wp_nav_menu 函数输出去除div,ul,li

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏