{"id":287187,"date":"2026-04-22T12:17:38","date_gmt":"2026-04-22T12:17:38","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/snapbackup-restore-migration\/"},"modified":"2026-05-24T09:56:08","modified_gmt":"2026-05-24T09:56:08","slug":"zhbackup","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/zhbackup\/","author":23100270,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.0","stable_tag":"2.0.0","tested":"7.0","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"ZHBackup \u2013 Restore & Migration","header_author":"Zain Hassan","header_description":"Fast and lightweight WordPress backup, restore, and migration plugin. Generate full-site ZIP backups including database and files with secure restore support.","assets_banners_color":"5ba3d1","last_updated":"2026-05-24 09:56:08","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/hassanzain.com\/zhbackup","header_author_uri":"https:\/\/hassanzain.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":118,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"zainhassandeveloper","date":"2026-04-22 12:16:55"},"2.0.0":{"tag":"2.0.0","author":"zainhassandeveloper","date":"2026-05-24 09:56:08"}},"upgrade_notice":{"2.0.0":"<p>Major backup and restore upgrade with structured database packages, optional root folder support, manual cleanup, improved logs, and a redesigned admin interface.<\/p>","1.0.0":"<p>Initial release. Install and start backing up your site.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3512806,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3512806,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3512806,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3512806,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","2.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3546056,"resolution":"1","location":"assets","locale":"","width":3328,"height":1596},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3546056,"resolution":"2","location":"assets","locale":"","width":3322,"height":1526},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3546056,"resolution":"3","location":"assets","locale":"","width":3308,"height":1586},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3546056,"resolution":"4","location":"assets","locale":"","width":3334,"height":1476},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3546056,"resolution":"5","location":"assets","locale":"","width":3352,"height":1480},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3546056,"resolution":"6","location":"assets","locale":"","width":3310,"height":1580}},"screenshots":{"1":"Export screen for choosing backup components, wp-content folders, optional folders and files, and the backup archive format.","2":"Existing backups table with backup contents, file size, date, download, restore, and delete actions.","3":"Import screen with chunked browser upload plus server-side backup restore from uploaded <code>.zip<\/code> or <code>.zhbackup<\/code> files.","4":"Find &amp; Replace screen for serialized-safe URL replacement across WordPress database tables.","5":"Restore Cleanup screen for reviewing and running pending stale-file cleanup after a restore.","6":"Settings screen showing storage security status, backup engine details, and server health checks."}},"plugin_section":[],"plugin_tags":[151,153,1859,87,4155],"plugin_category":[59],"plugin_contributors":[260819],"plugin_business_model":[],"class_list":["post-287187","plugin","type-plugin","status-publish","hentry","plugin_tags-backup","plugin_tags-database","plugin_tags-export","plugin_tags-import","plugin_tags-migration","plugin_category-utilities-and-tools","plugin_contributors-zainhassandeveloper","plugin_committers-zainhassandeveloper"],"banners":{"banner":"https:\/\/ps.w.org\/zhbackup\/assets\/banner-772x250.png?rev=3512806","banner_2x":"https:\/\/ps.w.org\/zhbackup\/assets\/banner-1544x500.png?rev=3512806","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/zhbackup\/assets\/icon-128x128.png?rev=3512806","icon_2x":"https:\/\/ps.w.org\/zhbackup\/assets\/icon-256x256.png?rev=3512806","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/zhbackup\/assets\/screenshot-1.png?rev=3546056","caption":"Export screen for choosing backup components, wp-content folders, optional folders and files, and the backup archive format."},{"src":"https:\/\/ps.w.org\/zhbackup\/assets\/screenshot-2.png?rev=3546056","caption":"Existing backups table with backup contents, file size, date, download, restore, and delete actions."},{"src":"https:\/\/ps.w.org\/zhbackup\/assets\/screenshot-3.png?rev=3546056","caption":"Import screen with chunked browser upload plus server-side backup restore from uploaded <code>.zip<\/code> or <code>.zhbackup<\/code> files."},{"src":"https:\/\/ps.w.org\/zhbackup\/assets\/screenshot-4.png?rev=3546056","caption":"Find &amp; Replace screen for serialized-safe URL replacement across WordPress database tables."},{"src":"https:\/\/ps.w.org\/zhbackup\/assets\/screenshot-5.png?rev=3546056","caption":"Restore Cleanup screen for reviewing and running pending stale-file cleanup after a restore."},{"src":"https:\/\/ps.w.org\/zhbackup\/assets\/screenshot-6.png?rev=3546056","caption":"Settings screen showing storage security status, backup engine details, and server health checks."}],"raw_content":"<!--section=description-->\n<p><strong>ZHBackup \u2013 Restore &amp; Migration<\/strong> is a full-site WordPress backup and restore plugin built for real migration workflows. It packages your database, media, plugins, themes, selected <code>wp-content<\/code> folders, root files, and optional custom root folders, then restores them through a chunked process designed to avoid request timeouts.<\/p>\n\n<p>The database is stored as a structured package instead of one large SQL replay file, so large page-builder data, post meta, options, and other oversized values can be restored in smaller, traceable steps. Live activity logs show the progress of exports, imports, database rows, large values, file restore, validation, and cleanup.<\/p>\n\n<p>After a restore, ZHBackup lets you review the site first and run stale-file cleanup separately from the restore process. This keeps restore completion predictable while still giving you a controlled way to remove old plugins, uploads, themes, and selected root-folder files that are not present in the backup.<\/p>\n\n<p><strong>Key Features:<\/strong><\/p>\n\n<ul>\n<li><strong>Full-Site Backups<\/strong> \u2014 Back up the database, uploads, plugins, themes, mu-plugins, selected <code>wp-content<\/code> folders, root files, and optional custom root folders.<\/li>\n<li><strong>Structured Database Package<\/strong> \u2014 Export database schemas, row chunks, and large values separately for reliable restores of Elementor\/page-builder data and other large rows.<\/li>\n<li><strong>Chunked Export and Restore<\/strong> \u2014 Process database and file operations in small AJAX steps to reduce timeout and memory-limit issues.<\/li>\n<li><strong>Browser Upload or Server Restore<\/strong> \u2014 Upload backups through the browser in resumable chunks, or place backups on the server via FTP\/SFTP and restore from a table of available files.<\/li>\n<li><strong>Flexible Archive Formats<\/strong> \u2014 Create standard <code>.zip<\/code> backups or optimized <code>.zhbackup<\/code> archives.<\/li>\n<li><strong>Live Activity Logs<\/strong> \u2014 Follow professional export\/import logs with database checkpoints, row counts, large-value restore events, file progress, validation, and cleanup status.<\/li>\n<li><strong>Post-Restore Cleanup<\/strong> \u2014 Save a cleanup plan after restore and run stale-file cleanup manually after reviewing the restored site.<\/li>\n<li><strong>Serialized-Safe Find &amp; Replace<\/strong> \u2014 Update URLs safely across serialized PHP data, JSON-escaped URLs, and Elementor widget data.<\/li>\n<li><strong>Secure Backup Storage<\/strong> \u2014 Store backups outside the webroot when available, with <code>.htaccess<\/code>, <code>web.config<\/code>, and <code>index.php<\/code> protections when stored inside the site.<\/li>\n<li><strong>Retention Policies<\/strong> \u2014 Automatically clean up older backups by count or age using WP-Cron.<\/li>\n<li><strong>No Required Account<\/strong> \u2014 Use all backup, restore, migration, and cleanup features without a license key or forced signup.<\/li>\n<\/ul>\n\n<p><strong>WordPress.org Compliant:<\/strong><\/p>\n\n<ul>\n<li>No obfuscated or encoded PHP<\/li>\n<li>Proper sanitization for all inputs<\/li>\n<li>Escaped outputs throughout<\/li>\n<li>Nonces for all form submissions<\/li>\n<li>Capability checks on every action<\/li>\n<li>No hidden external API calls<\/li>\n<li>No telemetry without explicit consent<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>ZHBackup includes an optional newsletter signup form on the plugin Settings page.<\/p>\n\n<p>This feature connects to an external service hosted by Hassan Zain at <code>hassanzain.com<\/code>. It is used only to add the submitted email address to the ZHBackup newsletter or product updates list.<\/p>\n\n<p>Data is sent only when an administrator manually submits the optional signup form. The plugin does not contact this service during normal backup, restore, migration, import, export, or find-and-replace usage.<\/p>\n\n<p>When the form is submitted, the plugin sends:<\/p>\n\n<ul>\n<li>Email address entered in the signup form<\/li>\n<li>Site URL (<code>home_url()<\/code>)<\/li>\n<li>Plugin slug (<code>zhbackup<\/code>)<\/li>\n<li>Plugin version<\/li>\n<\/ul>\n\n<p>Terms of service: https:\/\/hassanzain.com\/terms-and-conditions\nPrivacy policy: https:\/\/hassanzain.com\/privacy-policy<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>ZHBackup does not send telemetry or usage analytics during normal backup, restore, migration, import, export, or find-and-replace operations.<\/p>\n\n<p>The only optional external data transfer is the administrator-initiated newsletter signup described above.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>zhbackup<\/code> folder to <code>wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Navigate to <strong>ZHBackup<\/strong> in the admin sidebar to start creating backups.<\/li>\n<\/ol>\n\n<p><strong>Alternatively:<\/strong><\/p>\n\n<ol>\n<li>Go to <strong>Plugins \u2192 Add New<\/strong> in your WordPress admin.<\/li>\n<li>Search for \"ZHBackup \u2013 Restore &amp; Migration\".<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20work%20on%20shared%20or%20managed%20hosting%3F\"><h3>Does this plugin work on shared or managed hosting?<\/h3><\/dt>\n<dd><p>Yes. ZHBackup uses chunked export, upload, import, and restore steps so each request stays small. The database is also restored table-by-table from a structured package instead of replaying one large SQL file.<\/p><\/dd>\n<dt id=\"how%20large%20of%20a%20site%20can%20this%20handle%3F\"><h3>How large of a site can this handle?<\/h3><\/dt>\n<dd><p>There is no fixed size limit in the plugin. Very large sites depend on available disk space, PHP limits, and database performance, but ZHBackup is designed to process large file sets and databases in small resumable steps.<\/p><\/dd>\n<dt id=\"how%20does%20zhbackup%20handle%20large%20elementor%20or%20page-builder%20data%3F\"><h3>How does ZHBackup handle large Elementor or page-builder data?<\/h3><\/dt>\n<dd><p>Large database values are stored separately from normal row chunks and restored in smaller append operations. This helps preserve large <code>_elementor_data<\/code>, post meta, options, and other oversized rows during restore.<\/p><\/dd>\n<dt id=\"what%20is%20the%20difference%20between%20%60.zip%60%20and%20%60.zhbackup%60%3F\"><h3>What is the difference between `.zip` and `.zhbackup`?<\/h3><\/dt>\n<dd><p>Both formats can contain the same backup data. <code>.zip<\/code> is a standard archive format. <code>.zhbackup<\/code> is ZHBackup's optimized archive format for this plugin. Both support the structured database package.<\/p><\/dd>\n<dt id=\"can%20i%20restore%20a%20backup%20uploaded%20by%20ftp%20or%20file%20manager%3F\"><h3>Can I restore a backup uploaded by FTP or File Manager?<\/h3><\/dt>\n<dd><p>Yes. Upload a <code>.zip<\/code> or <code>.zhbackup<\/code> file to the backup storage directory shown on the Import screen. It will appear in the server backup table, where you can restore it directly.<\/p><\/dd>\n<dt id=\"where%20are%20backups%20stored%3F\"><h3>Where are backups stored?<\/h3><\/dt>\n<dd><p>The plugin automatically selects the most secure location. It prefers a directory outside the webroot (not accessible via browser), but falls back to <code>wp-content\/zhbackup-backups\/<\/code> if needed, where files are protected by <code>.htaccess<\/code> rules.<\/p><\/dd>\n<dt id=\"can%20i%20include%20custom%20folders%20from%20the%20wordpress%20root%3F\"><h3>Can I include custom folders from the WordPress root?<\/h3><\/dt>\n<dd><p>Yes. The export screen can include optional first-level folders from the WordPress root. WordPress core folders such as <code>wp-admin<\/code>, <code>wp-includes<\/code>, and <code>wp-content<\/code> are handled separately or excluded automatically.<\/p><\/dd>\n<dt id=\"can%20i%20import%20a%20backup%20from%20a%20different%20domain%3F\"><h3>Can I import a backup from a different domain?<\/h3><\/dt>\n<dd><p>Yes. After importing, use the built-in <strong>Find &amp; Replace<\/strong> tool to update old URLs to your new domain. It handles serialized data safely, including Elementor widget data.<\/p><\/dd>\n<dt id=\"what%20is%20post-restore%20cleanup%3F\"><h3>What is post-restore cleanup?<\/h3><\/dt>\n<dd><p>Restore copies files from the backup first. If older files or folders still exist on the destination site, ZHBackup saves a cleanup plan. After you verify the restored site, go to <strong>ZHBackup \u2192 Cleanup<\/strong> to remove stale files that are not present in the backup.<\/p><\/dd>\n<dt id=\"will%20cleanup%20fail%20the%20restore%20if%20file%20permissions%20block%20deletion%3F\"><h3>Will cleanup fail the restore if file permissions block deletion?<\/h3><\/dt>\n<dd><p>No. Cleanup is manual and best-effort. Permission-related deletion failures are logged as warnings so the restore can remain complete and you can review any paths that need manual attention.<\/p><\/dd>\n<dt id=\"is%20the%20email%20signup%20required%3F\"><h3>Is the email signup required?<\/h3><\/dt>\n<dd><p>No. The email signup on the Settings page is completely optional and can be dismissed permanently. The plugin is fully functional without it.<\/p><\/dd>\n<dt id=\"is%20the%20%60.zhbackup%60%20format%20free%20to%20use%3F\"><h3>Is the `.zhbackup` format free to use?<\/h3><\/dt>\n<dd><p>Yes. The <code>.zhbackup<\/code> export format is included for free and does not require any license key or activation page.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20make%20external%20api%20calls%3F\"><h3>Does this plugin make external API calls?<\/h3><\/dt>\n<dd><p>Yes, but only for the optional newsletter signup on the Settings page after an administrator explicitly enters an email address and submits the form. No data is sent anywhere during backup, restore, migration, import, export, or find-and-replace operations.<\/p><\/dd>\n<dt id=\"will%20importing%20overwrite%20my%20existing%20site%3F\"><h3>Will importing overwrite my existing site?<\/h3><\/dt>\n<dd><p>Yes. Importing a backup restores the backed-up database and files over the current site. Always create a fresh backup of the current site before importing.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Added a structured database package that exports schema files, table row chunks, and separate large-value files for reliable full-site restores.<\/li>\n<li>Added table-by-table database restore with checkpoints, validation, large-value restoration, URL migration support, and detailed activity logs.<\/li>\n<li>Added optional custom root folder backup and restore for first-level folders in the WordPress root.<\/li>\n<li>Added manual post-restore cleanup so administrators can review the restored site before removing stale files.<\/li>\n<li>Added a redesigned admin experience with cleaner backup options, optional item grouping, compact backup tables, icon tooltips, and professional live logs.<\/li>\n<li>Improved server-side import with a table of available backups and one-click restore actions.<\/li>\n<li>Improved backup content selection for database, root files, wp-content folders, root folders, archive format, and additional database tables.<\/li>\n<li>Improved archive support for both <code>.zip<\/code> and <code>.zhbackup<\/code> formats.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<li>Full site backup with chunked AJAX export and import.<\/li>\n<li>Support for <code>.zip<\/code> and <code>.zhbackup<\/code> backup formats.<\/li>\n<li>Chunked, resumable browser uploads for large imports.<\/li>\n<li>Server-side import from backups uploaded via FTP\/SFTP.<\/li>\n<li>Serialized-safe find and replace with Elementor support.<\/li>\n<li>Automatic secure storage with <code>.htaccess<\/code>, <code>web.config<\/code>, and <code>index.php<\/code> protection.<\/li>\n<li>Backup retention policies (by count or age).<\/li>\n<li>ZipArchive with PclZip fallback.<\/li>\n<li>Optional, dismissible email signup with no forced account requirement.<\/li>\n<li>WordPress.org-compliant release with no license activation system.<\/li>\n<\/ul>","raw_excerpt":"Full-site WordPress backup, restore, and migration with structured database packages and chunked server-side imports.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/287187","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=287187"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/zainhassandeveloper"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=287187"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=287187"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=287187"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=287187"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=287187"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=287187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}