Swift Menu Duplicator

Description

Swift Menu Duplicator gives you full control over your WordPress navigation menus. Clone any menu in one click, manage all menus from a dedicated admin page, version them with snapshots, move them across Multisite sub-sites, and automate everything from the command line or REST API.

One-Click Duplication

  • Duplicate button right in the menu editor footer — no page reload required
  • Full hierarchy preserved via a two-pass clone that remaps all parent-child item IDs
  • All item metadata copied — type, object, URL, target, CSS classes, XFN, description
  • Duplicate individual menu items directly from the menu editor
  • Custom name support — filter swift_menu_duplicator_new_menu_name to override the default “(Copy)” suffix

Snapshot Revisions

  • Auto-snapshot — a snapshot is saved automatically before every menu save
  • Manual snapshots — save named snapshots from the menu editor at any time
  • Browse & restore — view all snapshots in an expandable panel and restore with one click; the pre-restore state is snapshotted first
  • Housekeeping — delete individual snapshots you no longer need

Menu Manager (Appearance Menu Manager)

  • Dedicated page listing every menu on the site in a sortable WP_List_Table
  • Bulk duplicate — clone multiple menus at once
  • Bulk export — download selected menus as a single ZIP archive
  • Bulk delete — remove multiple menus in one action
  • Row actions — duplicate or export individual menus directly from the list

JSON Export / Import

  • Export any menu to a portable JSON file (via admin or REST API)
  • Import from a JSON file upload or paste JSON directly into the text area
  • URL find & replace — swap domain names during import for staging production migrations
  • Dry-run preview — review what will be imported before making any changes to the database

Deletion Safety

  • Deleting a menu — from the Menu Manager, the row action, or the Delete Menu button in the editor — captures it first
  • An Undo link appears while the deletion is still recoverable (one hour by default, filterable)
  • Restoring recreates the menu and its items and puts it back in the theme locations it occupied

Block Themes

  • Duplicate, export, and import the Navigation menus block themes actually render (wp_navigation posts), not just classic menus
  • A dedicated Navigation (Block) tab in the Menu Manager, with per-row Duplicate and Export JSON plus bulk duplicate and trash
  • Link counts per menu, and one-click access to the Site Editor
  • Available from WP-CLI and the REST API alongside the classic-menu commands

Multisite Support

  • Copy any menu to another site in your WordPress Multisite network
  • Optional URL find & replace applied to item URLs on the destination site

REST API

Full REST API at /wp-json/swift-menu-duplicator/v1/ for headless and block-editor integrations:

  • POST /menus/{id}/duplicate — duplicate a menu (optional name parameter)
  • GET /menus/{id}/export — export a menu as a JSON payload
  • POST /menus/{id}/items/{item_id}/duplicate — duplicate a single menu item
  • POST /menus/import — import a menu from an export payload
  • GET /menus/{id}/snapshots — list snapshots
  • POST /menus/{id}/snapshots — save a snapshot
  • POST /menus/{id}/snapshots/{snapshot_id} — restore a snapshot
  • DELETE /menus/{id}/snapshots/{snapshot_id} — delete a snapshot
  • GET /navigations — list block navigation menus
  • POST /navigations/{id}/duplicate — duplicate a block navigation menu
  • GET /navigations/{id}/export — export a block navigation menu
  • POST /navigations/import — import a block navigation menu

Permission is controlled by the swift_menu_duplicator_rest_permission filter (defaults to edit_theme_options).

WP-CLI

Full command-line support under the wp swift-menu-duplicator command group:

  • wp swift-menu-duplicator duplicate <menu-id> [--name=<name>] — duplicate a menu
  • wp swift-menu-duplicator export <menu-id> [--output=<file>] — export to JSON
  • wp swift-menu-duplicator import <file> [--name=<name>] [--find=<str>] [--replace=<str>] [--dry-run] [--porcelain] — import from JSON
  • wp swift-menu-duplicator copy-to-site <menu-id> --target-blog=<id> [--name=<name>] [--find=<str>] [--replace=<str>] — copy to a sub-site
  • wp swift-menu-duplicator snapshot list|save|restore|delete <menu-id> [--label=<label>] [--id=<uuid>] — manage snapshots
  • wp swift-menu-duplicator navigation list|duplicate|export|import [<id-or-file>] [--title=<title>] [--output=<file>] — block navigation menus

