Extend the WordPress Menu
as add_filter, how-to, WordPress, wp_list_categories, wp_list_pages, wp_nav_menu, wp_nav_menu_items, wp_page_menu
I have written several posts regarding the use of the wp_nav_menu() function. I have written about its uses, its implementation, and even an older post regarding (some of) the CSS classes it generates. This post continues with an idea for extending the wp_nav_menu() function by adding additional items to the menu list with code versus the user interface found in the Administration Panels, such as automagically adding a self-propagating list of categories.
This idea is not necessarily new but finding an example may be a bit more difficult. Let’s have a look …
First off, there are several sources of information regarding wp_nav_menu() to take into consideration:
- The WordPress codex reference.
- The “core.trac.wordpress.org” reference.
- This web site’s references.
Each of these links will open in a new tab/window for convenience purposes.
Now that we have a list of reading material we should actually take a look at it …
- The first reference leads to the WordPress codex and provides the standard parameters that can be used with wp_nav_menu().
- The next reference and the experience that was offered by Ian Stewart from ThemeShaper.com is the real key to solving this little puzzle.
- The last reference simply leads to the wp_nav_menu() tag archive here.
I would suggest at least having a quick look at those pages before carrying on to the next page, especially the one referencing the wp_nav_menu() function in the “core”, or primary code base of WordPress, as you will find a very relevant comment there.
Let’s start by focusing on the following code snippet as found in the “core” reference:
// Allow plugins to hook into the menu to add their own <li>'s
$items = apply_filters( 'wp_nav_menu_items', $items, $args );
$items = apply_filters( "wp_nav_menu_{$menu->slug}_items", $items, $args );
$nav_menu .= $items;
The beauty of this little snippet is it shows, with the use of the wp_nav_menu_item filter, you can add specific items to the menu output if the end-user has chosen to create a custom menu. Let’s look at an example that will allow you to add a “Home” page link to the beginning of the menu.
If you add the following to your ‘functions.php’ template file it will add a home link to your wp_nav_menu() output:
// Filter wp_nav_menu() to add additional links and other output
function new_nav_menu_items($items) {
$homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
$items = $homelink . $items;
return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items' );
The basic premise of the function is:
- Assign your desired output to a variable
- Concatenate the output variable with the $items variable
- Return the $items variable so it can be used in the filter
- Add the results of the function to wp_nav_menu_items with an add_filter() function
If you wish to use this when a custom menu is not being used just add the following (or similar) filter after the above code:
add_filter( 'wp_list_pages', 'new_nav_menu_items' );
But what if we wanted to add something to the end of the menu output, such as a RSS feed link, or maybe just some random text or a static URL link. Let’s look at the following example which expands upon the code above to do just that.
// Filter wp_nav_menu() to add additional links and other output
function new_nav_menu_items($items) {
$homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
$feedlink = '<li class="feed"><a href="' . get_bloginfo_rss('rss2_url') . '">' . __('RSS') . '</a></li>';
$random_text = '<li class="rainbows"><a href="#">OMG ... Double Rainbows!</a></li>';
$items = $homelink . $items;
$items = $items . $feedlink;
$items = $items . $random_text;
return $items;
}
add_filter( 'wp_list_pages', 'new_nav_menu_items' );
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items' );
There always seems to be some new way to add more uses to the core functions in WordPress and I like to find, explore and write about them. I often implement them in the First Aid Theme, as I have done by using the above example code to add a “Home” link to the menu. On the next page I will leave you with one more example, the one I referred to in the opening paragraph.
Although this was a bit more involved it really did not make that much of a difference in the case of implementing this in a custom menu so without further ado here is the code snippet:
function new_nav_menu_items($items) {
$cat_menu_list = wp_list_categories( 'echo=0&title_li=&child_of=124' );
$items = $items . $cat_menu_list;
return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items' );
If you are trying this at home make back-ups of your files, just in case you want to revert your edits. Your category list hierarchy may need to be noted as well.
The key to this snippet is the wp_list_categories() by default will echo its results to the screen, you will have to set the parameter ‘echo=0′ to turn off this default behavior.
As for using this technique for categories with a non-custom menu I will leave that as an exercise for those looking for a challenge … Enjoy!
- Share this:
- Share
Upgrade wp_list_categories() to wp_nav_menu()
in Functions
as how-to, WordPress, wp_list_categories, wp_nav_menu
In this third installment in the upgrade to wp_nav_menu() series of posts, I will be dealing with moving from wp_list_categories() to wp_nav_menu().
Let’s start with the same basic outline and list the default options for each function. We will start with wp_nav_menu() 1 first:
wp_nav_menu( array(
'menu' => '',
'container' => 'div',
'container_class' => '',
'container_id' => '',
'menu_class' => 'menu',
'menu_id' => '',
'echo' => true,
'fallback_cb' => 'wp_page_menu',
'before' => '',
'after' => '',
'link_before' => '',
'link_after' => '',
'depth' => 0,
'walker' => '',
'theme_location' => ''
) );
We follow with wp_list_categories() 2, 3 which is often wrapped in a <ul class=”menu”> tag:
<ul class="menu">
wp_list_categories( array(
'include' => '',
'exclude' => '',
'exclude_tree' => '',
'child_of' => 0,
'hide_empty' => 1,
'orderby' => 'name',
'order' => 'ASC',
'use_desc_for_title'=> 1,
'number' => NULL,
'hierarchical' => true,
'show_count' => 0,
'pad_counts' => 0,
'style' => 'list',
/* 'style' set to list "creates list items for an unordered list" */
'show_option_all' => '',
'show_option_none' => __('No categories'),
'show_last_update' => 0,
'feed' => '',
'feed_type' => '',
'feed_image' => '',
'current_category' => 0,
'taxonomy' => 'category',
'title_li' => __( '' ),
/* 'title_li' set to '' for menus from the default 'Categories' */
'echo' => 1,
'depth' => 0,
'walker' => 'Walker_Category'
) );
</ul>
Here is the break-down of the wp_list_categories() default options from above:
'include'– not used'exclude'– not used'exclude_tree'– not used'child_of'– not used'hide_empty'– not used'orderby'– not used'order'– not used'use_desc_for_title'– not used'number'– not used'hierarchical'– not used'show_count'– not used'pad_counts'– not used'style'– not used'show_option_all'– not available'show_option_none'– not available'show_last_update'– not available'feed'– not available'feed_type'– not available'feed_image'– not available'current_category'– not available'taxonomy'– not available'title_li'– not used'echo'– similar to wp_nav_menu(); true versus 1 as value'depth'– same as wp_nav_menu()'walker'– see below for additional notes
Although there are great many options available to be used with wp_list_categoires() most are not used (as noted in the list above) in place of the user interface of wp_nav_menu() found under Appearance | Menu in the dashboard. The options that are marked as “not available” are currently not directly supported by wp_nav_menu() without the application of filters. The last few options remaining match up almost exactly with wp_page_nav() in a similar fashion as was shown with wp_list_pages().
Just like the wp_list_pages() consideration, the wp_nav_menu() fallback_cb option may be set to 'fallback_cb' => 'wp_list_categories'. This backward compatibility may also be addressed with a custom function as was noted, too.
Note: In most cases you would leave the wp_nav_menu() 'walker' option set to its default NULL although wp_list_categories() uses its own default walker class.
- Share this:
- Share
Going Home
as bloginfo, get_bloginfo, WordPress, wp_list_categories, wp_list_pages, wp_page_menu
Examples of adding a home page link to a WordPress theme with code that can be easily copied and pasted.
- Share this:
- Share


