{"id":61,"date":"2026-09-06T13:18:02","date_gmt":"2026-09-06T07:48:02","guid":{"rendered":"https:\/\/hostcrafter.com\/blog\/clone-wordpress-site-without-plugin\/"},"modified":"2026-09-06T15:09:39","modified_gmt":"2026-09-06T09:39:39","slug":"clone-wordpress-site-without-plugin","status":"publish","type":"post","link":"https:\/\/hostcrafter.com\/blog\/clone-wordpress-site-without-plugin\/","title":{"rendered":"How to Clone a WordPress Site Without a Plugin, in 30 Seconds of Clicks"},"content":{"rendered":"<p>Every guide to duplicating a WordPress site starts by telling you to install a plugin. That advice was written for shared hosting where you have no other option, and on a site of any size it is the slowest and most fragile route available.<\/p>\n<p>There is a better one, and if your host offers it you already have it. This article is about what copying a WordPress site actually involves, why the plugin route struggles with it, and how to do it in about thirty seconds of your own time.<\/p>\n<dl class=\"hc-facts\">\n<div>\n<dt>Your part<\/dt>\n<dd>About 30 seconds of clicks<\/dd>\n<\/div>\n<div>\n<dt>The server&#8217;s part<\/dt>\n<dd>Usually a minute or two<\/dd>\n<\/div>\n<div>\n<dt>Files through your browser<\/dt>\n<dd>None<\/dd>\n<\/div>\n<div>\n<dt>Effect on the original<\/dt>\n<dd>None \u2014 it is only read<\/dd>\n<\/div>\n<\/dl>\n<nav class=\"hc-toc\">\n<h2>On this page<\/h2>\n<ol>\n<li><a href=\"#why\">Why the Plugin Route Struggles<\/a><\/li>\n<li><a href=\"#really\">What Copying a WordPress Site Really Involves<\/a><\/li>\n<li><a href=\"#urls\">The Four Shapes of a URL, and Why a SQL Find-and-Replace Breaks Sites<\/a><\/li>\n<li><a href=\"#do\">Doing It From the Panel<\/a><\/li>\n<li><a href=\"#after\">What a Clone Cannot Bring With It<\/a><\/li>\n<li><a href=\"#versus\">Clone, Staging or Migration?<\/a><\/li>\n<li><a href=\"#faq\">Questions<\/a><\/li>\n<\/ol>\n<\/nav>\n<h2 id=\"why\">Why the Plugin Route Struggles<\/h2>\n<p>A migration or duplicator plugin has to do everything from inside PHP, inside a web request, which is a bad place to copy a few gigabytes from. Four things go wrong, in roughly this order as the site grows:<\/p>\n<ul>\n<li><strong>The archive build times out.<\/strong> Zipping the site is PHP work, and PHP has a maximum execution time. Good plugins get around this by chunking the job across many requests, which works \u2014 until one of the chunks lands on a slow moment and the whole run has to start again.<\/li>\n<li><strong>Memory.<\/strong> Serialising a large database inside PHP costs memory that your plan does not have spare, and the failure often is not an error message. It is a white page, a half-written archive, or an export that looks complete and is not.<\/li>\n<li><strong>The file goes through your laptop.<\/strong> The classic route is: the server makes a 400 MB archive, you download it over your home connection, then upload it to the destination. That is two transfers of the same bytes across the slowest link in the chain, to move a file between two directories that may be on the same disk.<\/li>\n<li><strong>Then it has to rewrite every address inside the database<\/strong>, which is the part that quietly breaks things. More on that below, because it is the interesting bit.<\/li>\n<\/ul>\n<p>None of this makes those plugins bad. On hosting with no server-side copy, they are the only answer and they are impressively good at a hard job. But if the copy can be made <em>on the server<\/em>, none of the four problems exists: no archive, no PHP time limit, no browser, and the files never leave the machine.<\/p>\n<h2 id=\"really\">What Copying a WordPress Site Really Involves<\/h2>\n<p>Worth knowing even if a button does it for you, because it tells you what can go wrong. A WordPress site is three things, and a copy is not complete until all three have moved:<\/p>\n<ol class=\"hc-steps\">\n<li>\n<h3>The files<\/h3>\n<p>WordPress core, your theme, your plugins and \u2014 nearly always the largest part \u2014 the uploads directory. On the server this is a straight file copy. Done properly it also excludes the junk: cache directories, and the backup archives that backup plugins leave <em>inside<\/em> the site, which is how people end up with a copy twice the size of the original.<\/p>\n<\/li>\n<li>\n<h3>The database<\/h3>\n<p>Every post, page, comment, user, setting and plugin option. Copied schema and all, into a new database with its own name and its own credentials \u2014 which then have to be written into the new site&#8217;s <code>wp-config.php<\/code>, or the copy quietly runs against the original&#8217;s database. That is a genuinely dangerous failure: you edit the copy and the live site changes.<\/p>\n<\/li>\n<li>\n<h3>Every address stored inside the database<\/h3>\n<p>This is where copies go wrong, and it is the next section.<\/p>\n<\/li>\n<\/ol>\n<h2 id=\"urls\">The Four Shapes of a URL, and Why a SQL Find-and-Replace Breaks Sites<\/h2>\n<p>WordPress stores its own address in the database \u2014 not just once in the settings, but scattered through post content, menus, widget configurations, page-builder layouts and plugin options. A copy that does not rewrite all of them is a site that loads and then sends every visitor back to the original.<\/p>\n<p>The obvious approach is to open the database dump in a text editor and replace <code>oldsite.com<\/code> with <code>newsite.com<\/code>. <strong>Do not do this.<\/strong> It will appear to work and it will break your widgets, your page-builder layouts and any plugin that stores structured settings.<\/p>\n<p>The reason is <em>serialization<\/em>. WordPress stores structured data as strings that carry their own length, like this:<\/p>\n<pre><code>s:19:\"https:\/\/oldsite.com\";<\/code><\/pre>\n<p>That <code>19<\/code> is the number of characters PHP expects to find. Replace the domain with a longer or shorter one and the string is now 19 characters according to the label and 21 in reality. PHP refuses to unserialize it, the plugin gets <code>false<\/code> instead of its settings, and your widget area is empty for no visible reason. Nothing errors. It just silently forgets.<\/p>\n<p>Doing it properly means walking the serialized structures and rewriting the values with their length prefixes recalculated \u2014 which is what WP-CLI&#8217;s <code>search-replace<\/code> does, and what any competent server-side copy uses. And it means covering <strong>four shapes of the same address<\/strong>, because a WordPress database holds all four:<\/p>\n<div class=\"hc-tw\"><table>\n<tr>\n<th>Shape<\/th>\n<th>Where it comes from<\/th>\n<\/tr>\n<tr>\n<td><code>https:\/\/oldsite.com<\/code><\/td>\n<td>The obvious one<\/td>\n<\/tr>\n<tr>\n<td><code>http:\/\/oldsite.com<\/code><\/td>\n<td>Whichever scheme the site did not use \u2014 from before HTTPS, or from a plugin that hardcoded it<\/td>\n<\/tr>\n<tr>\n<td><code>\/\/oldsite.com<\/code><\/td>\n<td>Protocol-relative. Very common in themes and page builders<\/td>\n<\/tr>\n<tr>\n<td><code>oldsite.com<\/code><\/td>\n<td>Bare \u2014 which is what a JSON-encoded link looks like once its slashes are escaped: <code>https:\/\/oldsite.com<\/code><\/td>\n<\/tr>\n<\/table><\/div>\n<p>Miss the third and your page builder&#8217;s background images vanish. Miss the fourth and any block storing its settings as JSON keeps pointing at the old site. This is the difference between a copy that works and a copy that mostly works, and it is why &#8220;I&#8217;ll just do a find and replace&#8221; is the single most common way a duplicated WordPress site ends up subtly wrong.<\/p>\n<h2 id=\"do\">Doing It From the Panel<\/h2>\n<p>On <a href=\"https:\/\/hostcrafter.com\/\">HostCrafter<\/a> this is a button, and everything above happens on the server without a file passing through your browser.<\/p>\n<ol class=\"hc-steps\">\n<li>\n<h3>Open the site&#8217;s row and choose Clone<\/h3>\n<p>In <strong>Websites<\/strong>, click the row of the site you want to copy \u2014 the row expands and every action is labelled.<\/p>\n<figure class=\"hc-fig\"><img loading=\"lazy\" src=\"https:\/\/hostcrafter.com\/blog\/wp-content\/uploads\/2026\/09\/website-row-actions-b8a5035220.webp\" alt=\"An expanded website row in the HostCrafter panel showing every action as a labelled tile, including Staging and Clone\" width=\"1882\" height=\"395\" class=\"wp-image-11\" decoding=\"async\" srcset=\"https:\/\/hostcrafter.com\/blog\/wp-content\/uploads\/2026\/09\/website-row-actions-b8a5035220.webp 1880w, https:\/\/hostcrafter.com\/blog\/wp-content\/uploads\/2026\/09\/website-row-actions-b8a5035220-300x63.webp 300w, https:\/\/hostcrafter.com\/blog\/wp-content\/uploads\/2026\/09\/website-row-actions-b8a5035220-1024x216.webp 1024w, https:\/\/hostcrafter.com\/blog\/wp-content\/uploads\/2026\/09\/website-row-actions-b8a5035220-768x162.webp 768w\" sizes=\"auto, (max-width: 1882px) 100vw, 1882px\" \/><figcaption>Clone sits between Staging and Info on an expanded website row.<\/figcaption><\/figure>\n<\/li>\n<li>\n<h3>Choose where the copy goes<\/h3>\n<p>Domains already parked on your account with nothing on them are offered first, and using one of those costs no extra website slot. A domain that is new to the account takes a slot.<\/p>\n<figure class=\"hc-fig narrow\"><img loading=\"lazy\" src=\"https:\/\/hostcrafter.com\/blog\/wp-content\/uploads\/2026\/09\/clone-dialog-36703bd732.webp\" alt=\"The Clone dialog offering a domain already parked on the account as the destination for the copy\" width=\"992\" height=\"540\" class=\"wp-image-17\" decoding=\"async\" srcset=\"https:\/\/hostcrafter.com\/blog\/wp-content\/uploads\/2026\/09\/clone-dialog-36703bd732.webp 992w, https:\/\/hostcrafter.com\/blog\/wp-content\/uploads\/2026\/09\/clone-dialog-36703bd732-300x163.webp 300w, https:\/\/hostcrafter.com\/blog\/wp-content\/uploads\/2026\/09\/clone-dialog-36703bd732-768x418.webp 768w\" sizes=\"auto, (max-width: 992px) 100vw, 992px\" \/><figcaption>Choosing a destination for the clone. A domain already on the account costs no extra slot.<\/figcaption><\/figure>\n<\/li>\n<li>\n<h3>Leave it running<\/h3>\n<p>Typically a minute or two, longer for a site with a large uploads directory. The original is only read from \u2014 nothing about it changes, and it stays online throughout.<\/p>\n<\/li>\n<\/ol>\n<p>The click-by-click version, with every dialog and the five things to check afterwards, is in the knowledge base: <a href=\"https:\/\/hostcrafter.com\/kb\/clone-wordpress-site\/\">how to clone a WordPress site in one click<\/a>.<\/p>\n<h2 id=\"after\">What a Clone Cannot Bring With It<\/h2>\n<p>A copy is a copy of your site. It is not a copy of the world your site lives in, and these are the things that catch people out:<\/p>\n<ul>\n<li><strong>Licences tied to a domain.<\/strong> Premium themes and plugins \u2014 page builders, form plugins, WP Rocket \u2014 are usually licensed per site. The copy will run; it will not update itself, and some will not activate their features at all until they are licensed.<\/li>\n<li><strong>Anything keyed to the domain at a third party.<\/strong> Analytics, Search Console, ad network approvals, reCAPTCHA keys, payment gateway webhooks. All of them point at the old hostname.<\/li>\n<li><strong>Email.<\/strong> Mailboxes belong to the domain, not the site. A cloned site sending mail from a new domain has new deliverability to earn \u2014 new SPF, DKIM and DMARC records, and no sending reputation.<\/li>\n<li><strong>Search engine identity.<\/strong> The copy is a different site to Google. If the two are publicly reachable with the same content, that is duplicate content competing with itself \u2014 keep the copy out of search until you have decided which one is the real one.<\/li>\n<li><strong>Scheduled jobs mid-flight.<\/strong> A copy inherits every scheduled task in the database, so a newsletter plugin can cheerfully send from both sites. Check that before you leave it running.<\/li>\n<\/ul>\n<div class=\"hc-cal warn\"> <b>The one that actually costs money.<\/b> If the site takes orders, the clone inherits the payment gateway configuration and can process real transactions. Put it in test mode before you touch anything. <\/div>\n<h2 id=\"versus\">Clone, Staging or Migration?<\/h2>\n<p>Three different tools that all copy a site, and picking the wrong one wastes an afternoon.<\/p>\n<div class=\"hc-tw\"><table>\n<tr>\n<th><\/th>\n<th>Clone<\/th>\n<th>Staging<\/th>\n<th>Migration<\/th>\n<\/tr>\n<tr>\n<td><strong>Produces<\/strong><\/td>\n<td>An independent second site<\/td>\n<td>A temporary copy tied to its live site<\/td>\n<td>Your site, moved here from somewhere else<\/td>\n<\/tr>\n<tr>\n<td><strong>Can be published back over the original<\/strong><\/td>\n<td>No<\/td>\n<td>Yes<\/td>\n<td>Not applicable<\/td>\n<\/tr>\n<tr>\n<td><strong>Use it when<\/strong><\/td>\n<td>You want a second site: a demo, a fork, a new domain<\/td>\n<td>You want to change the original safely<\/td>\n<td>You are moving in<\/td>\n<\/tr>\n<\/table><\/div>\n<p>The short version: <strong>if the change is meant to end up on the original site, you want <a href=\"https:\/\/hostcrafter.com\/kb\/wordpress-staging-site\/\">staging<\/a>, not a clone.<\/strong> Cloning is for when you want two sites at the end.<\/p>\n<div class=\"hc-faq\">\n<h2 id=\"faq\">Questions<\/h2>\n<h3>Is cloning safe to do on a live site?<\/h3>\n<p>Yes \u2014 the original is read, never written. It stays online, keeps serving visitors, and nothing about its configuration changes. The risk in cloning is always at the destination, which is why the panel refuses to clone over a domain that already has WordPress on it.<\/p>\n<h3>Can I clone onto a domain I have not bought yet?<\/h3>\n<p>No, but you do not need to. Clone onto a spare or temporary hostname, work on it there, and move it to the real domain later \u2014 a rename rewrites the addresses again in the same four shapes.<\/p>\n<h3>Will the clone show up in Google?<\/h3>\n<p>Only if you let it. Set the copy to discourage search engines before you point anything at it, and decide deliberately when it should become a real, indexed site.<\/p>\n<h3>How big can a site be before this stops being quick?<\/h3>\n<p>The database is almost never the problem; the uploads directory is. A site with 40 GB of images takes as long as copying 40 GB takes, whoever does it \u2014 the difference is that on the server it is a disk-to-disk copy rather than two trips across the internet.<\/p>\n<h3>Does the clone count against my plan?<\/h3>\n<p>It is a website like any other, so it uses a website slot unless the destination domain is already parked on your account with nothing on it. Its files count against your storage.<\/p>\n<\/p><\/div>\n<div class=\"hc-rel\">\n<h2>Read next<\/h2>\n<ul>\n<li><a href=\"https:\/\/hostcrafter.com\/blog\/change-wordpress-theme-live-site\/\">How to Change Your WordPress Theme Without Visitors Noticing<\/a><\/li>\n<li><a href=\"https:\/\/hostcrafter.com\/kb\/clone-wordpress-site\/\">The Click-by-Click Guide to Cloning<\/a><\/li>\n<li><a href=\"https:\/\/hostcrafter.com\/kb\/wordpress-staging-site\/\">How to Create a WordPress Staging Site<\/a><\/li>\n<\/ul><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Export plugins choke on big sites and corrupt serialized data. Copying a WordPress site at the server is faster, and this is what it actually does.<\/p>\n","protected":false},"author":1,"featured_media":83,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-61","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress"],"_links":{"self":[{"href":"https:\/\/hostcrafter.com\/blog\/wp-json\/wp\/v2\/posts\/61","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hostcrafter.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hostcrafter.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hostcrafter.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hostcrafter.com\/blog\/wp-json\/wp\/v2\/comments?post=61"}],"version-history":[{"count":2,"href":"https:\/\/hostcrafter.com\/blog\/wp-json\/wp\/v2\/posts\/61\/revisions"}],"predecessor-version":[{"id":88,"href":"https:\/\/hostcrafter.com\/blog\/wp-json\/wp\/v2\/posts\/61\/revisions\/88"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hostcrafter.com\/blog\/wp-json\/wp\/v2\/media\/83"}],"wp:attachment":[{"href":"https:\/\/hostcrafter.com\/blog\/wp-json\/wp\/v2\/media?parent=61"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hostcrafter.com\/blog\/wp-json\/wp\/v2\/categories?post=61"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hostcrafter.com\/blog\/wp-json\/wp\/v2\/tags?post=61"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}