Multilingual Compatibility

  • WPML — translation meta keys (_icl_lang_duplicate_of, wpml_language, etc.) are stripped from duplicated items automatically
  • Polylang — language meta keys (_pll_synced_taxonomies, _pll_menu_language, etc.) are stripped from duplicated items automatically
  • Additional keys can be excluded via the swift_menu_duplicator_compat_excluded_meta_keys filter

Developer Hooks

  • swift_menu_duplicator_new_menu_name — customise the default duplicate name
  • swift_menu_duplicator_rest_permission — control REST API access
  • swift_menu_duplicator_before_duplicate_item / swift_menu_duplicator_after_duplicate_menu_item — fired around item duplication
  • swift_menu_duplicator_after_import_menu — fired after a successful import
  • swift_menu_duplicator_before_restore_snapshot / swift_menu_duplicator_after_restore_snapshot — fired around a snapshot restore
  • swift_menu_duplicator_after_undo_delete — fired after a deleted menu is restored
  • swift_menu_duplicator_undo_ttl / swift_menu_duplicator_undo_limit — how long deletions stay recoverable, and how many are kept
  • swift_menu_duplicator_item_meta_keys — control which meta keys are copied
  • swift_menu_duplicator_compat_excluded_meta_keys — extend the multilingual meta exclusion list
  • wp_update_nav_menu — triggers auto-snapshot before every menu save

Security

  • All AJAX actions verified with nonces and edit_theme_options capability checks
  • All output escaped; all input sanitized
  • Database queries use $wpdb->prepare() — no string concatenation
  • REST API permission is filterable but defaults to edit_theme_options
  • WordPress Filesystem API used for all file read/write/delete operations

Requirements

  • WordPress 6.0 or higher
  • PHP 7.4 or higher
  • User with edit_theme_options capability

Screenshots

Installation

  1. Upload the swift-menu-duplicator directory to /wp-content/plugins/.
  2. Activate the plugin through Plugins Installed Plugins.
  3. Go to Appearance Menus, select a menu, and click Duplicate Menu in the footer.
  4. For bulk management, snapshots, and import, visit Appearance Menu Manager.

FAQ

Does it copy theme location assignments?

No. Theme location assignments are site-specific and intentionally not copied, so the duplicate does not silently replace an active menu in any location.

What happens to sub-menu items?

All parent-child relationships are preserved exactly. The plugin uses a two-pass approach: items are cloned first, then parent ID references are re-mapped to the newly created item IDs.

Can I rename the duplicate before it is created?

Yes. A name field is shown in the duplicate modal. You can also change the default suffix globally by filtering swift_menu_duplicator_new_menu_name.

Is it compatible with WPML or Polylang?

Yes. Translation and language meta keys are automatically stripped from duplicated items so the copy starts as a clean, language-neutral menu.

Does it work with block themes?

Yes. Block themes render Navigation blocks (wp_navigation posts) rather than classic menus, and the Menu Manager has a Navigation (Block) tab for exactly those: duplicate, export, import, bulk duplicate, and move to trash, with an Edit in Site Editor link on every row. Classic menus keep their own tab, so a site part-way through a theme migration can manage both.

The tab appears when the active theme is a block theme, or whenever the site already has block navigation menus — a classic theme can still have them left over from a previous theme.

Is it compatible with WooCommerce / HPOS?

Yes. The plugin only interacts with nav_menu_item posts and the nav_menu taxonomy. It has no dependency on WooCommerce or its High-Performance Order Storage.

Can I duplicate a menu that contains draft items?

Yes. All items are duplicated regardless of their post status.

How do I use the REST API?

Authenticate with a cookie session or an Application Password, then send:

POST /wp-json/swift-menu-duplicator/v1/menus/{menu_id}/duplicate

The response includes the new menu’s id, name, and edit_url.

How do I migrate menus between environments?

Export the source menu to JSON (admin UI or wp swift-menu-duplicator export), transfer the file, then import it on the target site. Use the find/replace fields to rewrite domain-specific URLs during import.

