{"id":327004,"date":"2026-06-17T05:56:51","date_gmt":"2026-06-17T05:56:51","guid":{"rendered":"https:\/\/en-ca.wordpress.org\/plugins\/admin-menu-maestro\/"},"modified":"2026-06-17T18:43:49","modified_gmt":"2026-06-17T18:43:49","slug":"maestro-menu-editor","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/maestro-menu-editor\/","author":240675,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.1","stable_tag":"1.1.1","tested":"7.0","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"Maestro: The Inline Admin Menu Editor","header_author":"Dan Knauss","header_description":"In-place editing of the WordPress admin menu \u2014 rename items, reorder them, swap top-level icons, and hide items per role. Cosmetic only: hiding declutters, it does not lock access.","assets_banners_color":"3e4e47","last_updated":"2026-06-17 18:43:49","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/github.com\/sponsors\/dknauss","header_plugin_uri":"https:\/\/github.com\/dknauss\/Maestro\/","header_author_uri":"https:\/\/dan.knauss.ca\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":47,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"dpknauss","date":"2026-06-17 05:56:12"},"1.1.0":{"tag":"1.1.0","author":"dpknauss","date":"2026-06-17 14:52:56"},"1.1.1":{"tag":"1.1.1","author":"dpknauss","date":"2026-06-17 18:43:49"}},"upgrade_notice":{"1.1.1":"<p>Minor editor UI tidy: the item-name label is now screen-reader-only and the\nreset buttons are &quot;Reset Item&quot; \/ &quot;Reset All&quot;. No configuration changes.<\/p>","1.1.0":"<p>Keyboard-accessible reordering, a live &quot;modified&quot; indicator, solid bundled\nicons, native dashicon save-status, and responsive\/edit-mode polish. No\nconfiguration changes required.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3575264,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3575264,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3575264,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3575264,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3575264,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","1.1.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3575264,"resolution":"1","location":"assets","locale":"","width":1440,"height":980},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3575264,"resolution":"2","location":"assets","locale":"","width":1440,"height":980},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3575264,"resolution":"3","location":"assets","locale":"","width":1440,"height":980},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3575264,"resolution":"4","location":"assets","locale":"","width":1440,"height":980}},"screenshots":{"1":"Editing the admin menu in place \u2014 the Posts item selected, with the shared controls panel (rename, icon, visibility, reset) open.","2":"The icon picker: searchable Dashicons and bundled Bootstrap Icons tabs for swapping a top-level admin menu icon.","3":"Per-role visibility \u2014 hiding an admin menu item from selected roles (a cosmetic declutter, not access control).","4":"A renamed admin menu item, saved automatically by debounced autosave."}},"plugin_section":[],"plugin_tags":[3720,161293,178983,27279,150596],"plugin_category":[50],"plugin_contributors":[261826],"plugin_business_model":[],"class_list":["post-327004","plugin","type-plugin","status-publish","hentry","plugin_tags-admin-menu","plugin_tags-admin-menu-editor","plugin_tags-hide-menu-items","plugin_tags-menu-editor","plugin_tags-menu-icons","plugin_category-media","plugin_contributors-dpknauss","plugin_committers-dpknauss"],"banners":{"banner":"https:\/\/ps.w.org\/maestro-menu-editor\/assets\/banner-772x250.png?rev=3575264","banner_2x":"https:\/\/ps.w.org\/maestro-menu-editor\/assets\/banner-1544x500.png?rev=3575264","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/maestro-menu-editor\/assets\/icon.svg?rev=3575264","icon":"https:\/\/ps.w.org\/maestro-menu-editor\/assets\/icon.svg?rev=3575264","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/maestro-menu-editor\/assets\/screenshot-1.png?rev=3575264","caption":"Editing the admin menu in place \u2014 the Posts item selected, with the shared controls panel (rename, icon, visibility, reset) open."},{"src":"https:\/\/ps.w.org\/maestro-menu-editor\/assets\/screenshot-2.png?rev=3575264","caption":"The icon picker: searchable Dashicons and bundled Bootstrap Icons tabs for swapping a top-level admin menu icon."},{"src":"https:\/\/ps.w.org\/maestro-menu-editor\/assets\/screenshot-3.png?rev=3575264","caption":"Per-role visibility \u2014 hiding an admin menu item from selected roles (a cosmetic declutter, not access control)."},{"src":"https:\/\/ps.w.org\/maestro-menu-editor\/assets\/screenshot-4.png?rev=3575264","caption":"A renamed admin menu item, saved automatically by debounced autosave."}],"raw_content":"<!--section=description-->\n<p><strong>Maestro is an inline admin menu editor.<\/strong> Instead of a separate settings\nscreen, it turns the WordPress admin menu into something you edit <em>in place<\/em> \u2014\nright where it lives. Toggle <strong>Edit Menu<\/strong> from the admin bar and the menu\nbecomes editable: click a label to rename it, drag rows to reorder, swap a\ntop-level icon, or hide items from chosen roles.<\/p>\n\n<p><strong>Try it first.<\/strong> Launch a throwaway demo in\n<a href=\"https:\/\/playground.wordpress.net\/?blueprint-url=https:\/\/raw.githubusercontent.com\/dknauss\/Maestro\/main\/playground\/blueprint-hosted.json\">WordPress Playground<\/a>\n\u2014 it boots a site with Maestro active, User Switching, and test users (editor,\nauthor, contributor, subscriber; password <code>password<\/code>) so you can try per-role\nvisibility by switching users before you install anything.<\/p>\n\n<h4>What you can do<\/h4>\n\n<ul>\n<li><strong>Rename<\/strong> any top-level or submenu item \u2014 just click the label.<\/li>\n<li><strong>Reorder<\/strong> items by dragging (top-level items among themselves, submenu items\nwithin their parent), or with the keyboard (<code>Alt<\/code>+<code>Arrow<\/code>).<\/li>\n<li><strong>Swap icons<\/strong> on top-level items. The picker offers dashicons and bundled\nBootstrap Icons with search, and accepts any of WordPress's four native icon\nforms (dashicon, \"none\", base64 image data-URI, or an image URL).<\/li>\n<li><strong>Hide<\/strong> items from chosen roles \u2014 including administrators. Custom roles\nregistered by other plugins\n(<a href=\"https:\/\/wordpress.org\/plugins\/user-role-editor\/\">User Role Editor<\/a>,\n<a href=\"https:\/\/wordpress.org\/plugins\/members\/\">Members<\/a>, etc.) appear automatically.<\/li>\n<li><strong>Reset<\/strong> a single item to its WordPress default, or reset everything at once.<\/li>\n<\/ul>\n\n<p>Changes are <strong>global<\/strong> \u2014 one configuration applies to everyone \u2014 and are stored\nas a sparse delta layered over the menu WordPress builds on each load. Nothing\nis rebuilt or duplicated, so a reset simply removes the delta and the original\nmenu returns.<\/p>\n\n<h4>Important: visibility is cosmetic, not access control<\/h4>\n\n<p>Hiding a menu item only declutters the menu. The underlying admin page still\nloads for anyone who knows or types its URL, because a page's own registered\n<strong>capability<\/strong> is the true lock. Maestro operates on the menu (presentation),\nwhich is a different plane from authorization.<\/p>\n\n<p>If you need to actually <em>prevent<\/em> access, pair Maestro with a capability manager:<\/p>\n\n<ul>\n<li><strong><a href=\"https:\/\/wordpress.org\/plugins\/user-role-editor\/\">User Role Editor<\/a><\/strong> \u2014 the\nsimplest way to edit what a role can do.<\/li>\n<li><strong><a href=\"https:\/\/wordpress.org\/plugins\/capability-manager-enhanced\/\">PublishPress Capabilities<\/a><\/strong> \u2014\nmenu-aware; its Pro tier can block admin pages by URL.<\/li>\n<\/ul>\n\n<p>The <code>maestro_capability<\/code> filter lets such a plugin hand editing rights to a\ncustom capability instead of the default <code>manage_options<\/code>.<\/p>\n\n<h4>Accessibility and localization<\/h4>\n\n<p>The editor is keyboard-operable end to end \u2014 select with <code>Enter<\/code>\/<code>Space<\/code>,\nreorder with <code>Alt<\/code>+<code>Arrow<\/code>, and every move and save is announced to screen\nreaders. Modified items carry a non-color indicator with screen-reader text, so\nstate never depends on color alone.<\/p>\n\n<p>Maestro uses the <code>maestro-menu-editor<\/code> text domain and ships a translation\ntemplate plus starter language packs for Spanish (<code>es_ES<\/code>), German (<code>de_DE<\/code>),\nJapanese (<code>ja<\/code>), French (<code>fr_FR<\/code>), Portuguese \u2013 Brazil (<code>pt_BR<\/code>), and Italian\n(<code>it_IT<\/code>). WordPress.org language packs override and extend these; native-speaker\nand WordPress Polyglots review is welcome.<\/p>\n\n<h3>Architecture (for developers)<\/h3>\n\n<ul>\n<li><code>Config<\/code> \u2014 reads\/writes\/sanitizes a single option (<code>maestro_config<\/code>) holding only\nthe deltas. Reset = delete the option; the natural menu returns automatically.<\/li>\n<li><code>Replay<\/code> \u2014 on a late <code>admin_menu<\/code> pass, applies rename\/icon\/visibility to the\n  $menu\/<code>$submenu<\/code> globals and reorders submenus. Top-level order uses the\ncore <code>custom_menu_order<\/code> + <code>menu_order<\/code> filters. Resilient to missing slugs\n(orphans are skipped) and new items (appended at the end).<\/li>\n<li><code>Rest<\/code> \u2014 <code>maestro\/v1\/config<\/code> (GET\/POST\/DELETE), capability-gated, <code>X-WP-Nonce<\/code>.<\/li>\n<li>The editor JS is driven by a localized model (with DOM ids), not DOM scraping,\nand diffs against captured pristine defaults so the stored config stays sparse.<\/li>\n<li>Localized editor labels are passed from PHP to JavaScript in <code>maestroData.i18n<\/code>;\nthe runtime zip includes the bundled POT template and starter catalogs.<\/li>\n<\/ul>\n\n<h3>Known limits \/ deferred to v2<\/h3>\n\n<ul>\n<li><strong>Reparenting<\/strong> (moving an item between a top-level position and a submenu) is\nnot included. Top-level items reorder among top-level items and submenu items\nreorder within their current parent. Reparenting needs hand-splicing of the\nglobals plus <code>parent_file<\/code>\/<code>submenu_file<\/code> highlighting fixes \u2014 a known\nminefield, parked deliberately.<\/li>\n<li><strong>Separators<\/strong> are preserved in place but not yet add\/move\/delete-able; their\ngenerated slugs (<code>separator1<\/code>\u2026) have no stable identity to key against.<\/li>\n<li><strong>Renaming<\/strong> an item drops any core-appended count badge (e.g. pending\ncomments) from that label, since the badge lives inside the title string.<\/li>\n<li>Submenu sort relies on items registering by the late <code>admin_menu<\/code> pass; a\nplugin that registers submenus on an unusually late hook may not be captured.<\/li>\n<\/ul>\n\n<h3>Credits<\/h3>\n\n<p>Bundled <a href=\"https:\/\/icons.getbootstrap.com\/\">Bootstrap Icons<\/a> are \u00a9 The Bootstrap\nAuthors, licensed under the MIT License. They are recoloured to the WordPress\nmenu grey and embedded as data-URIs; see <code>bin\/generate-bootstrap-icons.mjs<\/code>.<\/p>\n\n<h3>Support This Plugin<\/h3>\n\n<p>If Maestro saves you time, you can support its ongoing maintenance through\n<a href=\"https:\/\/github.com\/sponsors\/dknauss\">GitHub Sponsors<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In your dashboard go to <strong>Plugins \u2192 Add New<\/strong>, search for \"Maestro: The\nInline Admin Menu Editor\", and click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<li>Or upload the plugin zip via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>, then\nactivate it.<\/li>\n<li>Or, manually: unzip into <code>wp-content\/plugins\/maestro-menu-editor<\/code> and\nactivate from <strong>Plugins<\/strong>.<\/li>\n<li>After activating, click <strong>Edit Menu<\/strong> in the admin bar to start editing the\nadmin menu in place.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20hiding%20a%20menu%20item%20block%20access%20to%20that%20page%3F\"><h3>Does hiding a menu item block access to that page?<\/h3><\/dt>\n<dd><p>No \u2014 and this is important. Hiding an item is <strong>cosmetic<\/strong>: it removes the link\nfrom the admin menu but does not stop anyone from reaching the page by typing or\nbookmarking its URL. Real access is governed by each page's registered\ncapability. To actually block a page, use a capability manager such as\n<a href=\"https:\/\/wordpress.org\/plugins\/user-role-editor\/\">User Role Editor<\/a> or\n<a href=\"https:\/\/wordpress.org\/plugins\/capability-manager-enhanced\/\">PublishPress Capabilities<\/a>.<\/p><\/dd>\n<dt id=\"do%20my%20changes%20affect%20everyone%2C%20or%20just%20me%3F\"><h3>Do my changes affect everyone, or just me?<\/h3><\/dt>\n<dd><p>Everyone. Maestro stores one global configuration that applies to all users; it\nis not per-user. Per-role <em>visibility<\/em> lets you hide items from specific roles,\nbut the rename\/reorder\/icon changes themselves are global.<\/p><\/dd>\n<dt id=\"can%20i%20hide%20items%20from%20administrators%20too%3F\"><h3>Can I hide items from administrators too?<\/h3><\/dt>\n<dd><p>Yes. Role visibility includes the administrator role, so you can declutter an\nadmin's menu \u2014 remembering that this is cosmetic, not a permission change.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20custom%20roles%20from%20other%20plugins%3F\"><h3>Does it work with custom roles from other plugins?<\/h3><\/dt>\n<dd><p>Yes. Any role registered on the site \u2014 including custom roles from User Role\nEditor, Members, and similar plugins \u2014 appears automatically in the visibility\ncontrol.<\/p><\/dd>\n<dt id=\"is%20the%20editor%20keyboard%20accessible%3F\"><h3>Is the editor keyboard accessible?<\/h3><\/dt>\n<dd><p>Yes. You can select, rename, reorder (<code>Alt<\/code>+<code>Arrow<\/code>), open the icon and\nvisibility controls, and reset items without a mouse. Saves and moves are\nannounced to screen readers.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20deactivate%20or%20reset%20the%20plugin%3F\"><h3>What happens when I deactivate or reset the plugin?<\/h3><\/dt>\n<dd><p>The admin menu returns to exactly what WordPress and your active plugins\ngenerate. Your customizations live in a single option as a sparse delta;\n<strong>Reset all<\/strong> deletes that option, and deactivating the plugin stops it from\nbeing applied.<\/p><\/dd>\n<dt id=\"can%20i%20move%20an%20item%20between%20a%20top-level%20position%20and%20a%20submenu%3F\"><h3>Can I move an item between a top-level position and a submenu?<\/h3><\/dt>\n<dd><p>Not yet. Reparenting is deliberately deferred (see \"Known limits\" below).\nTop-level items reorder among top-level items, and submenu items reorder within\ntheir current parent.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Editor: the selected item's name is now screen-reader-only \u2014 the visible\nbreadcrumb duplicated the rename field and ate horizontal space, and the\ncontrols are self-explanatory. Screen-reader users still get the item \/\nsubmenu context.<\/li>\n<li>Editor: shorter reset button labels \u2014 \"Reset Item\" and \"Reset All\".<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Keyboard reordering: select a menu item then press <code>Alt+ArrowUp<\/code> \/\n  Alt+ArrowDown to move it. Each move is announced to screen readers (politely\nfor success, assertively when already at the boundary). No mouse required.<\/li>\n<li>Modified indicator: changed items show a non-color glyph (\u2022) with screen-\nreader text \"(modified)\" in edit mode. The indicator refreshes live on every\nrename, icon change, visibility change, and reset.<\/li>\n<li>Discoverable per-item reset: the <strong>Reset this item<\/strong> button in the controls\npanel is now keyboard-reachable (Tab + Enter\/Space) and is visually\nemphasised whenever the selected item has unsaved overrides.<\/li>\n<li>Solid bundled icons: the Bootstrap Icons set now uses solid (<code>*-fill<\/code>)\nvariants, so it mixes naturally with WordPress's dashicons in the picker.<\/li>\n<li>Edit-mode polish: clearer toolbar grouping, a more scannable icon grid, and a\ndismissible first-run hint.<\/li>\n<li>Native save status: the saving \/ saved \/ error states now use WordPress\ndashicons (a spinner, a check, a warning) instead of emoji glyphs that some\nplatforms recoloured or dropped; the idle state shows no icon.<\/li>\n<li>Fixes: the saved status no longer renders a double check mark; the rename\nfield no longer shifts as the title length changes; toolbar controls wrap\ninstead of overlapping on narrow screens.<\/li>\n<li>Listing: rewritten description and FAQ, plus a \"Try it first\" link to a live\nWordPress Playground demo.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: rename, reorder, per-role visibility, reset.<\/li>\n<li>Icons: accepts all four native WordPress forms (dashicon, none, base64 image\ndata-URI, image URL); picker bundles dashicons + curated Bootstrap Icons with\nsearch, keyboard accessibility, and mobile-sized touch targets.<\/li>\n<li>Editor: click-to-select with a shared panel, debounced single-flight autosave,\nand folded-mode neutralization.<\/li>\n<\/ul>","raw_excerpt":"Rename, reorder, re-icon, and hide WordPress admin menu items per role \u2014 an inline admin menu editor you drive right on the menu itself.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/327004","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=327004"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/dpknauss"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=327004"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=327004"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=327004"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=327004"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=327004"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=327004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}