There are many plugins and code snippets for adding an entire navigation menu to a page in WordPress, but what if you want to add only a single submenu? Here we have for you a code snippet that provides a shortcode to do just that. You can add this to your theme’s functions.php file.
add_filter( 'wp_nav_menu_objects', 'submenu_limit', 10, 2 ); function submenu_limit( $items, $args ) { if ( empty($args->submenu) ) { return $items; } $parent_id = array_pop( wp_filter_object_list( $items, array( 'title' => $args->submenu ), 'and', 'ID' ) ); $children = submenu_get_children_ids( $parent_id, $items ); foreach ( $items as $key => $item ) { if ( ! in_array( $item->ID, $children ) ) { unset($items[$key]); } } return $items; } function submenu_get_children_ids( $id, $items ) { $ids = wp_filter_object_list( $items, array( 'menu_item_parent' => $id ), 'and', 'ID' ); foreach ( $ids as $id ) { $ids = array_merge( $ids, submenu_get_children_ids( $id, $items ) ); } return $ids; } add_shortcode('navigation_menu','navigation_menu'); function navigation_menu($atts,$content){ $atts = shortcode_atts( array( 'menu_class' => 'menu', 'menu' => '', 'submenu' => '', 'before' => '', 'after' => '', 'container' => 'div', 'container_class' => '', 'depth' => '', 'echo' => false ), $atts ); $content = wp_nav_menu( array( 'menu' => sanitize_text_field($atts['menu']), 'submenu' => sanitize_text_field($atts['submenu']), 'before' => $atts['before'], 'after' => $atts['after'], 'menu_class' => sanitize_text_field($atts['menu_class']), 'container' => sanitize_text_field($atts['container']), 'container_class' => sanitize_text_field($atts['container_class']), 'depth' => sanitize_text_field($atts['depth']), 'echo' => false ) ); return $content; }
Usage:
[navigation_menu menu="Menu" submenu="Projects"]
“menu” would be the name of the navigation menu, and “submenu” would be the title of the submenu. Note that the submenu variable is case-sensitive, so if the title of a submenu is “PROJECTS” for example, you would need to put it that way in the shortcode. Here are some other options you can use:
before or after: Code to place before or after each submenu item
menu_class: CSS class to use for the submenu list
container: Type of container for the submenu, for example, defaults to div
container_class: CSS class to use for the submenu container
depth: Number of levels deep you wish to go into the submenu
We hope this code snippet is useful!