What capability is required?

edit_theme_options for all duplication, snapshot, export, and import actions. Multisite copy-to-site additionally requires the network manage_network capability.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“Swift Menu Duplicator” is open source software. The following people have contributed to this plugin.

Contributors

Changelog

1.1.0

Everything below shipped as one release: versions 1.0.2 through 1.0.8 were development iterations that never reached the directory, so 1.0.1 is the version you are upgrading from.

New

  • Snapshot restore. The panel could save and delete revisions but never restore one — the feature was documented from 1.0.0 and missing until now. Restoring replaces the menu’s items in place and snapshots the current state first, so a restore can itself be undone.
  • Block theme support. Navigation menus stored as wp_navigation posts — the ones block themes actually render — can be duplicated, exported, and imported from a dedicated Menu Manager tab, WP-CLI, and REST.
  • Deleting a menu can be undone, theme locations included, for an hour afterwards.
  • The Menu Manager gained Slug, Description, and Snapshots columns, sortable counts, a working Screen Options panel, and a stylesheet — the screen previously had none.
  • REST API gained import and snapshot endpoints, and every route now publishes a schema.
  • New WP-CLI commands: snapshot list|save|restore|delete and navigation list|duplicate|export|import.
  • JSON can be pasted into the import screen instead of uploading a file.

Fixed

  • Duplication and import now write menu items through core’s wp_update_nav_menu_item() instead of inserting posts and postmeta directly, so WPML, Polylang, caching, and mega-menu plugins finally see cloned items.
  • Menu item descriptions and menu descriptions were silently dropped by duplication, export, and import.
  • Importing to a different site now re-resolves each item’s target by slug, falling back to a custom link, instead of keeping an ID that points at unrelated content on the destination.
  • Importing a file back into the site it came from failed outright; the name now falls back to “{name} (2)”.
  • Bulk “Duplicate” and “Export as JSON” silently did nothing without JavaScript.
  • The multisite copy ignored the URL find/replace it documented.
  • Duplicated custom links carried the source item’s object ID.
  • The snapshot panel sat behind the admin bar, and could not be operated by keyboard at all. The duplicate dialog claimed to be modal without trapping focus.
  • Notices are announced to screen readers, and accessible names are translatable rather than hardcoded English.
  • Uninstall now removes the plugin’s term meta; snapshots used to survive deleting the plugin.
  • Snapshots are stored one row each instead of rewriting the whole stack on every save.

Security

  • Imported menu fields are sanitized field-by-field, uploads are validated and size-capped, and the bundled coding-standards dependency was updated for CVE-2026-45293.

Changed

  • Breaking: the REST namespace moved from cmd/v1 to swift-menu-duplicator/v1. Update any REST clients.
  • Breaking: the WP-CLI command group is wp swift-menu-duplicator, not wp menu-duplicator.
  • New plugin icon, banners, and screenshots.

1.0.1

  • Fix: WP-CLI command renamed from wp menu-duplicator to wp swift-menu-duplicator for consistency with the plugin slug.
  • Fix: composer.lock was excluded by .gitignore glob pattern causing the SVN deploy workflow to fail.
  • Fix: Short description trimmed to satisfy the WordPress.org 150-character limit.
  • Tested up to WordPress 7.0.

1.0.0

  • Initial release.
  • One-click menu duplication from the WordPress menu editor with hierarchy preserved.
  • Duplicate individual menu items from the editor.
  • Snapshot system: auto-snapshot before every save, manual snapshots, restore and delete.
  • Appearance Menu Manager page with sortable table, bulk duplicate, bulk export (ZIP), and bulk delete.
  • JSON export and import with URL find & replace and dry-run preview.
  • Multisite support: copy menus to any sub-site with optional URL rewriting.
  • REST API at /wp-json/cmd/v1/ — duplicate menu, export menu, duplicate item.
  • WP-CLI command group wp swift-menu-duplicator — duplicate, export, import, copy-to-site.
  • WPML and Polylang compatibility — translation and language meta stripped from duplicates.
  • Developer hooks and filters throughout for extensibility.