{"id":343005,"date":"2026-07-26T10:03:48","date_gmt":"2026-07-26T10:03:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/site-migration-pro\/"},"modified":"2026-07-26T10:03:32","modified_gmt":"2026-07-26T10:03:32","slug":"kvachakhia-site-archive-restore","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/kvachakhia-site-archive-restore\/","author":18028032,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0","stable_tag":"1.0","tested":"7.0.2","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"DK Site Migration Pro","header_author":"Dimitri Kvachakhia","header_description":"Export a complete WordPress site (files + database) to a single custom .wpmigrate archive and restore it on another install, with serialized-safe URL\/path replacement.","assets_banners_color":"2263e2","last_updated":"2026-07-26 10:03:32","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/dima.ge","header_author_uri":"http:\/\/github.com\/kvachakhia","rating":0,"author_block_rating":0,"active_installs":0,"downloads":44,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0":{"tag":"1.0","author":"kvachakhia","date":"2026-07-26 10:03:32"}},"upgrade_notice":{"1.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3623174,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3623174,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Export screen with inclusion and exclusion options.","2":"Import screen with drag-and-drop upload and replacement preview.","3":"Backups catalogue.","4":"Activity logs.","5":"System information and environment self-test."}},"plugin_section":[],"plugin_tags":[151,2814,9055,4155,152],"plugin_category":[59],"plugin_contributors":[186588],"plugin_business_model":[],"class_list":["post-343005","plugin","type-plugin","status-publish","hentry","plugin_tags-backup","plugin_tags-clone","plugin_tags-duplicate","plugin_tags-migration","plugin_tags-restore","plugin_category-utilities-and-tools","plugin_contributors-kvachakhia","plugin_committers-kvachakhia"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/kvachakhia-site-archive-restore\/assets\/icon-256x256.png?rev=3623174","icon_2x":"https:\/\/ps.w.org\/kvachakhia-site-archive-restore\/assets\/icon-256x256.png?rev=3623174","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>DK Site Migration Pro packages your entire WordPress site into one custom archive and restores it anywhere. It is built for real-world hosting: work is processed in small, resumable chunks so it never fails because of a low PHP time limit, small memory limit, or a disabled <code>mysqldump<\/code>.<\/p>\n\n<p><strong>What gets exported<\/strong><\/p>\n\n<ul>\n<li>All site files (uploads, plugins, themes and child themes, custom folders)<\/li>\n<li>WordPress core files (optional)<\/li>\n<li>The complete database, via a chunked PHP engine (no <code>mysqldump<\/code> required)<\/li>\n<li>A manifest describing the source environment, plus per-entry and whole-archive checksums<\/li>\n<\/ul>\n\n<p><strong>What happens on import<\/strong><\/p>\n\n<ul>\n<li>The archive is validated (magic bytes, format version, checksums) before anything is written<\/li>\n<li>A preflight checks PHP\/WordPress versions and free disk space<\/li>\n<li>Files extract to a staging area with strict path-traversal protection<\/li>\n<li>The database loads into staging tables, then swaps in<\/li>\n<li>URLs and server paths are rewritten everywhere \u2014 including inside PHP-serialized data \u2014 using a recursive engine that recomputes serialized string lengths, never a raw SQL replace<\/li>\n<\/ul>\n\n<p><strong>Safe by design<\/strong><\/p>\n\n<ul>\n<li>A dedicated capability plus nonces guard every action<\/li>\n<li>Backups live in a protected directory with randomized filenames and an authenticated download handler<\/li>\n<li>Secrets (database passwords, salts, tokens) are never written to logs or the archive manifest<\/li>\n<li>Imports stage everything and swap late, with a rollback path if the swap fails<\/li>\n<\/ul>\n\n<p><strong>Privacy first<\/strong><\/p>\n\n<p>The plugin runs entirely on your own server. No site files, database content, or URLs are sent anywhere. Optional cloud storage is a separate, opt-in module and is disabled by default.<\/p>\n\n<p>This is the free edition. A Pro edition adds unlimited archive size, cloud storage, scheduled and incremental backups, encryption, Multisite support, WP-CLI commands, and automatic rollback \u2014 all built on the same extension points, with no licensing logic baked into the core.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>kvachakhia-site-archive-restore<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP from Plugins \u2192 Add New \u2192 Upload.<\/li>\n<li>Activate the plugin through the Plugins screen.<\/li>\n<li>Open <strong>Site Migration<\/strong> in the admin menu.<\/li>\n<li>Visit <strong>System Information<\/strong> and run the environment self-test to confirm your server is ready.<\/li>\n<\/ol>\n\n<p><strong>Nginx note:<\/strong> the plugin writes Apache deny rules automatically. On Nginx, add a rule denying direct access to <code>wp-content\/uploads\/ksar-backups\/<\/code>. Downloads always go through an authenticated handler regardless of server.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20require%20mysqldump%20or%20shell%20access%3F\"><h3>Does this require mysqldump or shell access?<\/h3><\/dt>\n<dd><p>No. The database export\/import is a pure PHP engine that processes rows in chunks. <code>mysqldump<\/code> is only used as an optional fast path when your host allows it.<\/p><\/dd>\n<dt id=\"will%20it%20break%20serialized%20data%20when%20changing%20domains%3F\"><h3>Will it break serialized data when changing domains?<\/h3><\/dt>\n<dd><p>No. Replacement is done in PHP with a recursive walker that unserializes, replaces, and reserializes so string lengths stay correct. It handles nested arrays, objects, JSON, page-builder data, and doubly-serialized values.<\/p><\/dd>\n<dt id=\"what%20is%20the%20.wpmigrate%20file%3F\"><h3>What is the .wpmigrate file?<\/h3><\/dt>\n<dd><p>A custom archive format owned by this plugin \u2014 not a renamed ZIP. It has its own header, table of contents, per-block checksums, and version gate, and is read only by the plugin.<\/p><\/dd>\n<dt id=\"is%20my%20data%20sent%20anywhere%3F\"><h3>Is my data sent anywhere?<\/h3><\/dt>\n<dd><p>No. Everything runs locally. Cloud features are opt-in and off by default.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0<\/h4>\n\n<ul>\n<li>Initial release. Full-site export to a single .wpmigrate archive and import\/restore onto another WordPress install. Highlights: chunked, resumable export and import (no mysqldump required); a custom self-checksummed archive format with validation and corruption detection; serialized-safe URL and path search-and-replace that recomputes serialized string lengths (handles nested arrays, objects, JSON, page builders, WooCommerce, doubly-serialized data); automatic domain and table-prefix handling with a pre-import preview; safe extraction with directory-traversal protection; automatic rollback of files and database on failure; resilience to timeouts and WordPress maintenance mode; and an admin interface with Export, Import, Backups, Activity Logs, Settings, and System Information.<\/li>\n<\/ul>","raw_excerpt":"Move a full WordPress site \u2014 files and database \u2014 into one .wpmigrate archive and restore it elsewhere with serialized-safe URL replacement.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/343005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=343005"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/kvachakhia"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=343005"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=343005"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=343005"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=343005"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=343005"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=343005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}