如何:轻松地将WordPress安装从开发阶段转移到生产阶段?

时间:2010-08-11 作者:Ryan Gibbons

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

有更好的方法吗?

27 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

@Insanity5902: 从我开始使用WordPress的第一天起,将WordPress网站从一个盒子部署到另一个盒子就成了一个难题。(说实话,在我开始使用WordPress之前,这是Drupal两年来的一个PITA,所以问题肯定不完全是WordPress的。)

每次我需要移动一个站点时,我都要花费大量的重复工作,这让我很不安,因为这使我无法像我希望的那样频繁地部署测试。所以大约4-6个月前,我开始开发一个插件来解决webhost迁移问题I mentioned my ideas on the WP Tavern forum.

很快就到了今天,我基本上已经让它工作了,我很方便地称之为“WP Migrate Webhosts.“尽管这个插件仍然是beta版(可能甚至是alpha版),考虑到你的问题,我想我已经准备好让人们开始使用它了。

设想的用例是:

  1. 首先,开发人员通过FTP处理上传所有更改的主题和插件文件,
  2. 然后将整个开发MySQL数据库上传到测试服务器,最后
  3. 然后运行插件,将任何引用从先前的域迁移到新域。(我的插件没有试图解决新数据库字段或表与实时数据的合并问题;这是一个更大的问题,我不知道如何解决。)
您可以download the plugin 从我的网站,解压缩到你的插件目录(如果你不知道怎么做,那么这个插件不适合你,因为它需要知道他们在做什么的人来使用。)我会一直保持这个插件在线,直到我把它发布到WordPress。org之后,你应该在那里寻找它。

要使用它,您需要在wp-config.php 通过注释掉四(4)个定义,这是正常的DB_NAME, DB_USER, DB_PASSWORDDB_HOST 而是注册网络主机的默认设置,然后注册每个网络主机本身的信息。下面是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\');
希望这(大部分)是不言自明的。我试图使代码尽可能干净,但不幸的是,它需要这两个神秘的require_once() 因为之前我没有办法“钩住”
“WordPress”,所以在阻止webhost注册码之前和之后都有行wp-config.php 被称为。

一旦您更新了wp-config.php 然后你可以简单地使用URL快捷方式wp-migrate-webhosts 如需转到管理屏幕:

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

以上内容将带您进入如下的管理屏幕,其中包含大量描述文本,允许您在选择要迁移的域后,只需单击一下,即可从任何其他webhost域迁移(注意:此示例显示了从测试/阶段/实时服务器到本地开发的下降,但请放心,它可以迁移到它所在的任何域。这也意味着the plugin will be great for taking an existing live site and quickly getting a local development environment working!):

enter image description here

