如何将 Drupal 网站迁移到 WordPress:完整技术指南
从 Drupal 迁移到 WordPress 意味着将数据库内容、媒体文件、URL 结构和用户账户从 Drupal 基于实体的 CMS 架构迁移到 WordPress 的文章类型模型——同时不损失 SEO 权重、不破坏内部链接、不造成停机。该过程涉及通过 FG Drupal to WordPress 插件进行数据库级内容导入,随后进行固定链接映射、301 重定向配置和主题重建。
本指南以精确的技术细节涵盖迁移的每个阶段:迁移前备份策略、环境设置、数据库凭据提取、插件驱动的导入、URL 结构协调以及上线后验证。无论您运行的是 Drupal 7、9 还是 10,以下工作流程均适用。
为什么要从 Drupal 迁移到 WordPress
Drupal 是一个强大的框架,但其复杂性带来了真实的运营成本。模块更新频繁引入破坏性变更,主题设计需要 Twig 模板专业知识,而日常内容编辑也需要开发人员介入。相比之下,WordPress 学习曲线更平缓,拥有更庞大的插件生态系统,对于不需要 Drupal 精细访问控制或复杂内容建模的内容密集型网站而言,总体拥有成本更低。
性能方面的优势同样不可忽视。在配置合理的 VPS 托管环境中,搭载 LiteSpeed、对象缓存和 NVMe 存储的 WordPress 安装,将持续优于运行在共享基础设施上的臃肿 Drupal 技术栈。
按使用场景划分的主要迁移动机:
- 编辑团队对 Drupal 的管理界面和缓慢的发布工作流感到不满
- 代理机构将客户网站整合到单一可管理的 CMS 上
- 开发人员减少 Drupal 模块依赖链带来的维护开销
- SEO 团队寻求与 Yoast 或 Rank Math 等 WordPress 原生工具更紧密的集成
Drupal 与 WordPress:架构对比
在开始之前,了解两个平台之间的结构差异至关重要。对内容存储方式的错误假设是迁移失败或不完整的主要原因。
| 维度 | Drupal | WordPress |
|---|---|---|
| 内容模型 | 实体(节点、分类术语、字段) | 文章类型(posts、pages、CPTs) |
| 数据库架构 | 高度规范化,每种内容类型对应多张表 | 扁平化 wp_posts + wp_postmeta 模型 |
| URL 路由 | 路径别名存储在 path_alias 表中 | 通过 .htaccess 实现固定链接重写规则 |
| 主题引擎 | Twig 模板 + 预处理钩子 | PHP 模板层级 + 钩子 |
| 用户角色 | 每个角色的精细权限 | 固定角色层级(订阅者 → 管理员) |
| 媒体处理 | 带字段附件的托管文件实体 | 带附件文章类型的媒体库 |
| 多语言 | 核心语言模块 | 需要 WPML 或 Polylang 插件 |
| REST API | JSON:API + REST 核心模块 | 内置 WP REST API |
| 托管复杂度 | 高(需要 Composer、Drush) | 低(标准 LAMP/LEMP 技术栈) |
| 插件/模块生态系统 | 约 50,000 个模块 | 约 60,000+ 个插件 |
最关键的架构差距在于内容实体模型。Drupal 将段落、自定义字段和分类引用存储在多个关联表中。FG Drupal to WordPress 插件将这些内容映射到 WordPress 文章元数据和分类术语,但基于段落的复杂布局需要手动重建。
迁移前检查清单
在接触任何环境之前,请完成此列表上的每一项。跳过这些步骤是导致数据丢失和长时间停机的主要原因。
- 审计您的 Drupal 内容清单:节点类型、分类词汇表、用户数量、文件数量和数据库总大小
- 识别没有 WordPress 对应项的 Drupal 模块(例如 Rules、Webform 复杂逻辑、Commerce)
- 确认您的 WordPress 服务器满足最低要求:PHP 8.1+、MySQL 8.0+ 或 MariaDB 10.6+、256 MB PHP 内存限制
- 确定迁移时间窗口——最好选择低流量时段
- 在最终导入过程中对 Drupal 启用维护模式,以防止内容漂移
- 验证 WordPress 服务器能够访问 Drupal 数据库主机(同一服务器、远程主机或 SSH 隧道)
第一步:备份您的 Drupal 网站
完整且经过验证的备份是不可或缺的。您需要数据库转储文件和文件目录两者。
通过 Drush 备份数据库
如果您已安装 Drush(Drupal 9/10 的标准配置),这是最快的方法:
drush sql-dump --result-file=/var/backups/drupal_backup_$(date +%Y%m%d).sql --gzip通过 mysqldump 备份数据库
mysqldump -u drupal_user -p drupal_database_name | gzip > /var/backups/drupal_backup_$(date +%Y%m%d).sql.gz备份文件目录
tar -czf /var/backups/drupal_files_$(date +%Y%m%d).tar.gz /var/www/html/drupal/sites/default/files/phpMyAdmin 备份(图形界面方法)
- 通过您的托管控制面板登录 phpMyAdmin
- 从左侧边栏选择 Drupal 数据库
- 点击导出,选择快速导出方式,格式选择 SQL
- 点击执行下载
.sql文件
将所有备份存档存储在服务器之外——通过 SFTP 上传到远程存储或下载到本地。仅存在于被迁移网站所在服务器上的备份不是真正的备份。
第二步:在目标服务器上安装 WordPress
在目标环境上安装全新的 WordPress 实例。除非您已明确规划了内容合并方案,否则不要将 Drupal 内容导入现有的 WordPress 网站——导入工具不会进行去重处理。
服务器要求
| 要求 | 最低配置 | 推荐配置 |
|---|---|---|
| PHP 版本 | 7.4 | 8.2 |
| MySQL/MariaDB | MySQL 5.7 / MariaDB 10.3 | MySQL 8.0 / MariaDB 10.11 |
| PHP 内存限制 | 64 MB | 256 MB |
max_execution_time | 30s | 300s |
upload_max_filesize | 8 MB | 128 MB |
对于大型 Drupal 网站(10,000+ 节点、多 GB 媒体库),带 cPanel 的 VPS 可让您直接访问 PHP 配置、MySQL 调优参数和定时任务管理——这些在繁重的迁移过程中都是必需的。
通过 WP-CLI 安装 WordPress
cd /var/www/html/wordpress
wp core download
wp config create --dbname=wp_database --dbuser=wp_user --dbpass=secure_password --dbhost=localhost
wp core install --url="https://yourdomain.com" --title="Site Title" --admin_user=admin --admin_password=strongpassword --admin_email=admin@yourdomain.com通过 cPanel 一键安装
如果您的主机提供 cPanel,请导航至 Softaculous Apps Installer,选择 WordPress,填写数据库和管理员凭据,然后点击安装。整个过程不到两分钟。
安装完成后,立即在 php.ini 中或通过 .htaccess 配置以下 PHP 设置:
php_value max_execution_time 300
php_value memory_limit 256M
php_value post_max_size 128M
php_value upload_max_filesize 128M第三步:安装并配置 FG Drupal to WordPress 插件
FG Drupal to WordPress 插件(提供免费版;大型网站推荐使用高级版)负责处理节点、分类术语、用户和媒体文件的数据库级迁移。
安装
- 在您的 WordPress 管理后台,前往插件 > 安装插件
- 搜索
FG Drupal to WordPress - 点击立即安装,然后点击启用
或者,通过 WP-CLI 安装:
wp plugin install fg-drupal-to-wp --activate免费版与高级版功能对比
| 功能 | 免费版 | 高级版 |
|---|---|---|
| Drupal 6/7 支持 | 是 | 是 |
| Drupal 8/9/10 支持 | 部分 | 完整 |
| 段落迁移 | 否 | 是 |
| 用户迁移 | 否 | 是 |
| Webform 迁移 | 否 | 是 |
| 电子商务(Drupal Commerce) | 否 | 是 |
| 多语言内容 | 否 | 是 |
| 优先支持 | 否 | 是 |
对于任何运行 Drupal 8 或更高版本的生产网站,高级版物有所值。手动重建基于段落的内容所花费的开发人员时间成本远高于此。
第四步:获取 Drupal 数据库凭据
FG Drupal to WordPress 插件直接连接到您的 Drupal 数据库。您需要四个值:数据库名称、用户名、密码和主机。
在 Drupal 的 settings.php 中查找凭据
grep -A 20 "'database'" /var/www/html/drupal/sites/default/settings.php输出将包含如下代码块:
$databases['default']['default'] = [
'database' => 'drupal_db_name',
'username' => 'drupal_db_user',
'password' => 'drupal_db_password',
'host' => 'localhost',
'port' => '3306',
'driver' => 'mysql',
];远程数据库访问注意事项
如果 WordPress 和 Drupal 位于不同的服务器上,Drupal 数据库必须接受远程连接。在 Drupal 数据库服务器上执行:
GRANT SELECT ON drupal_database.* TO 'drupal_user'@'wordpress_server_ip' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;同时确保防火墙仅对 WordPress 服务器的 IP 开放 3306 端口——切勿将 MySQL 暴露给 0.0.0.0。
如果无法开放直接的 MySQL 端口,请使用 SSH 隧道:
ssh -L 3307:localhost:3306 user@drupal_server_ip -N -f然后将插件的数据库主机设置为 127.0.0.1,端口设置为 3307。
第五步:运行内容导入
在 WordPress 管理后台导航至工具 > 导入,滚动到 Drupal 部分,点击运行导入工具。
导入工具设置配置
数据库连接选项卡:
- 数据库主机:
localhost(或远程 IP / SSH 隧道地址) - 端口:
3306(或您的自定义端口) - 数据库名称:来自
settings.php的值 - 用户名 / 密码:来自
settings.php的值 - Drupal 文件 URL:您的 Drupal
sites/default/files/目录的公开 URL——媒体下载所必需
在继续之前点击测试连接。此阶段连接失败几乎总是由以下三个问题之一引起:凭据不正确、防火墙阻止了 MySQL 端口,或 Drupal 数据库用户对目标数据库缺少 SELECT 权限。
行为选项卡——大多数迁移的推荐设置:
- 导入文章:是
- 导入页面:是
- 导入分类和标签:是
- 下载图片和附件:是(将媒体复制到 WordPress 上传目录所必需)
- 导入前删除 WordPress 数据:是(仅限全新安装——这将清空
wp_posts及相关表)
开始导入
点击开始 / 恢复导入工具。插件以批次方式处理内容。对于大型网站,导入可能会超时并需要多次恢复——这是预期行为,而非错误。每次只需点击恢复即可。
监控屏幕上显示的导入日志。注意以下情况:
Error downloading file——表示 Drupal 文件 URL 不正确或文件目录无法公开访问
Duplicate entry 错误——通常无害,表示插件在恢复时跳过了已导入的记录
MySQL server has gone away——表示 MySQL 服务器上的 wait_timeout 过低;将其增加到至少 600 秒
SET GLOBAL wait_timeout = 600;
SET GLOBAL interactive_timeout = 600;
第六步:协调 URL 结构并配置重定向
这是大多数指南低估的步骤。Drupal 和 WordPress 之间的 URL 结构不匹配是迁移后 SEO 排名下降的主要原因。
Drupal URL 模式(常见)
Drupal URL 模式
描述
/node/123
默认节点路径(无别名)
/about-us
路径别名(最常见)
/taxonomy/term/5
分类术语页面
/user/1
用户个人资料
/content/article-title
带内容类型前缀的别名
WordPress 固定链接配置
前往设置 > 固定链接,选择尽可能与您的 Drupal 路径别名匹配的结构。对于大多数使用简洁别名的 Drupal 网站,/%postname%/ 是正确的选择。
/%postname%/
如果您的 Drupal 网站使用了类似 /blog/article-title 的带分类前缀 URL,请使用:
/%category%/%postname%/
实施 301 重定向
安装 Redirection 插件(作者:John Godley)用于管理重定向规则。对于批量重定向,从数据库导出您的 Drupal 路径别名:
SELECT source, alias FROM path_alias WHERE langcode = 'en';
然后将生成的 CSV 导入 Redirection 插件,将每个 Drupal 别名映射到其对应的 WordPress URL。对于从未设置别名的 /node/123 格式 URL,创建基于正则表达式的重定向:
/node/([0-9]+)$ → /?p=$1
这将 Drupal 节点 ID 映射到 WordPress 文章 ID——但仅在 FG 插件将原始节点 ID 保留为文章 ID 时有效,这是其默认行为。
重要:在上线前使用 curl -I 测试每个重定向:
curl -I https://yourdomain.com/old-drupal-path
验证响应为 HTTP/2 301,并带有正确的 Location 标头,而非 302 或带有软重定向的 200。
第七步:迁移主题并重建设计
Drupal 主题(基于 Twig)在 WordPress 中没有直接对应项。您必须以 WordPress 主题为基础重建视觉设计。
主题选择策略
基于块的主题(FSE):使用 WordPress 站点编辑器实现完整的布局控制,无需页面构建器。最适合熟悉块标记的开发人员。
带页面构建器的经典主题:Astra 或 GeneratePress 等主题搭配 Elementor 或 Bricks Builder,提供与 Drupal Layout Builder 最接近的体验。
自定义子主题:如果您的 Drupal 网站有高度定制化的设计,请基于最小化父主题(Underscores、Blocksy)构建子主题并复制 CSS。
重建导航菜单
Drupal 菜单不会自动迁移。在外观 > 菜单(经典主题)或站点编辑器的导航块(FSE 主题)下重建菜单。参考您的 Drupal 菜单结构:
drush eval "print_r(menu_tree_all_data('main', NULL));"
或直接查询数据库:
SELECT ml.link_path, ml.link_title, ml.weight, ml.depth
FROM menu_links ml
WHERE ml.menu_name = 'main-menu' AND ml.hidden = 0
ORDER BY ml.weight;
小工具和块
Drupal 块与 WordPress 小工具和 Gutenberg 块大致对应。在外观 > 小工具或直接在站点编辑器中重建侧边栏和页脚区域。包含 PHP 逻辑的自定义 Drupal 块类型需要重建为 WordPress 短代码或自定义块。
第八步:迁移后内容审计
不要跳过此阶段。自动迁移工具能很好地处理结构化内容,但会在边缘情况下静默失败。
内容完整性检查
嵌入式媒体:Drupal 的内联文件引用使用自定义令牌格式([file:123] 或 <drupal-media uuid="..."/>)。这些在 WordPress 中无法渲染。在数据库中搜索这些令牌:
SELECT ID, post_title FROM wp_posts WHERE post_content LIKE '%drupal-media%' OR post_content LIKE '%[file:%';
短代码和 Views:Drupal Views 在 WordPress 中没有对应项。任何渲染了 View 的页面(例如过滤内容列表)都将显示为空白。使用 WP_Query、自定义文章类型归档或 Posts Table Pro 等插件重建这些页面。
自定义字段:通过高级版插件迁移的 Drupal 字段数据存储在 wp_postmeta 中。验证字段值是否存在:
SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE meta_key LIKE 'field_%' LIMIT 50;
用户账户:如果您迁移了用户,请验证角色映射。Drupal 的 authenticated user 角色映射到 WordPress 的 Subscriber。Drupal 的 editor 映射到 WordPress 的 Editor。Drupal 的 administrator 映射到 WordPress 的 Administrator。审计映射关系并根据需要进行调整。
断链检测
在 DNS 切换前,安装 Broken Link Checker 或使用 Screaming Frog 对您的预发布环境进行爬取。在上线前修复所有内部 404 错误——不要依赖上线后的监控来发现这些问题。
第九步:性能与安全加固
刚完成迁移的 WordPress 网站在投入生产之前需要进行加固。
缓存配置
安装 LiteSpeed Cache(如果使用 LiteSpeed 服务器)或适用于 Apache/Nginx 环境的 W3 Total Cache / WP Rocket。配置:
静态页面的页面缓存 TTL 至少设置为 3600 秒
由 Redis 或 Memcached 支持的对象缓存
通过 .htaccess 或服务器配置设置浏览器缓存标头
SSL/HTTPS
确保您的 WordPress 网站仅通过 HTTPS 提供服务。如果您尚未拥有证书,可以快速申请 SSL 证书并配置为自动续期。更新 WordPress 的站点 URL 设置:
wp option update siteurl 'https://yourdomain.com'
wp option update home 'https://yourdomain.com'
在 .htaccess 中强制启用 HTTPS:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
安全加固检查清单
如不需要,禁用 XML-RPC:在 functions.php 中添加 add_filter('xmlrpc_enabled', '__return_false');wp_ 表前缀(需要重命名数据库——如果可能,在导入前执行此操作)755,文件 644,wp-config.php 600find /var/www/html/wordpress -type d -exec chmod 755 {} ;
find /var/www/html/wordpress -type f -exec chmod 644 {} ;
chmod 600 /var/www/html/wordpress/wp-config.php第十步:DNS 切换与上线
在流量最低的时间窗口执行 DNS 切换。实际操作不超过 15 分钟,传播窗口最长 48 小时(大多数解析器通常为 1–4 小时)。
切换前最终检查
- 对预发布 URL 进行完整爬取,确认零 404 错误
- 验证所有 301 重定向返回正确的
Location标头 - 测试联系表单、搜索功能以及任何电子商务流程
- 确认 Google Search Console 已在新网站上完成验证
- 通过 Yoast SEO 或 Rank Math 生成并提交全新的 XML 站点地图
DNS 更新流程
如果您通过 域名注册注册了域名,请直接在 DNS 管理面板中更新 A 记录。在切换前至少 24 小时将 TTL 降低至 300 秒,以最大程度减少传播延迟。
A record: yourdomain.com → [new WordPress server IP]
TTL: 300 (pre-cutover), restore to 3600 post-cutover上线后监控
- 如果域名本身发生了变更,启用 Google Search Console 的地址更改工具
- 在上线后前 30 天监控 Search Console 中的核心网页指标——预计在 Google 重新抓取和重新索引期间会出现临时排名波动
- 设置 UptimeRobot 或同类工具进行可用性监控
- 在第一周每天检查服务器错误日志:
tail -f /var/log/apache2/error.log
# or for Nginx:
tail -f /var/log/nginx/error.log搜索引擎重新提交
在 Google Search Console 中提交更新后的站点地图:
- 前往 Search Console > 站点地图
- 输入
sitemap.xml(大型网站使用sitemap_index.xml) - 点击提交
同时向 Bing Webmaster Tools 提交并在那里独立验证网站——Bing 的索引被包括 Copilot 在内的多个 AI 搜索引擎所使用。
托管基础设施建议
迁移后 WordPress 网站的性能在很大程度上取决于底层基础设施。从 Drupal 迁移到 WordPress 也是同步升级托管技术栈的理想时机。
对于中等流量网站(每月 10,000–100,000 次访问),配备至少 2 vCPU、4 GB RAM 和 NVMe 存储的 VPS 托管方案,可为启用全页缓存的 WordPress 提供充足的资源余量。对于高流量或资源密集型网站,独立服务器可彻底消除”嘈杂邻居”问题,并让您完全掌控内核参数、MySQL 配置和网络栈调优。
如果您管理多个客户网站或偏好图形化服务器管理体验,VPS 控制面板提供多种选择,包括 cPanel、Plesk 和 DirectAdmin——每种都支持从单一界面进行多站点 WordPress 管理、自动备份和 SSL 申请。
技术决策矩阵:何时使用各种迁移方案
| 场景 | 推荐方案 | 关键工具 |
|---|---|---|
| Drupal 7,小型网站(<500 个节点) | FG 插件免费版,同一服务器 | FG Drupal to WordPress(免费版) |
| Drupal 9/10,段落密集型内容 | FG 插件高级版,预发布服务器 | FG Drupal to WordPress 高级版 |
| Drupal Commerce → WooCommerce | FG 高级版 + WooCommerce 附加组件 | FG + WooCommerce 迁移模块 |
| 多语言 Drupal 网站 | FG 高级版 + WPML | FG + WPML 插件 |
| 带复杂 Views 的 Drupal | 需要手动重建 | WP_Query + CPT UI |
| 跨服务器迁移 | 使用 SSH 隧道访问数据库 | SSH 端口转发 |
| 零停机要求 | 蓝绿部署 | DNS TTL 降低 + 预发布环境 |
关键技术要点
- 首先做好备份。压缩的 SQL 转储文件和
sites/default/files/的 tar 包是您的安全网。在开始之前验证两者均完整且可恢复。 - 在运行导入工具前测试数据库连接。大多数迁移失败都卡在连接测试阶段,原因是防火墙规则或缺少
SELECT授权。 - 基于段落的 Drupal 内容需要高级版插件。免费版会静默跳过段落字段,导致内容不完整且不显示任何错误信息。
- 301 重定向不是可选项。每个拥有外部反向链接或搜索引擎索引的 Drupal URL 都必须通过永久 301 重定向到其对应的 WordPress URL。缺少重定向意味着失去排名信号。
- 在切换前 24 小时降低 DNS TTL。将其设置为 300 秒,这样当您切换 A 记录时,传播将在几分钟内完成,而非数小时。
- 审计
wp_postmeta中未映射的 Drupal 字段。自定义字段数据在导入后存储在那里——在停用 Drupal 实例之前,验证其存在且键值正确。 - 不要立即停用 Drupal。在上线后至少 30 天内保持 Drupal 环境运行(处于维护模式,不对外公开访问),作为参考和回滚选项。
- 在上线当天重新提交站点地图。不要等待 Googlebot 自行发现新结构——主动提交可加速重新抓取。
常见问题
我可以将 Drupal 多站点安装迁移到 WordPress 吗?
可以,但每个 Drupal 子站点必须单独迁移。FG Drupal to WordPress 插件不支持在单次操作中处理 Drupal 多站点。根据您的架构,针对每个子站点分别运行导入,目标可以是 WordPress 多站点网络或独立的 WordPress 安装。
我的 Drupal 用户密码会迁移到 WordPress 吗?
不会。Drupal 使用加盐的 SHA-512 哈希(较新版本使用 bcrypt),与 WordPress 基于 phpass 的哈希不兼容。FG 高级版插件会迁移用户账户,但会重置密码,并向每位用户发送密码重置邮件。请提前做好用户沟通计划。
如何处理在 WordPress 中没有对应项的 Drupal 内容类型?
在运行导入之前,在 WordPress 中注册对应的自定义文章类型(CPT)。FG 高级版插件允许您将 Drupal 内容类型映射到 WordPress CPT。如果没有此映射,所有节点将默认为 post 文章类型,导致您的内容分类体系崩溃。
迁移过程中 Drupal 的分类术语会发生什么?
Drupal 词汇表映射到 WordPress 分类法。默认映射将 Drupal 的 tags 转换为 WordPress 标签,将 Drupal 的 categories 转换为 WordPress 分类目录。自定义词汇表需要在导入前在 WordPress 中手动注册分类法,否则将被丢弃。
大型 Drupal 网站的迁移需要多长时间?
对于拥有 5,000 个节点和 2 GB 媒体的网站,在资源充足的服务器上预计导入时间为 2–4 小时,加上 4–8 小时的迁移后内容审计和重定向配置。实际的 DNS 切换不到 15 分钟。对于彻底、生产质量的迁移,从开始到上线的总耗时通常为一到两个工作日。
