Skip to content

Instantly share code, notes, and snippets.

@ebinion
Last active December 16, 2015 18:39
Show Gist options
  • Save ebinion/5479067 to your computer and use it in GitHub Desktop.
Save ebinion/5479067 to your computer and use it in GitHub Desktop.
Custom walker for nav menus, I personally don't like having a million classes added to my html. So all the fluff is cut. You'll still have access to the menu classes added in the admin menu, 'current-menu-item', and 'menu-item.' It's basically a modified version of the built-in Walker.
<?php
// Custom walker for nav menus, I personally don't like having a million classes added to my html. So all the fluff is cut. You'll still have access to the menu classes added in the admin menu, 'current-menu-item', and 'menu-item'
class ECB_Walker_Nav_Menu extends Walker {
/**
* @see Walker::$tree_type
* @since 3.0.0
* @var string
*/
var $tree_type = array( 'post_type', 'taxonomy', 'custom' );
/**
* @see Walker::$db_fields
* @since 3.0.0
* @todo Decouple this.
* @var array
*/
var $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' );
/**
* @see Walker::start_lvl()
* @since 3.0.0
*
* @param string $output Passed by reference. Used to append additional content.
* @param int $depth Depth of page. Used for padding.
*/
function start_lvl( &$output, $depth = 0, $args = array() ) {
$indent = str_repeat("\t", $depth);
$output .= "\n$indent<ul class=\"sub-menu\">\n";
}
/**
* @see Walker::end_lvl()
* @since 3.0.0
*
* @param string $output Passed by reference. Used to append additional content.
* @param int $depth Depth of page. Used for padding.
*/
function end_lvl( &$output, $depth = 0, $args = array() ) {
$indent = str_repeat("\t", $depth);
$output .= "$indent</ul>\n";
}
/**
* @see Walker::start_el()
* @since 3.0.0
*
* @param string $output Passed by reference. Used to append additional content.
* @param object $item Menu item data object.
* @param int $depth Depth of menu item. Used for padding.
* @param int $current_page Menu item ID.
* @param object $args
*/
function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$class_names = $value = '';
// $classes = empty( $item->classes ) ? array() : (array) $item->classes;
$classes[] = $item->classes[0];
$classes[] = 'menu-item';
// $classes[] = 'menu-item-' . $item->ID;
// I really like the "current-menu_item" class, let's figure out if that exists
if( array_search("current-menu-item", $item->classes) != false){
$classes[] = "current-menu-item";
}
$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
$class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
$id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
// $output .= $indent . '<li' . $id . $value . $class_names .'>';
$output .= $indent . '<li' . $class_names . '>';
$attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : '';
$attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : '';
$attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : '';
$attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : '';
$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
$item_output .= '</a>';
$item_output .= $args->after;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
/**
* @see Walker::end_el()
* @since 3.0.0
*
* @param string $output Passed by reference. Used to append additional content.
* @param object $item Page data object. Not used.
* @param int $depth Depth of page. Not Used.
*/
function end_el( &$output, $item, $depth = 0, $args = array() ) {
$output .= "</li>\n";
}
}
@ebinion
Copy link
Author

ebinion commented Apr 29, 2013

Just a wanring if you're using this Gist: This Walker doesn't seem to be taking multiple clase names from the admin menu.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment