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
  • 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

Multisite Support

  • Copy any menu to another site in your WordPress Multisite network
  • Automatic URL rewriting in item URLs when copying across sub-sites

REST API

Full REST API at /wp-json/cmd/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

Permission is controlled by the swmd_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

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 swmd_compat_excluded_meta_keys filter

Developer Hooks

  • swift_menu_duplicator_new_menu_name — customise the default duplicate name
  • swmd_rest_permission — control REST API access
  • swmd_before_duplicate_item / swmd_after_duplicate_menu_item — fired around item duplication
  • swmd_after_import_menu — fired after a successful import
  • swmd_item_meta_keys — control which meta keys are copied
  • swmd_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

  • Duplicate Menu button in the menu editor footer.
  • Menu Manager page — sortable list of all menus with bulk actions.
  • Snapshot panel in the menu editor — browse, restore, and delete revisions.
  • JSON import form with URL find & replace and dry-run preview.
  • WP-CLI duplicate and export commands in a terminal.

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.

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/cmd/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 manage_options on the target sub-site.

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.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.