Nav Menu Roles
by HelgaTheViking 4.9 (219 reviews)

Nav Menu Roles

Hide custom menu items based on user roles.

Nav Menu Roles ranks #606 among WordPress.org plugins with 70,000+ active installations, is #92 of 8,848 in the Customization category, a 4.9/5 rating from 219 reviews, and was last updated Oct 30, 2026. Data from WordPress.org, refreshed twice daily — see methodology.

Compatible with WP 7.1.0
v3.0.0 Current Version v3.0.0
Updated 1 week ago Last Update on 30 Oct, 2026
Refreshed 6 days ago Last Refreshed on
#92 of 8,848 in Customization Top 1% by installs Downloads -78.3% this week Actively maintained
View on WordPress.org
Rank
#606
— No change
Active Installs
70K+
-3.3%
KW Avg Position
6
— No change
Downloads
1.8M
+46 today
Support Resolved
100%
— No change
Rating
98%
Review 4.9 out of 5
4.9 (219 reviews)

Next Milestone 80K

Total Progress 13.8%
70K+ 80K+
56
Ranks to Climb
-
Growth Needed
8,000,000
Active Installs
Pro

Unlock Exact Install Count

See the precise estimated active installs for this plugin, calculated from real-time ranking data.

  • Exact install estimates within tiers
  • Track install growth over time
  • Milestone progress predictions
Upgrade to Pro
Need 8,616 more installs to reach 80K+

Rank Changes

576 591 606 621 636 31-10-2026 01-11-2026 02-11-2026 03-11-2026 04-11-2026 05-11-2026 06-11-2026 07-11-2026
575 590 606 622 637 23-10-2026 24-10-2026 25-10-2026 26-10-2026 27-10-2026 28-10-2026 29-10-2026 30-10-2026 31-10-2026 01-11-2026 02-11-2026 03-11-2026 04-11-2026 05-11-2026 06-11-2026 07-11-2026
Current #606
Change
Best #

Upgrade to Pro

Unlock 30-day and 90-day rank history charts with a Pro subscription.

Upgrade Now

Active Installs Growth

Active Installs 0,000,000+
Growth +0.0%
Peak 0,000,000

Downloads Growth

0 200 400 600 800 1K 1.2K 1.4K 31-10-2026 01-11-2026 02-11-2026 03-11-2026 04-11-2026 05-11-2026 06-11-2026 07-11-2026
0 5K 10K 15K 20K 23-10-2026 24-10-2026 25-10-2026 26-10-2026 27-10-2026 28-10-2026 29-10-2026 30-10-2026 31-10-2026 01-11-2026 02-11-2026 03-11-2026 04-11-2026 05-11-2026 06-11-2026 07-11-2026
Downloads
Growth
Peak

Upgrade to Pro

Unlock 30-day, 90-day, and yearly download history charts with a Pro subscription.

Upgrade Now

Reviews & Ratings

4.9
219 reviews
Overall 98%
5
213 (97%)
4
2 (1%)
3
1 (0%)
2
0 (0%)
1
3 (1%)

Support Threads Overview

Resolved
Unresolved
1
Total Threads
1
Resolved
0
Unresolved
100%
Resolution Rate

Security History

Source: WPVulnerability

No known vulnerabilities on record for Nav Menu Roles. Checked 2 weeks ago.

TL;DR

AI summary of the plugin's readme

This plugin is for WordPress site owners who use custom navigation menus and want to control visibility based on user roles. It solves the problem of showing or hiding menu items for logged in users, logged out users, or specific roles, without restricting access to the underlying content.

  • Hide menu items by user role
  • Show items to logged in users
  • Show items to logged out users
  • Display Mode set to everyone
  • Custom role checkboxes via filter
  • nav_menu_roles_item_visibility filter
  • Check user meta and capabilities
  • Minimum role visibility requirement

Frequently Asked Questions

Common questions about Nav Menu Roles

