it-swarm.cn

如何:轻松将WordPress安装从开发安装到生产?

我在一个盒子上进行开发,然后使用第二个盒子进行生产。现在我只是转储数据库,然后找到URL更改的替换;然后复制文件并导入新的SQL。

有更好的方法吗?

197
Ryan Gibbons

@ Insanity5902 :从第一天开始使用WordPress,从一个盒子到另一个盒子的WordPress网站的部署就是PITA。 (说实话,在我开始使用WordPress之前,这是一个与Drupal合作的PITA 2年,所以问题当然不仅限于WordPress。)

让我感到困扰的是,每当我需要移动一个网站时,我就不得不经常花费大量的精力,这使我无法像我希望的那样经常进行部署。所以大约4-6个月前我开始研究一个插件来解决webhost迁移问题, 我在WP Tavern论坛 上提到了我的想法。

快进到今天,我几乎让它工作,我很方便地称它为“WP迁移Webhosts。”即使插件仍然是非常多的beta(可能甚至是alpha),但我认为我已经准备好让人们开始敲打它了。

设想的用例是:

  1. 首先,开发人员通过FTP处理上传所有更改的主题和插件文件,
  2. 然后将开发MySQL数据库完整地上传到测试服务器
  3. then运行插件以将先前域中的任何引用迁移到新域。 (我的插件确实not尝试解决新数据库字段或表与实时数据的合并; THAT是一个更大的问题,我不确定如何解决。 )

