#

Development

Subscribe
Development October 29, 2026·14 min read

WordPress Staging to Live: A Safe Deployment Checklist

On an active WordPress site, push your tested files and only the database changes you can safely isolate and verify, so newer production orders, accounts and content stay untouched. A full staging overwrite is an option when the live site is intentionally replaceable, or when you have reconciled all the data that differs and controlled writes. Start by listing your changes, confirming a restorable backup and choosing the smallest push that still carries the whole change.

Is a full replacement of the live site safe?

WordPress deployment decision

A staging site is a copy of your website at one point in time. From the moment you create it, the two environments start to differ. A customer buys something on the live site. Someone registers an account. The staging database has none of those records. A checkout redesign can be ready to ship while the staging copy is already missing a newer real order.

Replace the live database with that older copy and you lose the newer records. The WordPress Hosting Handbook warns about orders, comments and users added after staging was created.

Full database push: GO or NO-GO? Mark NO-GO when production holds valuable changes made since staging was created and you have not reconciled them.

An agency maintainer on r/woocommerce asked: “I'm wondering how people are handling staging pushes on live sites taking transactions... I would imagine you'd want to do a selective database sync excluding woocommerce tables, correct?”

Direction decides the answer. A push moves changes from staging to production, while a pull refreshes staging from production. Tested code moves up from staging. Valuable live records stay on production. Carefully controlled database changes move up too, once you know what they touch.

A change inventory covering files, database records and uploads

WordPress change inventory

A redesigned page can come from edited theme files, a Site Editor template stored in the database, plugin settings, or several of these together. You can't see from the visible change where it is stored.

WordPress keeps different parts of the site in different places. A plugin's PHP code lives in its directory, while its configuration and activation state live in the database. A media attachment has two parts: a file in wp-content/uploads and its Media Library record.

Files-only pushes leave database-stored layouts and settings behind. Copy an image without its attachment information and it goes missing from the Media Library. Push its record without the file and the asset breaks.

List each change, where it lives and which site holds the right version

What changedWhere it livesWhich site has the right versionWhat must move with it
Custom theme stylesheetTheme filesStaging, tested versionRelated theme settings
Site Editor template or styleDatabaseStaging, tested designTemplate and global-style records
New WooCommerce orderOrder-related database recordsProductionOrder and extension relationships
Page-builder layoutDatabase metadata, possibly filesDepends on what was editedBuilder templates, settings, assets
Newly uploaded photographUploads and attachment recordsThe site where it was uploadedFile and database metadata
Plugin update and configurationPlugin files and databaseDepends on the plugin releaseActivation, settings, schema changes

Hold back any item with an unknown database dependency until you understand how it behaves. For a WooCommerce checkout change, explicitly distinguish the template or configuration being deployed from the live order and customer records that must not be replaced.

Theme database dependencies

Take a new stylesheet and a redesigned checkout. The stylesheet is a plain file change. The checkout involves plugin code, templates, options and related database records. Copying both as plain files carries a different failure risk for each.

New customer uploads are easy to overlook, because the uploads directory looks like ordinary site files. Say a customer added an image to production after you cloned staging.

Which push method fits your changes?

Deployment method comparison

Pick the method that carries the whole tested change and keeps the required live state intact. A staging plugin, a managed host and a manual file transfer behave differently, even when each offers a feature called Push to Live.

MethodBest forWhat it doesRule it out when
Files-only pushTheme, plugin, CSS or application code changesCopies the selected files and leaves the production database alone when configured correctlyRequired settings, content or migrations are missing
Host or plugin selective pushFiles, directories or tables the tool supportsCopies the selected parts under provider-specific rulesThe selection would replace valuable live data
Content import or manual recreationPosts, pages or builder content the tool supportsMoves the selected content through a suitable workflowRequired relationships or metadata cannot be moved
Full files and database pushPrelaunch sites or production you can deliberately replaceReplaces a broad portion of the destination siteUnreconciled live records remain
Git or CI code deploymentRepeated code releases that developers manageMoves version-controlled changesDatabase dependencies have no separate migration plan

The biggest difference is how much of the database a tool can move. Some tools let you pick a table, then replace every destination row in it without automatically merging individual records or resolving conflicts between the two databases.

WP STAGING documents file and table selection in its push workflow. WordPress.com's staging synchronization has different controls. Including its database sync transfers the database as a whole, without selecting individual posts or pages through that workflow.

Staging transfer options

When the preferred push tool is unavailable

Some site owners get staging but not the product's preferred push feature. If the change is only tested files, a file push limited to those files does the job. Supported content imports handle some page changes. Complex database-backed templates and settings need their own transfer method or a manual rebuild.

Protect live orders, users and other production records

Production data preservation

