{"id":276870,"date":"2026-01-23T12:16:38","date_gmt":"2026-01-23T12:16:38","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/menupilot\/"},"modified":"2026-03-15T16:36:11","modified_gmt":"2026-03-15T16:36:11","slug":"menupilot","status":"publish","type":"plugin","link":"https:\/\/dv.wordpress.org\/plugins\/menupilot\/","author":10765507,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.20","stable_tag":"1.0.20","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"MenuPilot \u2013 Preview-First Menu Import & Export","header_author":"Mayank Majeji","header_description":"Safely import and export WordPress navigation menus with a preview-first workflow. Review and map menus before importing.","assets_banners_color":"5344f4","last_updated":"2026-03-15 16:36:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/mayankmajeji\/menupilot","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":10,"downloads":557,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"mayankmajeji","date":"2026-01-23 12:16:30"},"1.0.12":{"tag":"1.0.12","author":"mayankmajeji","date":"2026-03-14 22:48:23"},"1.0.13":{"tag":"1.0.13","author":"mayankmajeji","date":"2026-03-14 22:56:24"},"1.0.14":{"tag":"1.0.14","author":"mayankmajeji","date":"2026-03-15 07:10:24"},"1.0.15":{"tag":"1.0.15","author":"mayankmajeji","date":"2026-03-15 07:15:34"},"1.0.16":{"tag":"1.0.16","author":"mayankmajeji","date":"2026-03-15 07:38:14"},"1.0.17":{"tag":"1.0.17","author":"mayankmajeji","date":"2026-03-15 16:18:21"},"1.0.18":{"tag":"1.0.18","author":"mayankmajeji","date":"2026-03-15 16:24:10"},"1.0.19":{"tag":"1.0.19","author":"mayankmajeji","date":"2026-03-15 16:23:38"},"1.0.2":{"tag":"1.0.2","author":"mayankmajeji","date":"2026-01-23 12:20:29"},"1.0.20":{"tag":"1.0.20","author":"mayankmajeji","date":"2026-03-15 16:36:11"},"1.0.21":{"tag":"1.0.21","author":"mayankmajeji","date":"2026-03-15 17:45:56"},"1.0.3":{"tag":"1.0.3","author":"mayankmajeji","date":"2026-02-11 16:35:22"}},"upgrade_notice":{"1.0.13":"<p>*<\/p>","1.0.5":"<p>Fixes the backup tab showing all menus&#039; backups combined, misleading stats counts, and native browser confirm dialogs in the backup panel.<\/p>","1.0.4":"<p>Backups are now stored in a dedicated database table for better performance. Existing backups in <code>wp_options<\/code> are automatically migrated on first admin page load after updating.<\/p>","1.0.3":"<p>Backup &amp; Restore, Import\/Export History Logs, and UI improvements.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3445554,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3445554,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3445878,"resolution":"1544x500","location":"assets","locale":""},"banner-772-250.png":{"filename":"banner-772-250.png","revision":3445980,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3483233,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=menupilot-settings\",\"login\":true,\"features\":{\"networking\":true},\"preferredVersions\":{\"php\":\"latest\",\"wp\":\"latest\"},\"steps\":[{\"step\":\"installPlugin\",\"options\":{\"activate\":true},\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"menupilot\"}}]}"}},"all_blocks":[],"tagged_versions":["1.0.1","1.0.12","1.0.13","1.0.14","1.0.15","1.0.16","1.0.17","1.0.18","1.0.19","1.0.2","1.0.20","1.0.21","1.0.3"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3445554,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3445554,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3445554,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3459132,"resolution":"4","location":"assets","locale":""}},"screenshots":{"1":"Menu import screen","2":"Menu export screen","3":"Main Settings screen","4":"Import preview and mapping screen","5":"Backup &amp; Restore section on Menus page","6":"History page"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[181032,231,4155,1753],"plugin_category":[43,59],"plugin_contributors":[189513],"plugin_business_model":[],"class_list":["post-276870","plugin","type-plugin","status-publish","hentry","plugin_tags-import-export","plugin_tags-menus","plugin_tags-migration","plugin_tags-navigation","plugin_category-customization","plugin_category-utilities-and-tools","plugin_contributors-mayankmajeji","plugin_committers-mayankmajeji"],"banners":{"banner":"https:\/\/ps.w.org\/menupilot\/assets\/banner-772-250.png?rev=3445980","banner_2x":"https:\/\/ps.w.org\/menupilot\/assets\/banner-1544x500.png?rev=3445878","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/menupilot\/assets\/icon-128x128.png?rev=3445554","icon_2x":"https:\/\/ps.w.org\/menupilot\/assets\/icon-256x256.png?rev=3445554","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/menupilot\/assets\/screenshot-1.png?rev=3445554","caption":"Menu import screen"},{"src":"https:\/\/ps.w.org\/menupilot\/assets\/screenshot-2.png?rev=3445554","caption":"Menu export screen"},{"src":"https:\/\/ps.w.org\/menupilot\/assets\/screenshot-3.png?rev=3445554","caption":"Main Settings screen"},{"src":"https:\/\/ps.w.org\/menupilot\/assets\/screenshot-4.png?rev=3459132","caption":"Import preview and mapping screen"}],"raw_content":"<!--section=description-->\n<p>MenuPilot is a focused menu import and export plugin designed to help you move <strong>one menu at a time<\/strong> between WordPress sites with confidence.<\/p>\n\n<p>Unlike basic import tools, MenuPilot shows you exactly what will happen <strong>before anything is imported<\/strong>. You can review the menu structure, see which items match existing content, resolve missing items, and proceed only when everything is clear.<\/p>\n\n<p>This makes MenuPilot ideal for moving menus from <strong>staging to production<\/strong>, local development to live sites, or between similar environments \u2014 without overwriting existing menus or breaking links silently.<\/p>\n\n<h3>What MenuPilot Does<\/h3>\n\n<ul>\n<li>Exports a single navigation menu as a JSON file<\/li>\n<li>Imports a menu as a <strong>new menu<\/strong> (never overwrites existing menus)<\/li>\n<li>Provides a full <strong>preview and mapping screen before import<\/strong><\/li>\n<li>Intelligently matches menu items to existing content<\/li>\n<li>Preserves menu hierarchy, order, and metadata<\/li>\n<li>Replaces source site URLs with destination site URLs automatically<\/li>\n<li>Creates automatic backups before menu updates and imports<\/li>\n<li>Logs all import and export actions for accountability<\/li>\n<\/ul>\n\n<h3>What MenuPilot Does Not Support<\/h3>\n\n<ul>\n<li><strong>Multisite<\/strong> \u2014 Each subsite is managed independently; cross-site menu copying is not supported<\/li>\n<li><strong>Bulk export\/import<\/strong> \u2014 MenuPilot handles one menu at a time by design<\/li>\n<li><strong>Mega menu metadata<\/strong> \u2014 Custom fields added by mega menu plugins are not preserved<\/li>\n<li><strong>WP-CLI<\/strong> \u2014 No command-line interface; all operations are performed in the admin UI<\/li>\n<li><strong>Scheduled\/automated imports<\/strong> \u2014 Imports are triggered manually; no cron or automation support<\/li>\n<li><strong>Media files<\/strong> \u2014 Images referenced in menu items are not bundled in exports<\/li>\n<li><strong>Non-standard menu item types<\/strong> \u2014 Only core WordPress types (post, page, taxonomy, custom link) are supported<\/li>\n<\/ul>\n\n<h3>Features<\/h3>\n\n<ul>\n<li>Backup &amp; Restore:\n\n<ul>\n<li>Automatic backups before every menu update and import<\/li>\n<li>Manual backup creation from the Menus page<\/li>\n<li>One-click restore to any previous backup<\/li>\n<li>Export backups as JSON for portability<\/li>\n<li>Configurable backup limit (Backup Settings tab)<\/li>\n<\/ul><\/li>\n<li>Import\/Export History Logs:\n\n<ul>\n<li>Dedicated History page under MenuPilot menu<\/li>\n<li>Logs who, when, and what for every import\/export<\/li>\n<li>Download logs as JSON or plain text<\/li>\n<li>Clear history with confirmation<\/li>\n<\/ul><\/li>\n<li>Export individual menus (JSON format)<\/li>\n<li>Import one menu at a time as a new menu<\/li>\n<li>Preview screen before import showing:\n\n<ul>\n<li>Menu name<\/li>\n<li>Total menu items<\/li>\n<li>Source site URL<\/li>\n<li>Export timestamp<\/li>\n<li>Matched and unmatched items<\/li>\n<\/ul><\/li>\n<li>Intelligent auto-matching of menu items using:\n\n<ul>\n<li>Post type + slug<\/li>\n<li>Taxonomy + slug<\/li>\n<li>Normalized custom links<\/li>\n<\/ul><\/li>\n<li>Manual mapping override per menu item<\/li>\n<li>Clear warnings for:\n\n<ul>\n<li>Missing pages, posts, or taxonomies<\/li>\n<li>Items converted to custom links<\/li>\n<li>Theme location availability<\/li>\n<\/ul><\/li>\n<li>Automatic home URL replacement during import<\/li>\n<li>Preserves:\n\n<ul>\n<li>Menu hierarchy<\/li>\n<li>Menu order<\/li>\n<li>CSS classes<\/li>\n<li>Link attributes (target, rel)<\/li>\n<li>Descriptions<\/li>\n<\/ul><\/li>\n<li>Visual import progress and clear success\/error messages<\/li>\n<li>Native WordPress admin UI (no custom frameworks)<\/li>\n<\/ul>\n\n<h3>Requirements<\/h3>\n\n<ul>\n<li>WordPress 5.8 or higher<\/li>\n<li>PHP 7.4 or higher<\/li>\n<li>Classic WordPress menu system<\/li>\n<\/ul>\n\n<h3>Configuration<\/h3>\n\n<p>MenuPilot requires no configuration to start using. Once activated, you can immediately export and import menus.<\/p>\n\n<p>Optional: Go to <strong>MenuPilot \u2192 Settings<\/strong> and open the <strong>Backup<\/strong> tab to configure the maximum number of backups to keep per menu (default: 5).<\/p>\n\n<h3>Usage<\/h3>\n\n<h3>Backup &amp; Restore<\/h3>\n\n<ol>\n<li>When editing a menu, scroll to the <strong>MenuPilot Backup &amp; Restore<\/strong> section below the menu form.<\/li>\n<li>Use the <strong>Backup<\/strong> tab to create manual backups, restore previous versions, or export backups as JSON.<\/li>\n<li>Use the <strong>Import<\/strong> tab to import a previously exported backup JSON file.<\/li>\n<li>Backups are also created automatically before every menu save and before every import.<\/li>\n<\/ol>\n\n<h3>History Logs<\/h3>\n\n<ol>\n<li>Navigate to <strong>MenuPilot \u2192 History<\/strong> in the WordPress admin.<\/li>\n<li>View all import and export actions with user, timestamp, menu name, and outcome.<\/li>\n<li>Use the <strong>Filter<\/strong> button to narrow results by date range or user.<\/li>\n<li>Download logs as JSON or plain text for record-keeping or auditing.<\/li>\n<li>Use <strong>Clear History<\/strong> to remove all log entries (with confirmation). Export first if you need a backup.<\/li>\n<\/ol>\n\n<h3>Exporting a Menu<\/h3>\n\n<ol>\n<li>Navigate to <strong>MenuPilot \u2192 Export Menu<\/strong> in the WordPress admin.<\/li>\n<li>Select the menu you want to export from the dropdown.<\/li>\n<li>Click the \"Export Menu\" button.<\/li>\n<li>A JSON file will be downloaded to your computer.<\/li>\n<li>Save this file for importing to another site.<\/li>\n<\/ol>\n\n<h3>Importing a Menu<\/h3>\n\n<ol>\n<li>Navigate to <strong>MenuPilot \u2192 Import Menu<\/strong> in the WordPress admin.<\/li>\n<li>Click \"Choose File\" and select a previously exported JSON file.<\/li>\n<li>Click \"Upload &amp; Preview\" to see what will be imported.<\/li>\n<li>Review the preview screen:\n\n<ul>\n<li>Check menu name (you can edit it)<\/li>\n<li>Review matched and unmatched items<\/li>\n<li>Manually map items if needed<\/li>\n<li>Remove items you don't want to import<\/li>\n<li>Optionally assign the menu to a theme location<\/li>\n<\/ul><\/li>\n<li>Click \"Import Menu\" to complete the import.<\/li>\n<li>The menu will be created as a new menu (existing menus are never overwritten).<\/li>\n<\/ol>\n\n<h3>Important Notes<\/h3>\n\n<ul>\n<li>MenuPilot always imports menus as <strong>new menus<\/strong> - it never overwrites existing menus.<\/li>\n<li>Always review the preview screen before importing to ensure items are matched correctly.<\/li>\n<li>Unmatched items will be converted to custom links automatically.<\/li>\n<li>You can manually map items to different content using the \"Map To\" dropdown in the preview.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/menupilot<\/code>, or install via the WordPress Plugins screen.<\/li>\n<li>Activate the plugin through the \u201cPlugins\u201d screen.<\/li>\n<li>Go to <strong>MenuPilot<\/strong> in the WordPress admin menu to access the plugin.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20menupilot%20overwrite%20existing%20menus%3F\"><h3>Does MenuPilot overwrite existing menus?<\/h3><\/dt>\n<dd><p>No. MenuPilot always imports menus as new menus. Existing menus are never overwritten.<\/p><\/dd>\n<dt id=\"can%20i%20preview%20changes%20before%20importing%3F\"><h3>Can I preview changes before importing?<\/h3><\/dt>\n<dd><p>Yes. MenuPilot shows a detailed preview screen before import, including matched and unmatched items. Nothing is imported until you confirm.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20menu%20item%20cannot%20be%20matched%3F\"><h3>What happens if a menu item cannot be matched?<\/h3><\/dt>\n<dd><p>Unmatched items are clearly shown in the preview. You can manually map them to existing content or explicitly keep them as custom links.<\/p><\/dd>\n<dt id=\"does%20menupilot%20support%20multisite%3F\"><h3>Does MenuPilot support multisite?<\/h3><\/dt>\n<dd><p>Multisite support is not currently available, but may be added in future versions.<\/p><\/dd>\n<dt id=\"does%20menupilot%20support%20xml%20imports%20or%20bulk%20exports%3F\"><h3>Does MenuPilot support XML imports or bulk exports?<\/h3><\/dt>\n<dd><p>No. MenuPilot supports JSON format only and exports one menu at a time.<\/p><\/dd>\n<dt id=\"when%20are%20backups%20created%3F\"><h3>When are backups created?<\/h3><\/dt>\n<dd><p>Backups are created automatically before every menu update (including native menu edits) and before every import. You can also create manual backups from the Backup section on the Menus page.<\/p><\/dd>\n<dt id=\"where%20can%20i%20view%20import%20and%20export%20history%3F\"><h3>Where can I view import and export history?<\/h3><\/dt>\n<dd><p>Go to <strong>MenuPilot \u2192 History<\/strong> to view all import and export actions. You can filter by date and user, and download logs as JSON or plain text.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.13<\/h4>\n\n<p>*<\/p>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Fixed: backup tab now correctly shows only backups for the selected menu (was showing all menus' backups combined)<\/li>\n<li>Fixed: backup stats now reflect the current menu's count only, not the total across all menus<\/li>\n<li>Fixed: restore, delete, and delete-all backup actions now use the plugin's confirm modal instead of the browser's native confirm dialog<\/li>\n<li>Improved: backup list now loads user data in a single batch query (eliminates N+1 database queries)<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Backups are now stored in a dedicated <code>wp_menupilot_backups<\/code> database table instead of <code>wp_options<\/code>, eliminating serialized blob bloat and improving query performance<\/li>\n<li>Auto-backup on menu save now correctly captures the state after WordPress finishes processing all item changes (adds, updates, deletes)<\/li>\n<li>Fixed: restoring an older backup after restoring a newer one now correctly removes items that were deleted between saves<\/li>\n<li>Removed unused frontend stylesheet and script \u2014 MenuPilot is admin-only and ships no frontend assets<\/li>\n<li>Existing backups stored in <code>wp_options<\/code> are automatically migrated to the new table on first admin page load after update<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Backup &amp; Restore: automatic backups before menu updates and imports<\/li>\n<li>Manual backup creation, one-click restore, and export backups as JSON<\/li>\n<li>Backup Settings tab to configure maximum backups per menu<\/li>\n<li>Import\/Export History Logs: dedicated History page with filter and download (JSON\/plain text)<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>UI improvements and bug fixes<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Menu export (JSON)<\/li>\n<li>Preview-first menu import with intelligent matching<\/li>\n<li>Manual mapping and clear import feedback<\/li>\n<\/ul>","raw_excerpt":"Safely import and export WordPress navigation menus with a preview-first workflow. Review and map menus before importing.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/276870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=276870"}],"author":[{"embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mayankmajeji"}],"wp:attachment":[{"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=276870"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=276870"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=276870"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=276870"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=276870"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=276870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}