Repository navigation
Releases: panelalpha/panelalpha-migrator
Release list
v1.2.1
Released: Oct 29th, 2026
New Feature
- Added the one-time setup file
wp-content/panelalpha-migrator-setup.phpto preset the token and the settings, includingallowed_destinations. The plugin reads it once and deletes it - Added
uninstall.php. Deleting the plugin from the dashboard removes its options, its scheduled cleanup, its temporary and backup tables, and its files inwp-content/migrations/ - Added
readme.txt, an icon, banners and screenshots - Added translations support for the admin texts (text domain
panelalpha-migrator)
Improvement
- Renamed the plugin to PanelAlpha Migrator. The plugin folder and the zip are now
panelalpha-migrator. Requires WordPress 6.2 - Received the migration on the destination through the WordPress REST API, protected by the destination's token
- Checked that the destination answers and accepts the token before anything is sent
- Imported tables into temporary tables and swapped them in with one step at the end, so the destination keeps working during the migration. A failed swap is rolled back
- Moved PHP files into place only at the end of the migration
- Cleaned up abandoned migrations after 48 hours
- Stored the token and the settings in the WordPress database
- Kept the destination's own token and settings after a migration
- Sent requests through the WordPress HTTP API and read the source database through
wpdb
Removed
- Removed
config.php. Use the setup file to preset the token and the settings - Removed
restore.phpand the old receive path. Both sites of a migration must run 1.2.1 - Removed unused code and packages
Bug Fix
- Fixed the token and the settings being lost when the plugin was updated
- Fixed admin texts and error messages that were not escaped
v1.2.0
Released: Oct 27th, 2026
New Feature
- Added the
insecure_tlsoption to skip the HTTPS certificate check for one migration, for a destination that has no valid certificate yet. It works only together with a manualip. On the Migrator page it is a checkbox under the IP field - Added a warning with the number of skipped files when files are deleted on the source during the migration, such as cache or log files. The migration still finishes
- Added creating the destination token the first time the destination's Migrator page is opened. The shipped
config.phpno longer has a token - Added a user guide in the
docs/folder: installation, migrating a site, stop and resume, what gets moved, and the API
Improvement
- Required an administrator or the site token on every migration endpoint. Programs that call the API, PanelAlpha included, must send the source's token in the
X-Migrator-Tokenheader or as?token= - Refused loopback, private, link-local and other non-routable addresses as a destination. Addresses listed in
allowed_destinationsinconfig.phpare still accepted - Pinned the destination IP when the migration starts, so every later request goes to the same checked address
- Verified the destination HTTPS certificate on every request
- Reported a migration as finished only after the destination confirms it has every piece. Sending a piece again does not damage the file
- Allowed only one migration at a time, from the dashboard and from the API. An abandoned migration stops blocking new ones after 15 minutes (2 hours before)
- Restored each table piece in one transaction and sped up the chunk status check
- Copied nested
.htaccessfiles and read the site address from the database - Sent the list of tables and files to the destination before the first piece in API migrations, as the Migrator page does
- Deleted old files in
wp-adminandwp-includeson the destination when the migration carries the WordPress core.wp-contentis not touched - Supported hosts that do not allow PHP to create new
.phpfiles, such as WP Engine, and files that can be changed but not replaced, such asconfig.phpon Cloudways - Made the finalize step work on sites without pretty permalinks
- Accepted the completion answer of a 1.1.4 destination
- Added unit tests for most services and controllers, run on PHP 7.4 to 8.5
Bug Fix
- Fixed several security issues in the migration API, file handling and token storage. Updating to 1.2.0 is recommended for all installations
- Fixed the plugin activating on PHP 7.4 and then failing during the migration. It now runs on PHP 7.4 to 8.5 and no longer logs deprecation notices on PHP 8.4 and 8.5
- Fixed
backup_databaseandbackup_filesset to"false"or0being treated as on - Fixed the first pieces of two tables landing in the same file
- Fixed a manual IP ignoring a custom destination port such as 8443
- Fixed start, stop and finalize steps on the Migrator page failing one another, and the success screen showing before finalize succeeded
- Fixed invalid input and a missing or malformed migration ID causing a PHP error instead of a
400answer. An unknown ID now gets404 - Fixed saving a new token reporting an error on servers with OPcache, and the old token still working for a while after a change
- Fixed exclusion rules that start with a dot, such as
.gitor/.ddev, not leaving out folders with that name - Fixed the destination not finding the table prefix when
wp-config.phpdoes not hold it, and stopping while the tables are replaced
1.1.4
1.1.4 - 2026-09-28
Move a site to a destination that uses a different table prefix, and be sure a migration cannot write outside the WordPress folder. This version brings this repository level with the copy PanelAlpha ships.
Security
- Files stay inside the site. The destination refuses any file whose path climbs out of the WordPress folder, such as
../or an absolute path. Nothing is written, and the migration reports that piece as failed.wp-content/../wp-config.phpis treated aswp-config.php, which is never overwritten. - A safer token check on
restore.php. The destination compares the token in a way that does not leak how close a guess was.
Added
- Different table prefixes. When the source and the destination use different prefixes, such as
wp_andsite1_, the tables arrive under the destination's prefix, so WordPress finds them without any repair.
Changed
- Steadier connections. Requests to the destination now use HTTP/1.1, so connections behave the same on every server.
- Plugin data survives the address change. A saved object from a plugin that is not loaded is left as it was, also when it sits inside another object, instead of being altered.
- Building the plugin from the repository.
vendor/is no longer committed. Runcomposer install --no-devin the plugin folder before you copy or zip it; withoutvendorthe plugin does nothing. - Unit tests.
composer testruns them, and they run on every push.
1.1.3
1.1.3 - 2026-07-07
Sites with linked tables and with settings from inactive plugins now migrate without errors.
Changed
- Tables restore in any order. A table that points at another one no longer fails because the other has not arrived yet.
- Settings from plugins that are not active are copied as they are. Data such as WooCommerce scheduled actions used to be damaged when the address changed. Now it arrives unchanged.
1.1.2
1.1.2 - 2026-07-06
Older and unusual tables now restore on strict MariaDB and MySQL servers.
Changed
- Tables no longer get refused for their engine or storage options. Every table is created as InnoDB, and options newer servers reject, such as a tablespace or a fixed row format, are left out. The data is the same, and you do not have to fix the table by hand.
1.1.1
1.1.1 - 2026-04-16
The destination now knows the source's table prefix, and the small gaps left after 1.1.0 are closed.
Added
- Copy the
.htaccessfile. After a migration over the API,transfer-htaccesssends the source's main.htaccessto the destination, so redirects and custom rules come along. It replaces the destination's file, says so when the source has none, and works even before pretty permalinks are on. - The source's table prefix in the answer. Starting a migration over the API now returns
table_prefix.
Changed
- An empty table prefix is respected. A
wp-config.phpwith$table_prefix = '';, or with no prefix line at all, is treated as unprefixed instead of silently becomingwp_. - A deleted file does not stop the migration. If a file disappears from the source after the scan, it is skipped and the migration goes on. The batch and status answers list it in
skipped_files. - Token in a header. Where the site token is accepted as
?token=, you can also send it in theX-Migrator-Tokenheader, so it does not have to sit in the address.
1.1.0
1.1.0 - 2026-03-16
Migrate to WP Cloud, to a server whose domain is not live yet, and sites with binary data in the database. The plugin now shows PanelAlpha, or the name of the host that supplied it, as its author.
Added
- Destination IP address. Enter the new server's IP address in Destination IP Address (Optional), or pass
ipover the API, to migrate before the domain points at it. The domain is kept in every request and in the migrated database. - WP Cloud and Bitnami. Sites whose
wp-contentorwp-config.phplive outside the WordPress folder are scanned and restored in the right place. - Firewall-friendly sending.
base64: trueover the API sends each piece encoded, for destinations whose firewall blocks raw data, such as WP Cloud. - Force a new migration.
force: trueover the API removes the lock left by an earlier migration on the source, so a new one can start. - Where the migration is. Batch answers name the table or file being sent now and the next one.
- Branding. The Plugins page shows the author name and link from an optional
branding.php, and PanelAlpha by default. - Database login fallback. When the destination's
wp-config.phpcannot be read, the plugin finds the login another way, or takes it from thedatabasesetting inconfig.php.
Changed
- Binary data moves intact. Database values that are not valid text, such as serialized binary data, arrive unchanged instead of failing the piece.
- Decimal numbers pass the integrity check. Tables with decimal numbers no longer fail with a checksum mismatch, whatever the PHP precision settings on the two servers.
- Database hosts with a port or socket. A
DB_HOSTsuch aslocalhost:3307orlocalhost:/path/to/mysql.sockconnects correctly. - Empty files are copied without errors.
- A finished migration says so. Calling
process-batchafter the end answers"finalized": truewith Migration is already completed instead of an error, and a migration with only the database or only the files finishes correctly.
1.0.0
1.0.0 - 2026-01-29
The first version: move a WordPress site to another WordPress installation from the dashboard or over the API.
Added
- Migrate from the dashboard. Copy the destination's address with its token, paste it on the source, and select Start Migration. The page shows the scan, the database and the files as they are sent, and a summary at the end.
- Migrate over the API.
remote-syncprepares a migration andremote-sync/process-batchsends it in batches, so PanelAlpha or a script can run it without a browser.migrate.phpdoes this from the command line. One migration runs at a time per source. - Pieces, not one big upload. Files are sent in pieces of about 520 KB and tables 100 rows at a time, each checked on arrival, so large sites do not hit upload or time limits.
- Address change. The source address is replaced with the destination's in the database while it is sent, including inside saved settings.
- The destination keeps its own configuration.
wp-config.php, the main.htaccessand the plugin itself are never overwritten. - Stop and resume. Stop Backup pauses a migration; Resume Backup continues an interrupted one from where it stopped.
- Choose what to send. Database, files, or both, and extra folders or file types to leave out.
- Tokens. Generate New Token on the destination replaces the token and invalidates every address copied before.