remove li class & id for menu items and pages list

2019-03-08 15:25发布

Example of WordPress default CSS class output:

<li id="menu-item-55" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-55">

<li class="page_item page-item-37">

The menu and pages list item come with various own li class and id.

How to remove them in functions.php file for the menu and for the pages list?

7条回答
Luminary・发光体
2楼-- · 2019-03-08 16:11

this is an addition on top of Richard answer.

in case you want to change the current-menu-item class to something else.

        add_filter('nav_menu_css_class', 'my_css_attributes_filter', 100, 1);
        add_filter('nav_menu_item_id', 'my_css_attributes_filter', 100, 1);
        function my_css_attributes_filter($var) {
            if(is_array($var)){
                $varci= array_intersect($var, array('current-menu-item'));
                $cmeni = array('current-menu-item');
                $selava   = array('selectedmenu');
                $selavaend = array();
                $selavaend = str_replace($cmeni, $selava, $varci);
            }
            else{
                $selavaend= '';
            }
        return $selavaend;
        }
查看更多
做自己的国王
3楼-- · 2019-03-08 16:14

Here is a fix that I've come up with. It removes all the id's and classes from the wp_nav_menu, but allows you to come up with your own "approved" list of classes and/or id's. It also changes the lengthy "current-menu-item" to "active". If you prefer to keep the the default WordPress CSS styles, just delete that section of the code. For the sake of keeping this post minimal, here are the links to the pastebin with the code:
http://pastebin.com/W16cxDfY - for your functions.php file
http://pastebin.com/CGx4aprf - for your template, wherever the menu goes

查看更多
We Are One
4楼-- · 2019-03-08 16:15

simply add_filter('nav_menu_item_id', '__return_false'); for menu item id

查看更多
放我归山
5楼-- · 2019-03-08 16:19

An addition to Richard's answer: We need to clean up the empty classes left behind:

//Strip Empty Classes
add_filter ('wp_nav_menu','strip_empty_classes');
function strip_empty_classes($menu) {
    $menu = preg_replace('/ class=(["\'])(?!active).*?\1/','',$menu);
    return $menu;
}
查看更多
成全新的幸福
6楼-- · 2019-03-08 16:20

My solution:

$defaults = array(
    'theme_location'  => '',
    'menu'            => '',
    'container'       => '',
    'container_class' => '',
    'container_id'    => '',
    'menu_class'      => '',
    'menu_id'         => '',
    'echo'            => false, // param important
    'fallback_cb'     => 'wp_page_menu',
    'before'          => '',
    'after'           => '',
    'link_before'     => '',
    'link_after'      => '',
    'items_wrap'      => '',
    'depth'           => -1,
    'walker'          => ''
);

ob_start();
echo preg_replace( '#<li[^>]+>#', '<li>', wp_nav_menu( $defaults ) );
$mainNav = ob_get_clean();

// In the page :
echo $mainNav;
查看更多
在下西门庆
7楼-- · 2019-03-08 16:22

You should be able to remove them by hooking into a couple of filters and returning empty arrays or strings rather than new classes or ids:

add_filter('nav_menu_css_class', 'my_css_attributes_filter', 100, 1);
add_filter('nav_menu_item_id', 'my_css_attributes_filter', 100, 1);
add_filter('page_css_class', 'my_css_attributes_filter', 100, 1);
function my_css_attributes_filter($var) {
  return is_array($var) ? array() : '';
}

If you wanted to keep particular classes you could do something like this:

function my_css_attributes_filter($var) {
  return is_array($var) ? array_intersect($var, array('current-menu-item')) : '';
}
查看更多
登录 后发表回答