List the live records that must still be there after the push. For a WooCommerce store, that list includes the latest real order, its status, a recent customer account and extension-generated transaction state. A learning platform must keep progress and memberships. A booking site, a contact-form system or a publishing site each has its own live records to protect.

Record what must survive

  • Transactions: Note references for recent orders, refunds and statuses, plus any custom order-numbering system.
  • Accounts: Find recent registrations and the roles that must keep working.
  • Application activity: Note references for new form submissions, course completions, bookings or membership updates that relate to this push.
  • Content and assets: Find pages, comments and uploads created directly on production.

Pick references and timestamps for a later comparison. Skip private customer data. A safe rehearsal can use synthetic orders and accounts on isolated copies: record an order created on the production-side copy after the staging split, then check that its identifier, status and related records still match after the proposed transfer.

Check how WooCommerce stores orders

WooCommerce High-Performance Order Storage (HPOS) uses dedicated order-related tables. Older WooCommerce configurations stored orders through WordPress posts and postmeta. HPOS became the default for new WooCommerce installations starting with version 8.2, and existing stores differ in storage mode and compatibility synchronization settings. The WooCommerce HPOS documentation explains the differences.

WooCommerce order storage

In the WordPress admin, open WooCommerce → Settings → Advanced → Features and check the selected order-data storage and compatibility mode settings. Record those settings for both sides of the rehearsal. A fixed list of excluded WooCommerce tables cannot account for every installation's order storage, compatibility mode or custom extension data. The transfer must also preserve the related metadata, customer links, payment or extension state and order-numbering behavior for the setup you actually run.

A maintainer discussing a Cloudways and Divi WooCommerce site on r/woocommerce described an order-numbering problem after staging pushes: “Now when someone places another order, there will be a duplicate W2004.”

Controlling new writes temporarily reduces the number of records that differ during the push. It does not recover orders or submissions already missing from the staging copy.

Page builders, LMS data and other coupled database changes

Page builder deployment

A redesign gets harder when the visual change lives in database records and production keeps receiving orders, registrations or learning activity.

WordPress Site Editor changes can be database-backed. Page builders also rely on templates, post types, options, metadata and related files.

A maintainer moving from Elementor Pro to Breakdance described the obstacle on r/BreakdanceWP: “Can’t just push the staging site live since we have a dynamic LMS that’ll be overwritten if we do.”

For supported posts and pages, WordPress content export/import is suitable. Other changes call for a builder's own transfer tools or a deliberate recreation of its settings. The native WordPress import does not guarantee a complete transfer of proprietary builder templates, plugin-specific metadata or all related assets.

Test the transferred feature on a copy

  • Check that templates, styles and page content appear as designed.
  • Exercise changed forms, popups and other affected builder features.
  • Confirm that the required plugin settings, assets and configuration move with the change.
  • Make sure the proposed transfer leaves course progress, memberships and transactional records intact.
Builder dependency testing

A restorable backup and a rollback point come before the push

WordPress recovery checkpoint

Preserve the tested staging work. Separately, create a production backup of the relevant site files and database.

Confirm where the backup lives and who has access to it during an outage. Check that you have tested the restoration path, and decide which backup you would restore from. A backup-complete notification alone does not prove recoverability.

Decide which failures justify a rollback. Set the maximum loss of live activity you will accept, since restoring an earlier backup can remove legitimate orders or other records created afterward. If an important site has no credible restore path, hold the push until you have one.

Settings that differ between staging and production

WordPress environment settings

Staging and production differ in PHP configuration, security plugins, URLs, scheduled tasks and integrations. Those differences matter even when the right files and data are pushed.

SettingOn stagingNeeded on productionWhat to check
PHP and dependenciesTested runtime and plugin versionsCompatible runtime and dependenciesCompare PHP version, theme and plugin requirements
WP_ENVIRONMENT_TYPETypically identified as stagingProduction environment valueRead the setting on the destination
Login and securityStaging authentication or login plugin rulesWorking live administrator accessReview the login path and configuration
EmailCaptured, disabled or test routingApproved production deliveryFind out where messages go and how they are sent
Payments and APIsSandbox accounts and test servicesIntended production integrationsCheck credentials, webhooks and endpoints
Scheduled tasksStaging jobs restricted as intendedProduction automation runs correctlyCompare cron and external job configuration
URLs and visibilityStaging hostnames and access restrictionsCorrect live hostname, HTTPS and indexing stateCompare redirects and visibility settings

WordPress.com's documented staging synchronization does not automatically update the production PHP version to match staging. A successful database and file transfer therefore leaves a runtime difference.

WordPress recognizes the environment values local, development, staging and production, and uses production when none is set. That value informs plugin and theme behavior. The value alone does not stop outgoing emails, payment requests, cron activity or visitor access.

Hosting configuration differences

