Data Label on WordPress Navigation
- 17th August 2016
- Tutorials
- 3:06 reading time (ish)
- 590 words
Hey guys, I thought this might be of interest – nothing more than a code dump. If you have any questions or suggestions please leave a comment below!
This code snippet allows you to add data-labels to your WordPress (wp_nav_menu) navigation items. Why would you want to do this? In my particular case, I’m using it as a ‘hover state’ for a client build – When the user hovers over a menu item, the data-label scrolls in as the menu item scrolls out creating a nice little effect.
Just a heads up, this code was made on a random ‘light bulb’ moment so the code could do with some cleaning up! (I’ll get round to it eventually ;-))
HTML:
<ul id="mainMenu"> <li class="menu-item current_page_item"> <a href="URL HERE"> <span data-label="Home"> Home </span> </a> </li> </ul>
CSS:
nav ul li a span { display: inline-block; position: relative; -webkit-transition: -webkit-transform .3s ease; -moz-transition: -moz-transform .3s ease; -o-transition: -o-transform .3s ease; -ms-transition: -ms-transform .3s ease; transition: transform .3s ease; } nav ul li a span:after { content: attr(data-label); display: block; position: absolute; width: 100%; top: 100%; left: 0; opacity: 0; color: #fff; transition: opacity .3s ease; -webkit-transition: opacity .3s ease; -moz-transition: opacity .3s ease; -o-transition: opacity .3s ease; -ms-transition: opacity .3s ease; } nav ul li:hover a span:after { opacity: 1; } nav ul li:hover a span { -webkit-transform: translate(0px,-100%); -moz-transform: translate(0px,-100%); -o-transform: translate(0px,-100%); -ms-transform: translate(0px,-100%); transform: translate(0px,-100%); }
Add the following into your functions.php
class description_walker extends Walker_Nav_Menu { function start_el(&$output, $item, $depth, $args) { global $wp_query; $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; $class_names = $value = ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) ); $class_names = ' class="'. esc_attr( $class_names ) . '"'; $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $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 ) .'"' : ''; if($depth != 0) { $description = $append = $prepend = ""; } $item_output = $args->before; $item_output .= '<a'. $attributes .'>'; $item_output .= '<span data-label="'.esc_attr( $item->description ) .'">'; $item_output .= $args->link_before .apply_filters( 'the_title', $item->title, $item->ID ); $item_output .= '</span>'; $item_output .= '</a>'; $item_output .= $args->after; $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); } }
Add this into your header.php
<?php $defaults = array( 'theme_location' => '', 'container' => 'div', 'menu_class' => 'menu', 'echo' => true, 'fallback_cb' => 'wp_page_menu', 'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>', 'depth' => 0, 'walker' => new description_walker() ); wp_nav_menu( $defaults ); ?>
Next, just add a ‘Description’ to each Menu Item via the Appearance > Menu admin page (if you can’t see the option, look top-right, toggle ‘Screen options’ and check ‘Description’).
Voila!
Thoughts? Comments?