问题描述
我在一个盒子上进行开发,另一个用于生产。现在我只是转储数据库,然后找到一个替换为 URL 更改; 然后复制文件并导入新的 SQL 。
有更好的方法吗?
最佳解决方案
@ Insanity5902:WordPress 网站从一个框架部署到另一个框架已经是 PITA,从第一天开始使用 WordPress 。 (Truth-be-told 它是一个 PITA 与 Drupal 在 2 年前,我开始使用 WordPress,所以问题肯定不是专门用 WordPress 。)
它让我感到困扰,每次我需要移动一个网站时,我都不得不花费很多时间重复工作,这样我就不会像我喜欢的那样频繁地进行测试。所以大约 4-6 个月前,我开始从事一个插件来解决 webhost 迁移问题和 I mentioned my ideas on the WP Tavern forum 。
很快前进到今天,我已经有很多工作,我很方便地称之为 「WP 迁移 Webhosts」 。即使插件仍然是非常多的测试版 (可能甚至是 alpha) 给你的问题,我想我已经准备好让人们开始抨击它。
设想的 use-case 是 1.) 首先,开发人员处理通过 FTP 上传所有更改的主题和插件文件,2.) 然后将开发 MySQL 数据库完整上传到测试服务器,最后 3.) 然后运行插件迁移任何来自先前领域的新引用。 (我的插件不会尝试解决新的数据库字段或表与实时数据的合并; 这是一个更大的问题,我不知道如何解决。)
你可以从我的网站 download the plugin 解压到你的插件目录 (如果你不知道该怎么做,那么这个插件不适合你,因为它需要一个知道他们在做什么来使用它) 。我会保持这个插件在线,直到我发布到 WordPress.org 之后,你应该在那里寻找它。
要使用它,您可以在 wp-config.php
中采用不同的方法,通过注释四 (4) 定义 DB_NAME
,DB_USER
,DB_PASSWORD
和 DB_HOST
,而不是注册 webhosts 的默认值,然后注册每个 webhost 本身的信息。以下是 wp-config.php
的这个部分可能是什么样的 (注意第一部分是不需要的代码注释掉,并且还注意到,我在本地机器上设置了我的主机文件,使用 non-routable .dev
顶级域名,使 day-to-day 开发变得更加轻松在 Mac VirtualHostX 使它变得轻而易举):
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
//define('DB_NAME', 'wp30');
/** MySQL database username */
//define('DB_USER', 'wp30_anon');
/** MySQL database password */
//define('DB_PASSWORD', '12345');
/** MySQL hostname */
//define('DB_HOST', '127.0.0.1:3306');
require_once(ABSPATH . 'wp-content/plugins/wp-migrate-webhosts/wp-webhosts.php');
register_webhost_defaults(array(
'database' => 'example_db',
'user' => 'example_user',
'password' => '12345',
'host' => 'localhost',
'sitepath' => '', // '' if WordPress is installed in the root
));
register_webhost('dev',array(
'name' => 'Example Local Development',
'host' => '127.0.0.1:3306',
'domain' => 'example.dev',
'rootdir' => '/Users/mikeschinkel/Sites/example/trunk',
));
register_webhost('test',array(
'name' => 'Example Test Server',
'rootdir' => '/home/example/public_html/test',
'domain' => 'test.example.com',
));
register_webhost('stage',array(
'name' => 'Example Staging Server',
'rootdir' => '/home/example/public_html/stage',
'domain' => 'stage.example.com',
));
register_webhost('live',array(
'name' => 'Example Live Site',
'rootdir' => '/home/example/public_html/',
'password' => '%asd59kar12*fr',
'domain' => 'www.example.com',
));
require_once(ABSPATH . 'wp-content/plugins/wp-migrate-webhosts/set-webhost.php');
希望这是 (大部分) 自我解释。我试图使代码尽可能干净,但不幸的是,它需要这两个隐藏的 require_once()
线之前和之后的 webhost 注册码,因为我没有办法”hook” WordPress 之前 wp-config.php
被调用。
一旦您更新了 wp-config.php
,您可以使用 URL 快捷方式 wp-migrate-webhosts
进入管理界面,如下所示:
以上内容将带您进入如下所示的管理屏幕,它具有相当的描述文本,并允许您在选择要迁移的域后单击鼠标,从任何其他 Webhost 域迁移 (注意:此示例显示正在进行) 从测试/舞台/实时服务器到本地开发,但请放心,它可以迁移到任何位置,这意味着该插件将非常适合现有的实时站点,并迅速使本地开发环境工作! ):
如果不清楚”migration” 在此上下文意味着更新当前数据库中的所有引用以适合当前定义的 Webhost(并且”current” 通过检查 $_SERVER['SERVER_NAME']
进行嗅探) 。
插件的优点是它实现了一些基本的迁移,但是任何人都可以挂接它并执行自己的迁移。例如,如果您添加了一个库数据库中存储图像完整路径的库插件,您可以将 migrate_webhosts
操作挂起,该操作将从 「web」 和 「到」webhost 传递每个作为元数据的数组,您将允许使用 SQL 或任何适用的 WordPress API 函数执行数据库中所需的任何操作,以进行迁移。是的,我们任何人都可以做这个没有插件,但没有插件我发现编写所需的代码是更多的努力,而不是值得。使用插件,只需更容易地编写这些小钩子即可完成。
您还可能发现我的迁移失败,我没有测试的边案例,也许你可以帮助我改进插件?任何想要通过我的 Gmail 帐户发送电子邮件的人 (我的别名是”mikeschinkel.”)
此外,该插件被设计为接受 user-define webhost 元数据,除了它被识别为 database
,user
,password
,password
,host
,host
,domain
等。一个完美的例子可能是 googlemaps_apikey
,您可以在其中存储不同的 API 密钥, Google Map 的插件需要正确运行 (谁在使用 Google Maps 插件之间谁没有将应用程序部署到实时服务器,并忘记将代码更改为正确的 API 密钥?来吧,老实说:) 使用此插件,您的 register_webhost() 数组中的 googlemaps_apikey
元素和小型自定义 migrate_webhosts
钩子可以有效地消除这一点!
那就是这个。我在 WordPress 答案的 Exchange 上启动这个插件,因为 @ Insanity5902 的问题触发了它。让我知道这是否有帮助,如果适用,或通过电子邮件,如果没有。
美国如果你决定使用这个记住它是 alpha / beta,这意味着它会改变,所以如果你想现在使用它,然后使用发布的版本一旦被许多手殴打,为一些小手术做好准备。
P.P.S. 我的目标是什么?我很高兴看到它迁移到 WordPress 核心,以便每个人都可以访问它。但在此之前,甚至可以认为很多人都有兴趣使用它来确保它实际上解决了更多的问题,那么它可能会创建。所以如果你喜欢这个想法,那么一定要使用它,并帮助我获得动力,最终有希望纳入 WordPress 核心。
次佳解决方案
如果可能,我在 wp-config.php
中设置 WP_HOME
和 WP_SITEURL
。这与数据库转储和导入相结合,是我熟悉的最简单的所有解决方案。
http://codex.wordpress.org/Changing_The_Site_URL#Edit_wp-config.php
第三种解决方案
我最喜欢的黑客向/etc/hosts
添加一个设置,使生产域指向您的开发框,就在您的机器上。要部署到生产您 rsync 所有的文件,并推动数据库。
这个战略的风险是明确的; 您可能会将开发环境与生产环境混淆。
这仍然是一个容易修复。
第四种方案
当我几个月后迁移到 WP 时,我想要类似的东西,所以我写了一个非常简单的 shell 脚本,它使用 rsync 和 mysqldump 在 ssh 上:
http://snarfed.org/sync_wordpress
它不是复杂的或基于网络的,但我很高兴。
第五种方案
WP Engine 是一项新的服务,提供 「One-Click 分期」:
WPEngine has an exclusive feature called 「staging.」 Here』s how it works: Before you make a scary change to your blog, click the 「snapshot」 button. We make a complete copy of your blog and set it up in a separate, safe area. You can play with anything you want; nothing』s live. Only when you』re ready to make it live do you touch your main site.
看起来是一个非常简单的方法来快速从开发转向生产,尤其是已经有活的网站。
第六种方案
复制器插件:这是一个我一直在工作的插件。它目前处于测试阶段,但它可以为大多数网站完成工作。现在它的目标是更小的 WordPress 安装。 http://wordpress.org/extend/plugins/duplicator/
资源:插件的其他资源可以在这里找到:http://lifeinthegrid.com/duplicator/
社区:请告知我们您的成功或任何可能遇到的问题!为了更轻松地管理各种线程,请将问题发布到 WordPress.org 插件论坛。请不要将插件中的任何记录数据发布到在线论坛。记录数据可以提交给我们的支持站点。
第七种方案
您可以看一下来自 iThemes 的产品,称为 BackUpBuddy 。我只用了两次,每次都有两个或两个,但总体来说看起来很有希望。
第八种方案
我个人对我的 Github 项目 (称为 Autopress) 来处理这个问题。我还没有一个完美的解决方案,但我越来越近了,特别是从 wpengine 的 wpstage 插件。
第九种方案
这看起来很有前途。我们正在处理一些脚本来处理迁移一些数据,例如 wp-options,更改数据库中的路径,通过媒体复制。
我的问题是,现场不断发展,另一方面正在发展。我们工作的一个网站每天有 20 个帖子,每天有超过 3,000 个评论。这是太多的数据可以通过 phpmyadmin 或通过命令行移动。此外,移动数据总是导致 UTF 问题出于某些原因。
此外,现在看起来菜单选项存储在数据库中,我还有更多的处理方法。
我检查所有的代码到 SVN,并通过 FTP 从服务器 (Beanstalk) 部署代码。这不会对我进行 DB 的更改,或者激活新的插件。
我现在的计划是在我正在开发的时候创建一个清单文件,以便对现场网站进行所有的更改。
例如,该文件将具有人类可读行
它会包括激活的插件,wp-options 移动,图像移动,页面移动。然后我的插件将检测清单文件,并对分段站点进行所有更改。
一旦我测试了,并确定我得到了所有的东西,我可以肯定它会在生产中工作。
这个插件仍然是一个想法,但是我已经为它编写了一些代码。
另外,如果要更改 DB 中的 URL,可以使用以下 SQL 。
只需用旧域名替换 $old$
和新的 $new$
update wp_postmeta set meta_value = replace(meta_value, '$old$' , '$new$') ;
update wp_posts set post_content = replace(post_content, '$old$' , '$new$') ;
update wp_options set option_value = replace(option_value, '$old$' , '$new$') ;
第十种方案
两个具有类似目标的 Google Summer of Code 项目:
- Automatic Migration(GSoC 2010)
- WordPress Move(proposal)(GSoC 2011)
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。