Staging needs safeguards for test messages, external APIs, payment services and scheduled activity. Search visibility has three separate controls: authentication limits access, noindex governs indexing and robots.txt controls crawling. A crawler blocked by robots.txt can never see the page's noindex directive.

A site owner on r/Wordpress described a login configuration difference: “One thing I have noticed is that I use WPS hidelogin plugin but this hasn’t copied across to the staging site.”

Kinsta's push-environment documentation says its selective pushes include specified environment settings, including redirects, geolocation, PHP and Nginx configuration. It separately documents retention of the destination's custom Nginx configuration.

Push only the changes on your list

WordPress release execution

With the method, backup and environment checks settled, run the push.

  1. Name the tested staging source, the production destination and the changes you are pushing.
  2. Control interruptions and new writes where the method requires it, and account for external systems that can keep sending data.
  3. Read the final preview. Confirm that the push matches your list of changes and that you understand the destination-deletion controls.
  4. Move the tested files, supported content or precisely mapped data changes with your chosen tool.
  5. Save the tool's status, warnings and transfer details for diagnosis and sign-off.

Options that delete live data: A push affects more than the items it copies into production. WP STAGING documents options to uninstall production plugins that are absent from staging and to delete the production wp-content/uploads directory before copying staging uploads. Do not run a push that would remove live plugins or uploads outside what the push covers. Check the actual options your provider shows.

Staging URL replacement

Adjust stored URLs only when the transfer requires it

Database-backed content moved between staging and production hostnames can keep the staging URLs. WordPress can store URLs in PHP-serialized values, and a naive text replacement can corrupt that data.

The WP-CLI search-replace documentation describes serialization-aware replacement and a --dry-run option. When you need URL changes, review the proposed replacement and the tables it covers before running it for real. Custom tables, plugin data and multisite behavior change which tables the replacement should cover.

If the push carries no stored URLs, skip the URL replacement.

Verification covers the new changes and the preserved production data

Production release verification

Mark the push PASS only when two things hold: the intended changes work, and the production records you listed stay intact. In a WooCommerce rehearsal, that means the staging checkout change appears on the destination while the newer synthetic order from the production-side copy remains complete, with its expected status and relationships. Save the before-and-after evidence.

A homepage that loads correctly can still hide a missing recent order, a changed customer role or a broken form submission history. Use your change inventory and your list of live records to test the two outcomes separately.

Feature checkData checkWhat you should seeFeature / data result
Updated theme or layoutRecent order stateDesign works. The newer order, status and linked data remainFeature: ____. Data: ____
Changed templatesRecently registered accountTemplate renders and the account remains usableFeature: ____. Data: ____
Updated media presentationRecent attachment recordsImages load, and records and files alignFeature: ____. Data: ____
Login-related changeAdministrator account and accessLogin works and required access remainsFeature: ____. Data: ____
Form or plugin behaviorExisting submissionsChanged workflow works and older entries remainFeature: ____. Data: ____
HTTPS or routing changeRequired production configurationCorrect URLs, redirects and environment behaviorFeature: ____. Data: ____
Live website acceptance

Test the affected visitor and administrator workflows

Exercise every path the push touched, such as mobile and desktop layouts, relevant templates, administrator login, forms, membership access and checkout. If a test that charges no one is available, use it.

Check live URLs, HTTPS behavior, media and indexing configuration. If a change looks missing, find out whether you are seeing cached output or whether the transfer never delivered the template or setting. Application and PHP logs reveal failures the homepage hides.

A presentation defect that is isolated and understood, with production data intact, can wait for a targeted fix.

What should you do after a failed push?

WordPress deployment troubleshooting

Sort a failed push by its symptom before trying another transfer. A stalled file transfer, a PHP error, broken access and missing customer records each have different causes and call for different recovery steps.

  • Push stalls or reports failure: Read the transfer tool's error details and the relevant hosting logs.
  • White screen or HTTP 500: Examine PHP, server and WordPress error evidence to find the failing component. Keep sensitive debug output away from public visitors.
  • Administrator access disappears: Compare user records, authentication rules and login-plugin behavior with their known state before the push.
  • Wrong URLs or missing media: Work out whether stored hostnames, attachment records, incomplete file transfers or caches explain the symptom.
  • Orders, users or other live records are missing: Stop pushing, keep whatever evidence you have, and follow the recovery plan you set before the push.
WordPress failure diagnosis

When a page looks unchanged but the production data is intact, a narrowly targeted repair can fix it, such as addressing cached output or one untransferred template. Check your notes from the push to see what was transferred before trying another.

When you suspect production data is already damaged, a second full-database push can make the problem worse, and an untested bulk restore can reverse legitimate activity. Compare the saved order references and related records against the pre-push state before choosing a controlled repair or the documented restore path. Your recovery plan decides how to protect good transactions that arrived after the backup.

NoScript Team