你可以从我的网站 下载插件 并解压缩到你的插件目录(如果你不知道如何做到这一点,那么这个插件不适合你,因为它需要有人知道他们在做什么来使用它。我将这个插件保持在线,直到我将它发布到WordPress.org,之后你应该在那里寻找它。

要使用它,你可以在你的wp-config.php中采用不同的方法,通过注释掉四个(4)定义DB_NAMEDB_USERDB_PASSWORDDB_Host而不是注册默认为webhosts,然后注册关于每个webhost本身的信息。这是wp-config.php的那个部分可能是什么样子(注意第一部分是注释掉的不需要的代码,并且还注意到我在本地机器上设置了我的主机文件,具有不可路由的.dev顶级域以进行日常开发更容易。在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');

希望这(大部分)是自我解释的。我试图使代码尽可能干净但不幸的是它需要在webhost注册代码块之前和之后的那两条神秘的require_once()行,因为在wp-config.php之前我没办法“hook”WordPress调用。

更新wp-config.php后,您只需使用URL快捷方式wp-migrate-webhosts即可转到管理界面,如下所示:

http://example.com/wp-migrate-webhosts

以上内容将带您进入以下管理界面,其中包含相当多的描述文本,并允许您在选择要迁移的域后,通过单击即可迁移FROM任何其他webhost域from(NOTE:这个例子显示从测试/阶段/活动服务器到本地开发的DOWN但是可以肯定它可以迁移TO它恰好位于的任何域。这也意味着 该插件非常适合使用现有的实时站点并快速使本地开发环境正常工作! ):

enter image description here

如果不清楚“migration”在此上下文中意味着更新当前数据库中的所有引用以适合当前定义的webhost(并且“current”是嗅探)通过检查$_SERVER['SERVER_NAME']。)

这个插件有什么好处,它实现了一些基本的迁移,但 任何人都可以挂钩并执行自己的迁移 。例如,如果您添加一个库存插件,该库插件存储了数据库中图像的完整路径,您可以挂钩migrate_webhosts操作,该操作将通过“from”webhost和“to” webhost作为元数据数组,您将被允许使用SQL或任何适用的WordPress API函数执行数据库中您需要执行的任何操作来执行迁移。是的,我们任何人都可以在没有插件的情况下做到这一点,但是如果没有插件,我发现编写所需的所有代码都需要付出更多的努力。使用该插件,可以更轻松地编写这些小钩子并将其完成。

您可能还发现我的迁移失败在边缘情况下我没有测试过,也许你可以帮我改进插件?任何想要通过我的Gmail帐户给我发电子邮件的人(我的别名是“mikeschinkel。”)

此外,插件设计为接受用户定义的webhost元数据以及它识别的元数据,如databaseuserpasswordHostdomain等。一个完美的例子可能是googlemaps_apikey,您可以在其中存储每个域的不同API密钥您的Google地图插件需要正常运行(使用Google地图插件的用户中没有将应用部署到实时服务器而忘记将代码更改为正确的API密钥?来吧,说实话...... :)使用这个插件,register_webhost()数组中的googlemaps_apikey元素和一个小的自定义migrate_webhosts钩子可以有效地消除这个问题!

那是关于它的。我在WordPress的答案交换中启动了这个插件,因为@ Insanity5902的问题引发了它。如果合适,请告诉我这是否有用,如果没有,请通过电子邮件告诉我。

附:如果您决定使用此功能,请记住它是alpha/beta,这意味着它会发生变化,因此如果您想现在使用它,请准备好进行一些小手术,然后在被许多人殴打后使用已发布的版本。

P.P.S.我的目标是什么?我很高兴看到这个迁移到WordPress核心,以便每个人都可以访问它。但在此之前,甚至可以考虑很多人都有兴趣使用它来确保它实际上解决了更多的问题,然后它可能会产生。因此,如果你喜欢这个想法,那么一定要使用它,并帮助我获得动力,最终有希望包含在WordPress核心中。

121
MikeSchinkel

如果可能,我在WP_HOME中设置WP_SITEURLwp-config.php。这与数据库转储和导入相结合,是我熟悉的所有解决方案中最简单的。

http://codex.wordpress.org/Changing_The_Site_URL#Edit_wp-config.php

35
Annika Backstrom

我最喜欢的黑客;在/etc/hosts中添加一个设置,使生产域指向您的计算机上的开发框。要部署到生产,您可以同步所有文件并推送数据库。

这一战略的风险很明显;您可能会将开发环境与生产环境混淆。

它仍然很容易解决。

27
Wietse Venema

几个月前,当我迁移到WP时,我想要类似的东西,所以我写了一个非常简单的Shell脚本,它使用rsync和mysqldump而不是ssh:

http://snarfed.org/sync_wordpress

它不复杂或基于网络,但我很高兴。

9
ryan

WP引擎 是一项提供“一键分段”的新服务:

WPEngine有一个名为“staging”的独有功能。以下是它的工作原理:在对博客进行可怕的更改之前,请单击“快照”按钮。我们制作完整版的博客,并将其设置在一个单独的安全区域。你可以玩任何你想要的东西;什么都没有。只有当您准备好实现它时,才能触摸您的主站点。

看起来是一种非常简单的方法,可以快速从开发转移到生产,特别是对于已经存在的网站。

8
Travis Northcutt

Duplicator插件: 这是我一直在处理的插件。它目前处于测试阶段,但它可以为大多数网站完成工作。现在它的目标是更小的WordPress安装。 http://wordpress.org/extend/plugins/duplicator/

资源: 插件的其他资源可以在这里找到: http://lifeinthegrid.com/duplicator/

社区: 请告诉我们您可能遇到的成功或任何问题!为了更轻松地管理各种线程,请将问题发布到WordPress.org插件论坛。请不要将插件中的任何日志记录数据发布到在线论坛中。记录数据可以提交给我们的支持站点。

7
Cory

您可以查看iThemes的产品,名为 BackUpBuddy 。我只使用了两次,每次都有一两个故障,但总的来说看起来很有希望。

6
MikeK

这很有希望。我们正在研究一些脚本来处理迁移一些数据,例如wp-options,更改数据库中的路径,复制媒体。

我遇到的问题是,现场网站继续增长,而另一个正在开发中。我们工作的一个网站每天有20个帖子,每天有3,000多条评论。这是用phpmyadmin或命令行移动的太多数据。此外,由于某种原因,移动数据总是会导致UTF问题。

此外,现在看起来菜单选项存储在数据库中,我还有更多需要处理的问题。

我将所有代码检入SVN,并通过FTP从服务器(Beanstalk)部署代码。这不会对我进行DB更改或激活新插件。

我现在的计划是在开发时创建一个清单文件,以便对现场网站进行所有更改。

例如,该文件将具有人类可读的行

它将包括要激活的插件,要移动的wp选项,要移动的图像,要移动的页面。然后我的插件将检测清单文件并对暂存站点进行所有更改。

一旦我测试了它并且确定我得到了所有东西,我可以肯定它可以用于生产。

这个插件仍然只是一个想法,但我有一些代码为它编写。

此外,如果要仅更改数据库中的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$') ;
5
Andrew

我个人用Github上的项目来解决这个问题,名为 Autopress 。我还没有一个完美的解决方案,但我越来越近了,特别是wpengine人的wpstage插件。

5
Vid Luther

两个具有类似目标的Google Summer of Code项目:

4
Jan Fabry

截至2017年,我发现了两种最好的方法来处理WordPress数据库从开发到生产的转移。

WP迁移DB Pro/WP同步数据库

https://wordpress.org/plugins/wp-migrate-db/

这些WordPress插件允许您在WordPress安装之间推送,拉取和同步数据库表。这比查找/替换要好得多,原因很多,因为它:

  • 将数据库导出为MySQL数据转储(非常类似于phpMyAdmin)
  • 是否在URL和文件路径上查找和替换
  • 处理序列化数据
  • 允许您将其作为SQL文件保存到计算机中

我很喜欢为我的工作付钱,所以我建议你支持Brad Touesnard先生并购买真品的许可副本。 WP同步数据库是一个复制品,因此它总是支持。有了这个插件,这个过程很简单:

  1. 在localhost和生产环境中安装/激活插件
  2. 配置从本地主机/开发服务器到生产的推送传输
  3. 填写要传输的表的规则,并定义要执行的查找和替换规则
  4. 而已!

通过InterconnectIT对WordPress数据库进行数据库搜索和替换

https://interconnectit.com/products/search-and-replace-for-wordpress-databases/

此免费工具不是插件,而是安装在WordPress生产安装的根目录中。这不如WP Migrate DB Pro好,因为它需要一些手动步骤,但尽管如此,它仍然是一个很好的选择。使用此方法时,过程如下所示:

  1. 备份您的本地数据库,这是绝对必要的,因为我们很快就会重新导入它
  2. 将脚本添加到installs根目录中的文件夹
  3. 在数据库上运行查找和替换
  4. 导出数据库并将其保存到生产环境中
  5. 从步骤#1重新导入备份以恢复本地主机
  6. 连接到您的生产数据库并进行备份(在执行这些操作之前,您应始终如此)
  7. 导入我们在执行步骤#4中的查找/替换例程后进行的导出

您可以使用更快的方法,但它涉及生产站点的停机时间,我认为这是不可接受的。这就是为什么我们称之为生产,对吧?

3
Kevin Leary

虽然这里不乏优秀的解决方案,但本着共享的精神,我想我会将我的bash部署脚本添加到堆中: https://github.com/jplew/SyncDB

SyncDB是bash部署脚本,旨在使同步本地和远程版本的Wordpress站点失去理智。它允许在本地环境(例如MAMP)中工作的开发人员使用单个终端命令快速“推送”或“拉”到其生产服务器的更改。

这个脚本适用于Mark Jaquith的WP-Skeleton,并利用mysqldumpgitrsync来同步整个站点 - 数据库,代码和媒体 - 只需两个简单的步骤:

./syncdb
git Push hub master
3
JP Lew

我一直在使用 http://wordpress.org/plugins/wp-clone-by-wp-academy/ 。它工作得很好!

只需3个步骤:

  1. 在两个站点上安装插件。
  2. 使用该插件在旧站点上生成备份。
  3. 获取它为您提供的备份URL,并将其插入新网站的插件页面,点击,并在几秒钟内完成迁移!

它会自动调整所有URL - 包括序列化的字符串替换 - 因此不会丢失窗口小部件配置等的风险。

我遇到的唯一问题是一些网站具有更大的数据库(~300MB),这导致在导入站点备份期间PHP脚本执行超时。

3
jmotes

我使用Subversion的export命令来安装WordPress文件(http://core.svn.wordpress.org/tags//)以及存储库中的所有插件(http://plugins.svn.wordpress.org//tags //),然后只需压缩主题和自定义插件并正常安装它们。一旦所有这些都启动并运行没有内容,我导出测试数据库并搜索/替换URL和文件路径(存储为媒体)并导入到空数据库,然后只需在wp-config中切换数据库信息.PHP。一般花了我大约10 - 20分钟。

3
John P Bloch

通常我登录phpMyadmin上传数据库并编辑wp_options> siteurl和wp_options> home到预期域的内容。如果您需要更新帖子和页面内容中的URL,则可以在上载之前搜索/替换.SQL文件中的URL和媒体/上传路径。这是一个快速的工作。

3
Alex Costa

我一直在使用backupbuddy插件一段时间了。它允许您备份数据库和所有文件,将其下载为Zip或通过FTP直接发送到另一台服务器。它还会为您查找和替换URL。通常需要大约5分钟才能完成整个过程。因为所有文件都是压缩的,所以上传/下载过程要快得多。不,我不为他们工作,但这个插件确实使整个过程变得更加容易。

1
gdaniel

另一个付费解决方案:Xtreme One主题框架 发布版本1.2Xtreme Backup 允许您 “导出或导入您的Childthemes,Layouts或Widgets的设置,其所有设置/内容为XML文件。“

1
Jan Fabry

因为我在IIS中运行我的网站_(我也运行asp.net,所以我需要windows)我使用Msft的WebPI来安装新实例,然后我复制模板并使用导入/导出来转移数据。

它并不完美,但整个过程不到一个小时。

显然,拥有一键式解决方案会很好,但这是我发现对我来说最容易的。

1
Sruly

_ ramp _ 是来自Crowd Favorite的新内容部署插件,它看起来非常漂亮。不过,这是250美元,所以我还没试过。不过,可能只是在节省的时间内为自己付出代价,所以我正在考虑它。

它提到的大多数其他方法的最大好处是它可以智能地合并帖子,评论等。它不仅仅是导入mysqldump,它更像是数据库的源代码控制。例如,在部署帖子时,它还会为该帖子部署标签(如果它们尚未在生产中存在)。

1
Ian Dunn

一位同事发现了这一点。有趣的概念,虽然它不起作用跨服务器它看起来像。我还在探索它,但看起来它对于一个临时实例非常有用

http://code.google.com/p/deploymint/

1
Ryan Gibbons

当你问这个问题时,这可能不存在,但我已经使用了一个名为Blogvault的服务几个月了,而且它完美地做到了这一点。我可能已完成了50多次迁移(跨越域,子域和Web主机),这不是一件容易的事,并且根本没有时间。

这是一项付费服务​​(每个域/月),但不是那么多。

1
Larry

这是有史以来最简单的方法: https://themes.artbees.net/docs/website-migration/
只需点击两下。一个要导出,一个要导入。

通过使用All in one WP Migration插件可以实现。上面的链接显示了如何使用它。

1
Mohsenr1

另一个用于处理站点服务器迁移的有用工具是WordPress CLI,本文很好地概述了它可以做什么,但特别是“搜索和替换”部分对于查找旧/ dev站点URL的所有引用非常有用。 :

使用WP-CLI进行高级WordPress管理

1
Rick Curran

让我放弃一个我的最爱:-)

// proven local<->live codefork (covers local network testing, i.e. from mobile devices):
$GLOBALS['is_local'] =  
    in_array( $_SERVER['REMOTE_ADDR'], array("127.0.0.1","::1")) || // simple localhost (IPv4 IPv6)
              $_SERVER['HTTP_Host'] == 'local.workblog'          || // call by local name (adjust)
       substr($_SERVER["REMOTE_ADDR"],0,8) == '192.168.';           // (mobile) device in local network

$table_prefix  = NULL; // ensure scope

if ( $GLOBALS['is_local'] )  // LOCAL fork ------------------------
{
        ....
}
else  // STAGE/LIVE fork -------------------
{

......然后你从那里开始工作。 DB_NAME,DB_USER ... table_prefix。我个人在本地打开ALTERNATE_WP_CRON(以避免 一些令人讨厌的警告 ),两者上的WP_DEBUG(如果你不是开发人员)或仅限生活(如果你的话),另一个ini_set('display_errors', '0'); for live也可以好,蚂蚁最后,如上所述:WP_HOME和WP_SITEURL到相应的本地/实际网址。

几乎所有,没有什么能超越经典的WordPress '就是这样,停止编辑!' line ...

192.168。 part允许您在本地网络中进行一些本地测试(即从垫或电话)

$ GLOBALS ['is_local']也可以在你的主题开发中派上用场,对于一些额外的调试输出等...

1
Frank Nocke

在听完这个答案一段时间后,我创建了自己的小插件 - Pitta Migration 。原因是:

  1. 在这里尝试的所有想法中 - 最简单的是WP_HOMEWP_SITEURL选项
  2. 然后我使用这些来设置两个匹配的wp_options网址 - 这些网址涵盖了插件/主题忽略它们的时间
  3. 这使我对数据库中的更改信息100%有信心
  4. 这也适用于跨平台(所有这些bash脚本在Windows上都不能很好地运行)
  5. 很容易理解插件正在做什么
  6. 除了两个常量之外没有配置 - 对本地数据库执行mysqldump和mysql导入,插件看到常量和表不同并更新它们以匹配
  7. 没有文字搜索和替换
  8. 没有机会扼杀你的数据库 - 我使用WordPress数据库对象进行两次更新,仅此而已
  9. 它可以很好地用于 WordPress Skeleton 你可以拥有源代码控制中的所有内容并设置本地配置
  10. 我把它放在 WordPress插件目录Github 这样它是免费的,完全开源,易于你分叉和易于安装
  11. 一旦安装完毕你就可以忘掉它并且它应该“正常工作” - 它会让你注意到数据库已被修改
  12. 它应该适用于任何备份/ FTP /恢复过程
0
icc97

如果您尝试实现连续同步,我建议使用rsync和自定义cron作业来重写任何URL或特定于站点的数据。

0
user92899

在我看来,我遵循的最简单方法是手动传输..只需将wp-content文件夹和wp-config.php文件复制到新主机即可。从旧主机导出数据库并将其导入新主机的新数据库中。

在新的主机数据库中,转到wp-option表,然后将站点URL和博客URL更改为旧主机的新主机地址。喜欢从 http:// localhost/wphttp://example.com

现在在wp-config文件中,只需使用新的主机信息更改数据库和用户的信息。

现在登录到新的wp-admin并转到设置并保存永久链接。

你完成了。我认为这很简单,不使用任何插件。

我尝试了不同类型的插件,所有这些都有很多种问题。

所以我更喜欢这种简单的手动转移,我认为这更容易。

0
Md. Amanur Rahman