Skip to content

v3.12.0 — Backup, Sync & Migrate

Latest

Choose a tag to compare

@wpacademy wpacademy released this 13 Aug 08:19
· 1 commit to main since this release

Added

  • Backup, Sync & Migrate (Pro): a complete site-portability suite. A new "Backup, Sync, and Migrate" module (on by default, with a Modules-tab kill-switch) and its own admin tab. Package a whole site (database + files) into a single portable .emcp archive (or database-only / files-only) and restore it locally or from an uploaded archive. Backups and restores run in adaptive, time-bounded slices driven from the browser, so large sites finish reliably on modest and shared hosts. Restore rewrites the site address and Elementor page-data URLs to the destination with a serialization-safe search-replace, preserves your current login, and never touches wp-config.php or your salts.
  • Local to live migration via a thin connector. A Migrate sub-tab pushes this site to a live server with no manual upload: download the single-file EMCP Migrate Connector from the admin, install it on the destination and arm pairing, pair the two sites, then Push & Restore. The archive streams to the connector in HMAC-signed, resumable, base64-encoded packets (base64 so the payload clears the destination's firewall), and the connector runs a self-contained restore that continues past a client disconnect and never touches wp-config.php or salts.
  • One-way Sync, full or selective. A Sync sub-tab pushes to a paired target as Full (database + all files) or Selective (choose exact database tables and/or file areas: themes, plugins, uploads, or a specific path). A files-only sync never rewrites the live database.
  • Content Sync: push individual content changes to a live site. A change-driven Changes to sync list shows the pages, posts, and CPTs that changed locally since they were last synced to a paired live site, each with Sync / Discard. Syncing one item updates only that page/post on the live site (its content, custom fields, taxonomy terms, and attached media: the featured image plus every image referenced in the content and Elementor data), matched by a stable sync id, with media IDs and URLs remapped so it renders correctly. No full database import, no downtime; the rest of the live site is untouched. The whole-site full/selective sync is preserved under an Advanced disclosure.
  • Seven MCP tools so a connected agent can drive the whole feature: create-backup and list-backups (on by default); migrate-site, sync-to-live, and sync-content-item (destructive, disabled by default, require confirm:true); list-syncable-changes and discard-sync-change. Re-install the updated connector on any destination to receive content syncs.
  • Restore-tab server limits panel. An info box shows your current PHP upload limits next to the recommended values (green when you're set, amber when raising one would help) with a How to raise these link to the docs. The uploader adapts to any host regardless, so this is guidance for faster large uploads, not a requirement.
  • Remove the connector after migrating (zero residue). A signed Remove connector action (and a one-click button when a migration completes) asks the connector to unpair, purge staged data, deactivate itself, and delete its own files from the live site. Only the paired source can trigger it.
  • Configurable pairing window on the connector: a 5 / 10 / 15-minute selector (default 10) for how long the connector accepts a new pairing. Once paired, a site stays paired until you unpair or remove the connector.

Fixed

  • Reliable large uploads, backups, and restores on any host. The backup and restore flows are now driven from the browser in short, resumable, byte-offset slices, starting from a large chunk and automatically halving and retrying at the same offset whenever a host rejects a body, converging on each host's real single-request ceiling (mod_fcgid's hidden FcgidMaxRequestLen, nginx client_max_body_size, a WAF, or Cloudflare's 100 MB) without needing to know it. Chunks are base64-encoded so a firewall never sees SELECT/<?php/eval signatures, the browser holds only one chunk at a time (no "Out of Memory" tab crash on large backups), backup downloads stream without buffering the whole file in memory, and re-uploading a same-named file can't leave stale bytes. Large or firewalled hosts can still drop the .emcp into wp-content/emcp-backups/uploads/ via FTP and it appears in the Restore list. Live-verified byte-for-byte on a 446 MB archive over mod_fcgid.
  • Migration edge cases. Fixed a push that reported "Backup archive file is missing" when the archive was present (filename vs. full-path resolution); a mid-transfer HTTP 500 on long transfers (the push is now driven in short resumable slices that no host timeout can kill); a "No route was found..." error shown after a successful restore (the connector legitimately goes offline as the DB import replaces it, so the status poll now reads that as completion); and an inability to re-pair after a full migration (the connector now regenerates rewrite rules after a restore, and pairing falls back to the permalink-independent ?rest_route= form). Also resolved a "plugin does not have a valid header" notice after a Pro update by shipping the connector source as .php.txt.
  • Dynamic content locked whole Theme Builder templates out of the API (#112). Editing any element of a document that contained a dynamic-valued paragraph (for example a post date, category, or author rendered as a paragraph) failed with paragraph: invalid_value, because Elementor's atomic validation re-checks the whole tree on save and can't resolve an editor-authored dynamic value outside the live editor. Such a rejection now falls back to a direct, cache-clearing write of the already-validated data (exactly what the editor persists) instead of blocking the edit.
  • Pages created via MCP rendered empty when the Flexbox Container experiment is off (#111). On long-lived sites with Elementor's Container feature disabled, add-container and build-page stored pages that rendered empty because the container element can't instantiate. Those tools now refuse up front with a clear, actionable message, and detect-elementor-version reports supports_container plus a warning so an agent knows to enable the experiment (or use the atomic tools) first.
  • OAuth tokens not persisted on some sites. The token endpoint could return a token while writing no row to the tokens table (a drifted or missing schema after an upgrade), so the client authenticated once and then couldn't. Issuing a token now verifies the write, self-heals the schema and retries once, and returns a clear server error instead of an unusable token if it still fails.