Block themes, such as Twenty Twenty-Five, use the Navigation block instead of classic menus, so WordPress hides Appearance > Menus. Since version 3.0.0, the Nav Menu Roles settings are in the Site Editor instead: Go to Appearance > Editor > Navigation and edit your menu. Select a link or submenu. In the block settings sidebar, open the "Nav Menu Roles" panel. The settings work the same way as for classic menus. Hiding a submenu also hides all of the links inside it. Links generated automatically by the Page List block cannot be restricted. Classic themes still use Appearance > Menus.
Nav Menu Roles adds its options through the wp_nav_menu_item_custom_fields hook, which has been part of WordPress since 5.4. If a theme or plugin replaces the menu editor's Walker and leaves that hook out, no plugin can add fields there. To check, switch to a default theme and disable other plugins one at a time. If you find the conflict, ask its author to include the core wp_nav_menu_item_custom_fields hook. Visibility on the front end still works while the options are missing, so you can also switch themes temporarily to edit the settings, then switch back.
There are apparently a few membership plugins out there that don't use traditional WordPress roles/capabilities. My plugin will list any role registered in the traditional WordPress way. If your membership plugin is using some other system, then Nav Menu Roles won't work with it out of the box. Since 1.3.5 I've added a filter called nav_menu_roles_item_visibility just before my code decides whether to show/hide a menu item. There's also always been the nav_menu_roles filter which lets you modify the roles listed in the admin. Between these two, I believe you have enough to integrate Nav Menu Roles with any membership plugin. Here's an example where I've added a new pseudo role, creatively called "new-role". The first function adds it to the menu item admin screen. The second function is pretty generic and won't actually do anything because you need to supply your own logic based on the plugin you are using. Nav Menu Roles will save the new "role" info and add it to the item in an array to the $item->roles variable. Existing Compatibility Plugins Wishlists Memberships WooCommerce Memberships If your membership plugin is not listed here, you may be able to use the above bridge plugins as a template. Scroll down to the bottom of the main plugin file and you will see a section for "Helper Functions". If you modify the 3 wrapper functions according to your membership plugin's logic, the rest of the plugin should handle the integration with Nav Menu Roles. Adding a new "role" The roles in NMR are filterable distinct from the global $wp_roles. This allows for compatibility to be added between plugins that don't use the core roles to determine access, like some membership plugins. /** * Add custom roles to Nav Menu Roles menu list * param: $roles an array of all available roles, by default is global $wp_roles * return: array */ function kia_new_roles( $roles ) { $roles['new-role-key'] = 'new-role'; return $roles; } add_filter( 'nav_menu_roles', 'kia_new_roles' ); Note, if you want to add a WordPress capability the above is literally all you need. Because Nav Menu Roles checks whether a role has permission to view the menu item using current_user_can($role) you do not need to right a custom callback for thenav_menu_roles_item_visibility` filter. In case you do need to check your visibility status against something very custom, here is how you'd go about it: /** * Change visibility of each menu item * @param bool $visible * @param obj $item The complete menu object. Nav Menu Roles adds its info to the following keys { * roles - Possible value: "in" (all logged in) | "out" (all logged out) | an array of specific roles, ex: [ "administrator", "editor" ] * display_mode - Possible values: "show" (show if conditions met) | "hide" (hide if conditions met) * return boolean */ function kia_item_visibility( $visible, $item ) { if ( isset( $item->roles ) && is_array( $item->roles ) && in_array( 'new-role-key', $item->roles ) ) { /* if ( // your own custom check on the current user versus 'new-role' status ) { $visible = true; } else { $visible = false; } */ } return $visible; } add_filter( 'nav_menu_roles_item_visibility', 'kia_item_visibility', 10, 2 ); Note that you have to generate your own if/then logic. I can't provide free support for custom integration with another plugin. You may contact me to discuss hiring me, or I would suggest using a plugin that supports WordPress' roles, such as Justin Tadlock's Members. Sort the roles alphabetically Add the following snippet to your theme's functions.php file: /* * Sort the NMR roles * @param: $roles an array of all available roles with ID=>Name * @return: array */ function kia_sort_roles( $roles ) { if ( is_admin() ) { $array_lowercase = array_map( 'strtolower', $roles ); array_multisort( $array_lowercase, SORT_ASC, SORT_STRING, $roles ); return $roles; } } add_filter( 'nav_menu_roles', 'kia_sort_roles' );
If every item in your menu is configured to display to logged in users (either all logged in users, or by specific role), then when a logged out visitor comes to your site there are no items in the menu to display. wp_nav_menu() will then try check its fallback_cb argument... which defaults to wp_page_menu. Therefore, if you have no items to display, WordPress will end up displaying ALL your pages!! If you don't want this, you must set the fallback argument to be a null string. wp_nav_menu( array( 'theme_location' => 'primary-menu', 'fallback_cb' => '' ) ); You must do this for every effected instance of wp_nav_menu() in your theme templates. It is not possible for me to tell you where they are located, but header.php is a very common location for the main menu. Alternatively, you could do this universally by adding the following snippet to your child theme's function.php file or by adding it via the Code Snippets plugin: /** * Disables the fallback page menu for all menus * * @param array $args Array of wp_nav_menu() arguments. * @return array */ function kia_nav_menu_args( $args ) { $args['fallback_cb'] = ''; return $args; } add_filter( 'wp_nav_menu_args', 'kia_nav_menu_args' );
The Nav Menu Roles plugin stores 1 piece of post meta to every menu item/post. This is exported just fine by the default Export tool.
Go to Tools>Export, choose to export All Content and download the Export file Go to Tools>Import on your new site and perform your normal WordPress import Return to Tools>Import and this time select the Nav Menu Roles importer. Use the same .xml file and perform a second import No duplicate posts will be created but all menu post meta (including your Nav Menu Roles info) will be imported
Yes, but manually. WPML developers have informed me that the meta data for nav menu items is not synced by WPML, meaning that menus copied into a new language will not bring their custom Nav Menu Roles settings. However, if you manually reconfigure the settings, the new language menu will work as expected.

More plugins by HelgaTheViking

Sign In / Register

You need to sign in or register to use this feature.