How to Add Schema Markup for Navigation Menu

Categories:

Recently I’m implementing schema.org markup structure for my website and and into all of our premium theme to provide our customer for great website experience with SEO ready template. So if you wanted to know how to add schema markup for navigation menu in WordPress website without any plugin then here are very simple steps for you. I’m using WordPress Walker navigation PHP code to implement this so it can help you to better understand.

Before you add schema markup for navigation menu make sure you takes the backup of website and theme data. To prevent any trouble later.

How to Add Schema Markup for Navigation Menu

Add Schema Markup for Navigation Menu

First a simple HTML code helps you to understand how toย add schema markup for navigation menu and how it works.

<nav itemscope itemtype="http://schema.org/SiteNavigationElement">
<ul>
<li>
<a href="https://www.insertcart.com/" itemprop="url"><span itemprop="name">Home</span></a>
</li>
<li>
<a href="https://www.insertcart.com/category/wordpress/" itemprop="url"><span itemprop="name">Tutorials</span></a>
</li>
<li>
<a href="https://www.insertcart.com/pricing/" itemprop="url"><span itemprop="name">Pricing</span></a>
</li>
<li>
<a href="https://www.insertcart.com/contact-us/" itemprop="url"><span itemprop="name">Contact Us</span></a>
</li>
</ul>
</nav>

Above code is for html now moving on WordPress PHP code. First we need to add navigation walker function to theme function.php also readย How to Add Icon Navigation Menu

/**
* Custom walker class.
*/
class bigrush_Walker_Nav_Menu extends Walker_Nav_Menu {
/**
* Starts the list before the elements are added.
*
* Adds classes to the unordered list sub-menus.
*
* @param string $output Passed by reference. Used to append additional content.
* @param int $depth Depth of menu item. Used for padding.
* @param array $args An array of arguments. @see wp_nav_menu()
*/
function start_lvl( &$output, $depth = 0, $args = array() ) {
// Depth-dependent classes.
$indent = ( $depth > 0 ? str_repeat( "\t", $depth ) : โ€ ); // code indent
$display_depth = ( $depth + 1); // because it counts the first submenu as 0
$classes = array(
โ€˜sub-menuโ€™,
( $display_depth % 2 ? โ€˜menu-oddโ€™ : โ€˜menu-evenโ€™ ),
( $display_depth >=2 ? โ€˜sub-sub-menuโ€™ : โ€ ),
โ€˜menu-depth-โ€˜ . $display_depth
);
$class_names = implode( โ€˜ โ€˜, $classes );

// Build HTML for output.
$output .= "\n" . $indent . โ€˜<ul class="โ€™ . $class_names . โ€˜">โ€™ . "\n";
}

/**
* Start the element output.
*
* Adds main/sub-classes to the list items and links.
*
* @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 array $args An array of arguments. @see wp_nav_menu()
* @param int $id Current item ID.
*/
function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
global $wp_query;
$indent = ( $depth > 0 ? str_repeat( "\t", $depth ) : โ€ ); // code indent

// Depth-dependent classes.
$depth_classes = array(
( $depth == 0 ? โ€˜main-menu-itemโ€™ : โ€˜sub-menu-itemโ€™ ),
( $depth >=2 ? โ€˜sub-sub-menu-itemโ€™ : โ€ ),
( $depth % 2 ? โ€˜menu-item-oddโ€™ : โ€˜menu-item-evenโ€™ ),
โ€˜menu-item-depth-โ€˜ . $depth
);
$depth_class_names = esc_attr( implode( โ€˜ โ€˜, $depth_classes ) );

// Passed classes.
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$class_names = esc_attr( implode( โ€˜ โ€˜, apply_filters( โ€˜nav_menu_css_classโ€™, array_filter( $classes ), $item ) ) );

// Build HTML.
$output .= $indent . โ€˜<li id="nav-menu-item-โ€˜. $item->ID . โ€˜" class="โ€™ . $depth_class_names . โ€˜ โ€˜ . $class_names . โ€˜">โ€™;

// Link attributes.
$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 ) .โ€™"โ€™ : โ€;
$attributes .= โ€˜ itemprop="url" class=" menu-link โ€˜ . ( $depth > 0 ? โ€˜sub-menu-linkโ€™ : โ€˜main-menu-linkโ€™ ) . โ€˜"โ€™;

// Build HTML output and pass through the proper filter.
$item_output = sprintf( โ€˜%1$s<a%2$s><span itemprop="name">%3$s%4$s%5$s</span></a>%6$sโ€™,
$args->before,
$attributes,
$args->link_before,
apply_filters( โ€˜the_titleโ€™, $item->title, $item->ID ),
$args->link_after,
$args->after
);
$output .= apply_filters( โ€˜walker_nav_menu_start_elโ€™, $item_output, $item, $depth, $args );
}
}

 

Now search for wp_nav_menu your main navigation for WordPress some times located in header.php file code will be something like this.

<?php wp_nav_menu(); ?>

Now replace this code with below this will call your walker from function.php to theme and Important to add schema markup for navigation menu.

<?php wp_nav_menu( array( 'walker' => new insertcart_Walker_Nav_Menu() ) ); ?>

That’s all we have done editing now you SIteNavigationElement should work fine check into google testing tool. If wanted to SEO optimized theme please Browser our Themes Storeย 

Comments

10 responses to “How to Add Schema Markup for Navigation Menu”

  1. Puria Rad Jahanbani Avatar

    Is there any way for adding itemprop=”url” to menu without adding walker ?

  2. Bican Marian Valeriu Avatar

    I’ve implemented schema using your example on my theme that i’ve developed.
    Example here: http://framework.wecodeart.com/lorem-ipsum-demo-post/
    So far i have no errors when tested with Google Tool. Thanks for the tutorial.

    1. Sandy Avatar

      That’s good

  3. Jeremy Bray Avatar
    Jeremy Bray

    Could you tell me how to make this a plugin as the site is not installed with child theme, hence changing header.php, functions.php etc is futile.

    1. Sandy Avatar

      actually plugin are already available but some times doesn’t works that the reason I put as code not as plugin.

  4. Jeremy Bray Avatar
    Jeremy Bray

    forgot to subscribe

  5. DARS Photography Avatar
    DARS Photography

    I’m going to use your example to implement these on my website. Hope all goes well! ๐Ÿ™‚ Thank you for the example. I ran into this after doing quite a bit of research.

  6. Brian Avatar
    Brian

    Umm.. says “error on line 24: syntax error, unexpected ‘โ€˜’ (T_STRING)”

    1. Olli Avatar
      Olli

      Had the same problem. Cause was a Copy&Paste Error to my editor regarding the ‘ characters in the code. I needed to replace all occurrences of ยด and ` with the character ‘.

Leave a Reply

Your email address will not be published. Required fields are marked *