{"id":333526,"date":"2026-08-20T23:52:18","date_gmt":"2026-08-20T23:52:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ago-migrator\/"},"modified":"2026-08-21T01:54:23","modified_gmt":"2026-08-21T01:54:23","slug":"ago-migrator","status":"publish","type":"plugin","link":"https:\/\/lv.wordpress.org\/plugins\/ago-migrator\/","author":20135676,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.1","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"aGo Migrator","header_author":"aGo Lab","header_description":"Full-site backup & migration. One-click export, drag & drop import, serialization-safe search-replace.","assets_banners_color":"fefefe","last_updated":"2026-08-21 01:54:23","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/paypal.me\/sixtovaldes","header_plugin_uri":"https:\/\/ago.cl\/herramientas\/","header_author_uri":"https:\/\/ago.cl\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":49,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"agolab","date":"2026-08-20 23:51:50"},"1.0.3":{"tag":"1.0.3","author":"agolab","date":"2026-08-21 00:48:00"},"1.1.0":{"tag":"1.1.0","author":"agolab","date":"2026-08-21 01:54:23"}},"upgrade_notice":{"1.0.2":"<p>Recommended: backups are now written inside the uploads directory, every content location is resolved through its own WordPress function, and on multisite only a network administrator can export or restore.<\/p>","1.0.1":"<p>Recommended for every install: hardens where backups are stored, guarantees they are deleted, and restricts what a restore is allowed to execute.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3657936,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3657936,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3657936,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3657936,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2","1.0.3","1.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3657936,"resolution":"1","location":"assets","locale":"","width":1385,"height":1720},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3657936,"resolution":"2","location":"assets","locale":"","width":1385,"height":1720}},"screenshots":{"1":"Export and import on a single screen: one-click full-site backup and drag-and-drop restore.","2":"Step-by-step export progress with live table-by-table status."}},"plugin_section":[],"plugin_tags":[151,1859,87,4155,10745],"plugin_category":[59],"plugin_contributors":[266242],"plugin_business_model":[],"class_list":["post-333526","plugin","type-plugin","status-publish","hentry","plugin_tags-backup","plugin_tags-export","plugin_tags-import","plugin_tags-migration","plugin_tags-transfer","plugin_category-utilities-and-tools","plugin_contributors-agolab","plugin_committers-agolab"],"banners":{"banner":"https:\/\/ps.w.org\/ago-migrator\/assets\/banner-772x250.png?rev=3657936","banner_2x":"https:\/\/ps.w.org\/ago-migrator\/assets\/banner-1544x500.png?rev=3657936","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/ago-migrator\/assets\/icon-128x128.png?rev=3657936","icon_2x":"https:\/\/ps.w.org\/ago-migrator\/assets\/icon-256x256.png?rev=3657936","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ago-migrator\/assets\/screenshot-1.png?rev=3657936","caption":"Export and import on a single screen: one-click full-site backup and drag-and-drop restore."},{"src":"https:\/\/ps.w.org\/ago-migrator\/assets\/screenshot-2.png?rev=3657936","caption":"Step-by-step export progress with live table-by-table status."}],"raw_content":"<!--section=description-->\n<p>aGo Migrator packages WordPress content (database tables + uploads + plugin and theme listings) into a single archive to move a site between environments. Lightweight alternative to enterprise migration plugins.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li>Export site to a single archive (database, uploads).<\/li>\n<li>Import archive on the destination site.<\/li>\n<li>Search-replace of URLs on import.<\/li>\n<li>No external services.<\/li>\n<li>Fully internationalized. Translations are contributed and delivered through translate.wordpress.org.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin does not connect to any external service. Nothing is sent anywhere: the archive is generated and read entirely on your own server, and the plugin makes no outbound requests of its own.<\/p>\n\n<p>The admin page does contain links that open in a new tab only when you click them. No script, style, font or image is ever loaded from any of these sites:<\/p>\n\n<ul>\n<li>ago.cl, plugin documentation and the aGo Lab site (https:\/\/ago.cl\/).<\/li>\n<li>wordpress.org, the support forum for this plugin, the \"Moving WordPress\" guide and the \"Changing the site URL\" guide (https:\/\/wordpress.org\/).<\/li>\n<li>PageSpeed Insights, offered as a way to compare your site before and after a move (https:\/\/pagespeed.web.dev\/).<\/li>\n<li>PayPal, the voluntary donation links (https:\/\/paypal.me\/).<\/li>\n<\/ul>\n\n<h3>Privacy<\/h3>\n\n<p>The plugin processes your own site data locally to build and restore the archive. It sends no data to third parties. It stores short-lived job transients and a temporary working directory in wp-content; on uninstall, those transients and the temporary directory are removed.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload <code>ago-migrator<\/code> to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin on both source and destination.<\/li>\n<li>Source: <strong>aGo Tools, Migrator<\/strong>, click Export.<\/li>\n<li>Destination: same screen, click Import and upload the archive.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20large%20a%20site%20can%20it%20move%3F\"><h3>How large a site can it move?<\/h3><\/dt>\n<dd><p>The export and import run in steps and the upload is chunked, so it works on shared hosting. Very large uploads directories are still limited by your host disk space and execution time.<\/p><\/dd>\n<dt id=\"does%20it%20overwrite%20the%20destination%20site%3F\"><h3>Does it overwrite the destination site?<\/h3><\/dt>\n<dd><p>Yes. Importing replaces the destination database and files. Always import into a fresh or disposable site, never over production without a backup.<\/p><\/dd>\n<dt id=\"can%20i%20use%20wp-cli%3F\"><h3>Can I use WP-CLI?<\/h3><\/dt>\n<dd><p>Yes. The plugin registers an <code>agomigrator<\/code> WP-CLI command for export and import.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Exporting the files of a site is now done in batches instead of one directory per request, so a large uploads folder no longer runs past the time limit of the server and costs you the whole export.<\/li>\n<li>Each location is indexed before its files are archived, so progress is reported file by file against the real total.<\/li>\n<li>WP-CLI reports each step as it goes, with its own count.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>A hosting or security layer that limits how many requests it accepts no longer stops an export or an import halfway: the step is repeated after a short wait and the rest of the job continues at a slower pace.<\/li>\n<li>When the server answers with an error, the log now names it, instead of showing the message of a failed attempt to read the answer as data.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Every file the plugin writes now lives in a folder named after the plugin inside the uploads directory, resolved at runtime, instead of a folder in wp-content.<\/li>\n<li>Each location the plugin reads or restores (plugins, must-use plugins, themes, uploads, languages) is resolved through its own WordPress accessor, so installs that moved any of them outside wp-content are exported and restored correctly.<\/li>\n<li>On import, the archive's upload directory is rewritten to wherever uploads live on the destination, which fixes media paths when the two sites do not share the same layout.<\/li>\n<li>An export or a restore now requires the network capability on multisite, so a single site administrator can no longer act on the whole installation.<\/li>\n<li>Upgrading or uninstalling removes the working directory used by earlier versions, so no old database dump is left behind.<\/li>\n<li>Translations are no longer bundled: they come from translate.wordpress.org, where anyone can contribute them.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Security: the working directory is created on demand and always carries its server-level denial files, instead of relying on activation having run.<\/li>\n<li>Security: each backup is written inside a folder whose name is not guessable, so an archive cannot be located by trying URLs.<\/li>\n<li>Security: archives are deleted after download, by a scheduled cleanup, and whenever a new job starts. A database dump is no longer left on disk when a download is abandoned.<\/li>\n<li>Security: job identifiers are validated against a strict allow list before they are used to build a filesystem path.<\/li>\n<li>Security: a restore only runs schema and data statements from an allow list, so a tampered archive cannot reach other database commands.<\/li>\n<li>Security: archive entries with traversal segments, absolute paths, drive letters or backslashes are refused, and every write is confirmed to land inside its destination directory.<\/li>\n<li>Security: serialized objects are left untouched during search-replace rather than being unserialized.<\/li>\n<li>Security: table names are verified against the live schema and all values are escaped through the WordPress database API.<\/li>\n<li>Fixed: the activation routine never ran, which left the working directory without its protection files.<\/li>\n<li>Fixed: an SQL value containing a semicolon and a line break no longer splits a statement in two during import.<\/li>\n<li>Fixed: error messages no longer include server paths or dump contents.<\/li>\n<li>Added: Quick links and Other aGo Lab plugins cards in the sidebar, both fully translated.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>One-click full-site export (database and uploads) to a single archive.<\/li>\n<li>Drag and drop import with manifest preview and confirmation.<\/li>\n<li>Serialization-safe search-replace of URLs on import.<\/li>\n<li>WP-CLI export and import commands.<\/li>\n<li>Fully internationalized, with translations available through translate.wordpress.org.<\/li>\n<\/ul>","raw_excerpt":"Simple WordPress migrator: export site as a single archive (DB + uploads), import on the destination.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/333526","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=333526"}],"author":[{"embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/agolab"}],"wp:attachment":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=333526"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=333526"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=333526"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=333526"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=333526"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=333526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}