如果不清楚,此上下文中的“迁移”意味着更新当前数据库中的所有引用,以适合当前定义的Web主机(并且通过检查$_SERVER[\'SERVER_NAME\'].)

该插件的酷之处在于它实现了一些基本的迁移,但是anyone can hook it and perform their own migrations. 例如,如果您添加了一个库插件,该插件在数据库中存储了图像的完整路径,那么您可以钩住migrate_webhosts 操作将以元数据数组的形式从“Web主机”和传递到“Web主机”,您可以使用SQL或任何适用的WordPress API函数在数据库中执行任何需要执行的操作,以执行迁移。是的,我们中的任何人都可以在没有插件的情况下做到这一点,但如果没有插件,我发现编写所有需要的代码需要付出的努力远远超过了它的价值。有了这个插件,编写这些小钩子并完成它就更容易了。

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

此外,该插件设计用于接受用户定义的webhost元数据,以及它可以识别的元数据database, user, password, host, domain 等等。一个完美的例子可能是googlemaps_apikey 您可以在何处为每个域存储不同的API密钥,您的Google地图插件需要正确操作(您中有谁使用过Google地图插件,但没有将应用程序部署到实时服务器,忘记将代码更改为正确的API密钥?来吧,老实说……)使用此插件googlemaps_apikey register\\u webhost()数组中的元素和一个小自定义migrate_webhosts 你可以有效地消除这种顾虑!

就这样。我在WordPress Answer的Exchange上启动了这个插件,因为@Inasnity5902的问题触发了它。让我知道它是否有用,如果合适,请在这里或通过电子邮件。

P、 如果你真的决定使用它,请记住它是α/β,这意味着它会发生变化,所以如果你现在想使用它,就要为一些小手术做好准备,一旦它被许多人击败,就要使用发布的版本。

P、 附:我的目标是什么?我很想看到它迁移到WordPress核心,这样每个人都可以访问它。但在此之前,很多人都对使用它感兴趣,以确保它实际上解决了比它可能产生的更多问题。因此,如果你喜欢这个想法,那么请尽一切努力使用它,并帮助我获得动力,最终有希望纳入WordPress核心。

SO网友:Annika Backstrom

如果可能的话,我会WP_HOMEWP_SITEURL 在里面wp-config.php. 这与数据库转储和导入相结合,是我熟悉的所有解决方案中最简单的。

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

SO网友:Wietse Venema

我最喜欢的黑客;将设置添加到/etc/hosts 让生产域指向你的开发框,就在你的机器上。要部署到生产环境中,您需要同步所有文件并将数据库推送到生产环境中。

这一战略的风险显而易见;您可能会混淆开发环境和生产环境。

不过,这仍然是一个很容易解决的问题。

SO网友:ryan

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

http://snarfed.org/sync_wordpress

它既不复杂也不基于网络,但我很满意。

SO网友:Travis Northcutt

WP Engine 是一项提供“一键登台”的新服务:

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

看起来这是一种从开发到生产的非常简单的方法,尤其是对于已经上线的站点。

SO网友:Cory

Duplicator Plugin:这是我一直在开发的一个插件。它目前处于测试阶段,但大多数网站都能完成这项工作。目前,它的目标是较小的WordPress安装。http://wordpress.org/extend/plugins/duplicator/

Resources:该插件的其他资源可在此处找到:http://lifeinthegrid.com/duplicator/

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

SO网友:MikeK

你可以看看伊塞姆斯的一款产品,叫做BackUpBuddy. 我只使用过两次,每次都有一两个问题,但总的来说,它看起来很有希望。

SO网友:Vid Luther

我个人正在Github上的项目中解决这个问题,名为Autopress. 我还没有一个完美的解决方案,但我离它越来越近了,尤其是使用wpengine人员提供的wpstage插件。

SO网友:Kevin Leary

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

WP Migrate DB Pro/WP Sync DB

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

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

  • 将您的数据库导出为MySQL数据转储(很像phpMyAdmin)
  • 对URL和文件路径进行查找和替换
  • 处理序列化数据
  • 允许您将其作为SQL文件保存到您的计算机
我很喜欢为我所做的工作付费,因此我建议您支持Brad Touesnard先生,并购买真实数据的许可证副本。WP Sync DB是一个复制,因此它在支持方面总是落后。使用此插件,过程非常简单:

在本地主机和生产环境上安装/激活插件,配置从本地主机/开发服务器到生产服务器的推送传输,填写要传输的表的规则,并定义要执行的查找和替换规则,就是这样

数据库搜索&;用Interconnect替换WordPress数据库

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

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

备份本地数据库,这是绝对必要的,因为我们将很快重新导入它,将脚本添加到安装根目录中的文件夹中,在数据库上运行查找和替换,导出数据库并将其保存到生产环境中(在执行这些操作之前,您应该始终这样做)

  • 导入我们在从步骤4运行查找/替换例程后进行的导出
    1. 您可以使用更快的方法,但这会导致生产站点停机,我认为这是不可接受的。这就是为什么我们称之为生产,对吗?

    SO网友:Andrew

    这看起来很有希望。我们正在开发一些脚本来处理一些数据的迁移,例如wp选项,更改数据库中的路径,通过媒体进行复制。

    我遇到的问题是,当另一个正在开发时,live站点仍在继续增长。我们工作的一个网站每天有20条帖子,每天有3000多条评论。这是太多的数据,无法使用phpmyadmin或通过命令行移动。此外,由于某些原因,移动数据总是会导致UTF问题。

    而且,现在看起来菜单选项存储在数据库中,我还有更多的事情要处理。

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

    我现在的计划是在开发过程中创建一个清单文件,以便对live站点进行所有更改。

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

    它将包括要激活的插件、要移动的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$\') ;
    

    SO网友:Jan Fabry

    两个谷歌代码夏令营项目有着相似的目标:

    SO网友:Alex Costa

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

    SO网友:John P Bloch

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

    SO网友:jmotes

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

    只需3个步骤:

    1. 在两个站点上安装插件
    2. 使用插件在旧站点上生成备份
    它会自动调整所有URL,包括序列化字符串替换,因此不会丢失小部件配置等风险。

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

    SO网友:JP Lew

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

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

    该脚本与Mark Jaquith的WP骨架和线束配合得很好mysqldump, gitrsync 要通过两个简单的步骤同步整个站点数据库、代码和媒体,请执行以下操作:

    ./syncdb
    git push hub master
    

    SO网友:Mohsen Rabieai

    这是有史以来最简单的方法:https://themes.artbees.net/docs/website-migration/<只需单击两下即可。一个出口,一个进口。

    这可以通过使用一体式WP迁移插件实现。上面的链接显示了如何使用它。

    SO网友:Rick Curran

    处理站点服务器迁移的另一个有用工具是WordPress CLI,本文对它的功能有很好的概述,但特别是“搜索和替换”一节对于查找对旧/开发站点url的所有引用非常有用:

    Advanced WordPress Management With WP-CLI

    SO网友:Sruly

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

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

    显然,有一个一键解决方案会很好,但这是我发现对我来说最简单的。

    SO网友:gdaniel

    我已经使用backupbuddy插件一段时间了。它允许您备份数据库和所有文件,将其作为zip下载或通过FTP直接发送到另一台服务器。它还可以为您查找和替换URL。我通常需要5分钟来完成整个过程。由于所有文件都经过压缩,因此上传/下载过程要快得多。不,我不为他们工作,但这个插件真的让整个过程变得容易多了。

    SO网友:Frank Nocke

    让我给大家一个我最喜欢的:——)

    // 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 -------------------
    {
    
    。。。然后你从那里开始工作。数据库名称,数据库用户。。。table\\u前缀。就我个人而言,我在本地打开ALTERNATE\\u WP\\u CRON(以避免some annoying warnings), WP_调试(如果您不是开发人员)或仅在live上(如果您是),另一个ini_set(\'display_errors\', \'0\'); 对于live,ant也可以做得很好,最后,如上所述:WP\\u HOME和WP\\u SITEURL到各自的本地/实际url。

    基本上,除了经典的WordPress,什么都没有了\'That\'s all, stop editing!\' 线

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

    $GLOBALS[\'is\\u local\']也可以在主题开发中派上用场,用于一些额外的调试输出,等等。。。

    SO网友:Ian Dunn

    RAMP 是来自Crowd Favorite的一个新的内容部署插件,看起来非常流畅。不过250美元,所以我还没有试过。不过,这可能只是为了节省时间,所以我正在考虑。

    与前面提到的大多数其他方法相比,它的最大好处是可以智能地合并帖子、评论等。它不仅仅导入mysqldump,更像是数据库的源代码管理。例如,在部署一篇文章时,如果该文章的标签在生产中还不存在,它还将部署该文章的标签。

    SO网友:Larry

    当你问这个问题时,这可能并不存在,但我已经使用了一个名为Blogvault的服务几个月了,它做到了完美无瑕。我可能已经完成了50多次迁移(跨域、子域和web主机),这一点都不费时。

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

    SO网友:Ryan Gibbons

    一个同事发现了这个。这是一个有趣的概念,虽然它看起来不像是跨服务器的。我仍在探索它,但看起来它可以很好地用于登台实例

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

    SO网友:Jan Fabry

    另一个付费解决方案:Xtreme One主题框架released version 1.2 具有Xtreme Backup 它允许您将子主题、布局或小部件的设置及其所有设置/内容导出或导入为XML文件

    SO网友:icc97

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

    在这里尝试的所有想法中,最简单的是WP_HOMEWP_SITEURL 选项,然后使用这些选项设置两个匹配项wp_options URL-当插件/主题忽略这些内容时,它会覆盖这些内容这让我对数据库中正在发生的更改有100%的信心这也可以跨平台工作(所有那些bash脚本在Windows上都不能很好地运行)

  • 很容易理解插件在做什么除了这两个常量之外没有配置-执行mysqldump和mysql导入到本地数据库和插件发现常量和表不同,并更新它们以匹配,没有文本搜索和替换,没有机会破坏数据库-我使用WordPress数据库对象进行两次更新,仅此而已WordPress Skeleton 在这里,您可以将所有内容都放在源代码管理中,并设置本地配置WordPress plugins directory 和上Github 因此,它是免费的、完全开源的、易于分叉和安装的,一旦安装,您就可以忘记它,它应该“正常工作”——它给您一个小小的提示,告诉您数据库已经修改了,它应该可以与任何备份/FTP/还原过程一起工作

  • SO网友:user92899

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

    SO网友:Md. Amanur Rahman

    在我看来,我遵循的最简单的方法是手动转移。。只需复制wp内容文件夹和wp配置。将php文件发送到新主机。从旧主机导出数据库,并将其导入新主机的新数据库中。。

    在新主机数据库中,转到wp选项表,将站点URL和博客URL从旧主机更改为新主机地址。比如http://localhost/wphttp://example.com

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

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

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

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

    所以我更喜欢这种简单的手动传输,我认为它更容易。

    结束

    相关推荐