将WordPress网站从测试环境(staging)迁移到正式环境(production)是网络开发中最关键的操作之一。如果操作不当,可能会导致网站破坏、数据丢失或严重的SEO损害。但如果操作得当,这可以是一个平稳、低风险的过程,能保持您的在线网站稳定运行。本指南将逐步介绍每个环节——从部署前准备到部署后验证——以便您能够自信地部署。

理解测试环境与正式环境的区别

在深入步骤之前,值得澄清每个环境是什么以及为什么两者都很重要。

测试环境(Staging)是您网站的私密、隔离副本,用于测试。它尽可能地镜像您的正式环境设置——相同的PHP版本、相同的服务器配置、相同的插件和主题。目的是安全地测试新功能、插件更新或重新设计,而不会影响真实访客。在测试环境中出错不会产生任何成本;但在正式环境中出错可能导致流量损失、收入减少和客户信任下降。

正式环境(Production)是您的实时网站——被Google索引的网站、被用户访问的网站、产生业务收入的网站。在这里部署的每项更改都会立即对所有访客可见。这就是为什么每项更改都必须先在测试环境中进行测试。

关于WordPress的一个关键事项是:它将网站URL存储在数据库中。wp_options表中的siteurl和home值,加上您内容中嵌入的所有内部链接,在您复制数据库后仍会参考测试域名。正确更新这些URL是任何WordPress迁移中最重要的步骤。

部署前检查清单——开始前要做什么

跳过准备工作是迁移失败的最常见原因。在接触生产环境中的任何内容之前,请完成此检查清单:

步骤1——从测试环境导出所有内容

迁移始于从测试环境导出两样东西:数据库和所有网站文件。

导出数据库

使用mysqldump通过SSH进行最可靠的导出——没有文件大小限制,没有超时:

# 推荐:通过SSH使用mysqldump
mysqldump -u STAGING_DB_USER -p STAGING_DB_NAME \
  --single-transaction \
  --routines \
  --triggers \
  > staging_export_$(date +%Y%m%d).sql

# 验证导出是否完成(应该> 0字节)
ls -lh staging_export_*.sql

--single-transaction标志对InnoDB表至关重要——它导出一致快照而不锁定可能在导出期间减慢测试网站速度的表。或者,如果SSH访问不可用,您可以通过DirectAdmin中的phpMyAdmin导出,尽管非常大的数据库(超过512MB)可能会超时。

导出网站文件

最快的方法是在服务器上压缩文件并下载存档:

# 通过SSH压缩——比FTP逐个文件快得多
cd /home/staging_user/public_html/
tar -czf ~/staging_files.tar.gz \
  --exclude='.git' \
  --exclude='*.log' \
  --exclude='wp-content/cache' \
  --exclude='wp-content/upgrade' \
  .

# 将存档下载到本地机器
scp [email protected]:~/staging_files.tar.gz ./

步骤2——将文件上传并将数据库导入生产环境

有了导出内容,下一步是将所有内容上传到生产服务器。

将文件上传到生产环境

# 上传存档并在生产服务器上提取
scp staging_files.tar.gz [email protected]:/home/prod_user/

ssh [email protected]
cd /home/prod_user/public_html/
tar -xzf ~/staging_files.tar.gz
rm ~/staging_files.tar.gz  # 清理临时文件

将数据库导入生产环境

# 首先创建生产数据库(如果需要可通过DirectAdmin)
# DirectAdmin:数据库 > 创建数据库

# 通过SSH导入
mysql -u PROD_DB_USER -p PROD_DB_NAME < staging_export.sql

# 验证导入
mysql -u PROD_DB_USER -p -e "SHOW TABLES FROM PROD_DB_NAME;" | wc -l

步骤3——为生产环境更新wp-config.php

从测试环境复制的wp-config.php包含测试数据库凭证。在WordPress连接到正确的数据库之前,必须更新每个数据库设置以与生产环境相匹配。

// 为生产环境更新这四个值
define('DB_NAME',     'production_database_name');
define('DB_USER',     'production_db_user');
define('DB_PASSWORD', 'production_db_password');
define('DB_HOST',     'localhost');  // 在共享主机上通常是localhost

// 表前缀——必须与导出数据库中的内容匹配
$table_prefix = 'wp_';

// 为生产环境生成新的安全密钥
// 访问:https://api.wordpress.org/secret-key/1.1/salt/
define('AUTH_KEY',         'paste-fresh-value-here');
define('SECURE_AUTH_KEY',  'paste-fresh-value-here');
define('LOGGED_IN_KEY',    'paste-fresh-value-here');
define('NONCE_KEY',        'paste-fresh-value-here');
define('AUTH_SALT',        'paste-fresh-value-here');
define('SECURE_AUTH_SALT', 'paste-fresh-value-here');
define('LOGGED_IN_SALT',   'paste-fresh-value-here');
define('NONCE_SALT',       'paste-fresh-value-here');

专业提示:部署到生产环境时始终生成新的安全密钥。测试密钥可能已与多个开发人员共享或存储在版本控制中。重新生成这些密钥会使所有现有会话失效,强制每个人重新登录——这是一个小小的不便之处,可以显著降低生产网站的攻击面。

步骤4——在数据库中搜索和替换URL

这是整个迁移中技术上最敏感的步骤。WordPress在多个数据库表中存储URL——不仅以纯文本形式,还在PHP序列化数据结构中。天真的查找和替换会破坏序列化字符串(编码字符串长度),导致WordPress故障。始终使用序列化感知工具。

方法1——WP-CLI(强烈推荐)

# 首先检查当前URL
wp option get siteurl
wp option get home

# 干运行以在提交前预览更改
wp search-replace 'https://staging.example.com' 'https://example.com' \
  --all-tables \
  --dry-run

