{"id":339771,"date":"2026-07-14T23:15:16","date_gmt":"2026-07-14T23:15:16","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/effortless-layered-menu-visibility\/"},"modified":"2026-07-14T23:15:04","modified_gmt":"2026-07-14T23:15:04","slug":"effortless-layered-menu-visibility","status":"publish","type":"plugin","link":"https:\/\/ca.wordpress.org\/plugins\/effortless-layered-menu-visibility\/","author":23148025,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.10","stable_tag":"1.0.10","tested":"7.0.1","requires":"5.0","requires_php":"","requires_plugins":null,"header_name":"EffortLess Layered Menu Visibility","header_author":"Layered","header_description":"Control menu item visibility with user, device, and page-based rules effortlessly.","assets_banners_color":"9e9e9e","last_updated":"2026-07-14 23:15:04","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/id7.dev\/donate\/","header_plugin_uri":"","header_author_uri":"","rating":5,"author_block_rating":0,"active_installs":0,"downloads":31,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","changelog"],"tags":{"1.0.10":{"tag":"1.0.10","author":"domclic","date":"2026-07-14 23:15:04"}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.jpg":{"filename":"icon-128x128.jpg","revision":3608585,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.jpg":{"filename":"icon-256x256.jpg","revision":3608585,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3608585,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3608585,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.10"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[4060,1865,1753,2153,6309],"plugin_category":[43],"plugin_contributors":[241557],"plugin_business_model":[],"class_list":["post-339771","plugin","type-plugin","status-publish","hentry","plugin_tags-conditional","plugin_tags-menu","plugin_tags-navigation","plugin_tags-user","plugin_tags-visibility","plugin_category-customization","plugin_contributors-domclic","plugin_committers-domclic"],"banners":{"banner":"https:\/\/ps.w.org\/effortless-layered-menu-visibility\/assets\/banner-772x250.jpg?rev=3608585","banner_2x":"https:\/\/ps.w.org\/effortless-layered-menu-visibility\/assets\/banner-1544x500.jpg?rev=3608585","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/effortless-layered-menu-visibility\/assets\/icon-128x128.jpg?rev=3608585","icon_2x":"https:\/\/ps.w.org\/effortless-layered-menu-visibility\/assets\/icon-256x256.jpg?rev=3608585","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Control which menu items are shown based on login status, user role, device type, page type, or archive context. Rules are configured directly in the WordPress nav-menu editor and evaluated on every page load.<\/p>\n\n<!--section=changelog-->\n<h4>1.0.10<\/h4>\n\n<ul>\n<li>Fix: renamed the donate-notice class to the plugin's own ELLMV_ prefix (Plugin Check flagged the shared, un-prefixed class name).<\/li>\n<li>Fix: corrected @package doc tag casing to EffortLess (capital L), matching the plugin's display name.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>Fix: corrected \"Contributors\" in readme.txt to the actual WordPress.org owner username.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Add: donate notice on the Menus admin screen.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Fix: removed load_plugin_textdomain() call (discouraged since WP 4.6; translations load automatically).<\/li>\n<li>Fix: removed \"Domain Path\" header pointing to a non-existent \/languages folder.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Fix: removed duplicate Plugin URI\/Author URI header values flagged by the plugin review team.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Update: Confirmed compatibility with WordPress 7.0.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Update: plugin display name corrected to EffortLess Layered Menu Visibility.<\/li>\n<li>Update: Tested up to WordPress 7.0.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Add: children of a hidden parent menu item are now also hidden (cascades to any nesting depth).<\/li>\n<li>Add: uninstall.php removes all _ellmv_visibility_rules post meta when the plugin is deleted.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fix: translations never loaded because load_textdomain was registered on plugins_loaded from inside a plugins_loaded callback; now called directly.<\/li>\n<li>Remove: stale bug-reference comments from PHP and JS files.<\/li>\n<li>Refactor: hoist wp_get_current_user() above the rule loop in is_menu_item_visible().<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: Front-end filtering was completely inert \u2014 add_custom_fields hook moved out of admin_init so it fires on the public front-end.<\/li>\n<li>Fix: Shared POST field names caused every menu item to inherit all other items' rules on save; field names are now scoped per item ID.<\/li>\n<li>Fix: PHP translation call inside the static JS file is now delivered via wp_localize_script.<\/li>\n<li>Fix: \"Add Rule\" with no existing rules produced an empty type select; options are now built from server-provided data.<\/li>\n<li>Fix: Value '0' was silently dropped by empty(), making boolean negation (not logged-in, not mobile, not archive) impossible.<\/li>\n<li>Fix: JS rule index collision after a removal could overwrite a surviving rule on save; replaced with a monotonic counter.<\/li>\n<li>Fix: Missing wp_unslash() before sanitize_text_field() on $_POST values.<\/li>\n<li>Fix: Boolean rule types now use a Yes\/No select and compare against '1'\/'0' instead of relying on PHP bool cast of an arbitrary string.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Control menu item visibility with user, device, and page-based rules effortlessly.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/339771","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=339771"}],"author":[{"embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/domclic"}],"wp:attachment":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=339771"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=339771"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=339771"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=339771"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=339771"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=339771"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}