# 运行实际替换
wp search-replace 'https://staging.example.com' 'https://example.com' \
  --all-tables

# 替换后刷新所有内容
wp cache flush
wp rewrite flush

方法2——仅wp_options的直接SQL(最小修复)

-- 更新两个关键URL选项
UPDATE wp_options
  SET option_value = 'https://example.com'
  WHERE option_name = 'siteurl';

UPDATE wp_options
  SET option_value = 'https://example.com'
  WHERE option_name = 'home';

-- 验证
SELECT option_name, option_value
  FROM wp_options
  WHERE option_name IN ('siteurl', 'home');

如果使用方法2,您仍需处理 wp_posts 和 wp_postmeta. 从WordPress.org安装"Better Search Replace"插件,在选中"替换guids"的情况下运行它,然后完成后删除该插件。

方法 处理序列化数据 需要SSH 最适合
WP-CLI 是 — 原生支持 是 所有迁移(推荐)
Better Search Replace插件 是 — 内置支持 否 无SSH访问权限
直接SQL UPDATE 否 — 破坏序列化 否 仅wp_options siteurl/home

第五步 — 配置DNS并安装SSL

文件上传且数据库更正后,将域名指向正式服务器并使用SSL保护。DNS更改从几分钟到48小时不等,具体取决于您注册商的TTL设置以及记录最近一次更新的时间。

要在DirectAdmin主机上安装SSL,请导航到DirectAdmin控制面板中的SSL证书。您可以一键安装免费的Let's Encrypt证书,或者如果需要OV/EV验证,可以上传付费证书。安装证书后,将以下内容添加到.htaccess中以强制所有访问者使用HTTPS:

# 强制HTTPS——在WordPress块之前添加
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

第六步 — 设置文件权限并刷新所有缓存

文件权限不正确是迁移后错误的常见原因。WordPress需要特定的权限级别才能正常工作——目录需要可执行,文件需要可读,上传目录需要对Web服务器进程可写。

# 标准WordPress权限
find /home/username/public_html/ -type d -exec chmod 755 {} \;
find /home/username/public_html/ -type f -exec chmod 644 {} \;

# wp-config.php应该更严格
chmod 640 /home/username/public_html/wp-config.php

# uploads目录必须可写
chmod 755 /home/username/public_html/wp-content/uploads/

设置权限后,刷新每个缓存层:

# 刷新WordPress对象缓存和重写规则
wp cache flush
wp rewrite flush

# 如果使用缓存插件
wp rocket clean --post=all      # WP Rocket
wp w3-total-cache flush all     # W3 Total Cache

# 如果您有SSH访问权限,刷新PHP OPcache
php -r "opcache_reset();"

步骤7——部署后验证

在验证网站从头到尾正确运行之前,不要声称部署已完成。系统地完成此检查清单:

关键:验证robots.txt索引设置

WordPress在设置 > 阅读下有内置的"阻止搜索引擎索引此网站"选项,这在测试网站上通常启用以防止意外索引。在生产上保持启用将导致您的网站在数天内从Google消失。

# 通过WP-CLI检查设置
wp option get blog_public
# 应该返回:1(允许搜索引擎)
# 如果返回0,修复它:
wp option update blog_public 1

故障排除常见迁移后问题

即使迁移谨慎,也会经常出现一些问题。以下是如何快速诊断和修复它们的方法。

白屏死亡(WSOD)

通常由PHP内存限制过低或插件冲突引起。启用调试日志以识别原因:

// 暂时添加到wp-config.php
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
define('WP_MEMORY_LIMIT', '256M');

// 然后检查日志
tail -f /home/username/public_html/wp-content/debug.log

除首页外所有页面返回404

这始终是固定链接规则问题。转到管理 > 设置 > 固定链接,不更改任何内容直接点击保存更改。WordPress会自动重新生成.htaccess重写规则。

图像无法显示

URL替换可能未完全覆盖wp_postmeta中的所有序列化附件元数据。再次运行WP-CLI搜索替换命令,或检查数据库中是否还有测试环境URL残留:

SELECT meta_value FROM wp_postmeta
WHERE meta_value LIKE '%staging.example.com%'
LIMIT 20;

常见问题

从测试环境迁移到正式环境之前应该备份数据吗?

您应该在每次迁移前备份数据——包括使用mysqldump的数据库和所有网站文件(wp-content、wp-config.php)。将备份存储在至少两个位置,例如本地和云存储,这样如果部署后出现问题,可以快速回滚。

为什么从测试环境迁移到正式环境时需要更改WordPress URL?

WordPress将网站URL存储在数据库中——在wp_options表中的siteurl和home下——以及包含内部链接的文章内容中。如果URL没有更新,所有链接仍会指向测试域名,导致正式环境上的资源断裂、布局损坏,以及因规范标签指向错误域名而导致的SEO损害。

搜索和替换WordPress数据库中URL最安全的方法是什么?

使用WP-CLI命令wp search-replace 'https://staging.example.com' 'https://example.com' --all-tables,或使用Better Search Replace插件(使用后删除)。最安全的方法是先运行--dry-run查看将影响多少行,然后再提交实际替换。

将WordPress迁移到正式环境后,页面返回404错误——如何修复?

迁移后的404错误几乎总是由从测试环境带过来的过期固定链接规则引起。转到WordPress管理,导航到设置 > 固定链接,不修改任何值直接点击保存更改。WordPress将自动刷新其重写规则并重新生成.htaccess文件。

AsiaGB提供的全功能DirectAdmin主机

AsiaGB主机支持DirectAdmin,完整支持PHP 8.3和MySQL——起价仅500泰铢/年

查看主机计划