在WordPress多站点中切换主站点

时间:2016-07-12 作者:jamie

我们正在WordPress多站点环境中运行多个子域站点,希望将主站点从根站点切换到子域,如下所示:

当前站点为example.com 具有ID 1 (无法重命名,因为字段已设置且不可编辑)

新站点为new.example.com 具有ID 15 (尝试重命名为example.com)

我按照一些指示进行切换,包括重命名站点和更新wp-config.php 文件为SITE_ID_CURRENT_SITEBlog_ID_CURRENT_SITE. 结果是主站点没有改变,管理员搞砸了。

是否有一种直接的方法可以在不导入帖子/页面和插件的情况下将主站点切换出来,并用子域站点内容替换它?

更新:

感谢您提供这些提示。根据我在数据库中看到的内容,阅读并从您那里得到的结论是,替换主站点的新子域站点需要具有基表名称和ID 1,更新的路径等。我唯一担心的是,在切换这些路径后,网络管理员将出现问题——因此我基本上需要将基表(wp\\u选项等)与等效表(wp\\u x\\u选项等)进行比较,以查看这些基表中是否有与网络管理员相关的唯一内容。

2 个回复
SO网友:David

四岁没人回答?我们开始吧…-

让我们以以下网络设置为例(我使用的是WP-CLIsite list command):

$ wp site list
+---------+--------------------+---------------------+---------------------+
| blog_id | url                | last_updated        | registered          |
+---------+--------------------+---------------------+---------------------+
| 1       | http://wp.tmp/     | 2016-08-04 08:39:35 | 2016-07-22 09:25:42 |
| 2       | http://foo.wp.tmp/ | 2016-07-22 09:28:16 | 2016-07-22 09:28:16 |
+---------+--------------------+---------------------+---------------------+
网络站点列表如下所示:

network site list

我们要使用ID为的站点2 作为URL为的新根站点http://wp.tmp/. 这实际上与问题中描述的问题相同,只是ID和URL的一些其他值。

的多站点相关部分wp-config.php 可能是这样的:

const MULTISITE            = TRUE;
const DOMAIN_CURRENT_SITE  = \'wp.tmp\';
const PATH_CURRENT_SITE    = \'/\';
const SITE_ID_CURRENT_SITE = 1;
const BLOG_ID_CURRENT_SITE = 1;
const SUBDOMAIN_INSTALL    = TRUE;
更新数据库站点设置WordPress使用这些表wp_*_optionwp_blogs 为给定的请求URL查找匹配的日志,并为此日志构建适当的永久链接。因此,我们必须更改以下三个表中的值(对于本例):

英寸wp_options 钥匙homesiteurl

  • 英寸wp_2_options 钥匙homesiteurl (在您的情况下wp_15_options)
  • 英寸wp_blogs “列”domain 对于ID为的两个站点12 (分别为15)
  • 我使用Adminer来完成这项工作,但任何其他数据库管理工具(PhpMyAdmin)也可以完成这项工作。(截图显示了德语的GUI,但我想想法很清楚。)

    adminer edit wp_options

    在里面wp_options (站点ID的选项表1) 我更改了两个键的值homesiteurl 从…起http://wp.tmphttp://foo.wp.tmp. (上面的屏幕截图显示了更新前的状态。)

    我对桌子也做了同样的事wp_2_options 但这里我改变了http://foo.wp.tmphttp://wp.tmp.

    下一步是更新表wp_blogs:

    adminer edit wp_blogs(同样,屏幕截图显示了我进行任何更改之前的表格。)在这里,您只需在domain 列:

    • wp.tmp 成为foo.wp.tmpfoo.wp.tmp 成为wp.tmp
    现在您必须更新wp-config.php 要正确处理新设置数据,请执行以下操作:

    const MULTISITE            = TRUE;
    const DOMAIN_CURRENT_SITE  = \'wp.tmp\';
    const PATH_CURRENT_SITE    = \'/\';
    const SITE_ID_CURRENT_SITE = 1;
    const BLOG_ID_CURRENT_SITE = 2; // This is the new root site ID
    const SUBDOMAIN_INSTALL    = TRUE;
    
    此时,您又有了一个工作的WordPress多站点,但有一个新的根站点:

    $ wp site list
    +---------+--------------------+---------------------+---------------------+
    | blog_id | url                | last_updated        | registered          |
    +---------+--------------------+---------------------+---------------------+
    | 1       | http://foo.wp.tmp/ | 2016-08-04 08:39:35 | 2016-07-22 09:25:42 |
    | 2       | http://wp.tmp/     | 2016-07-22 09:28:16 | 2016-07-22 09:28:16 |
    +---------+--------------------+---------------------+---------------------+
    

    network site list updated

    请记住:在此过程中,您的站点将不可用,请求将以一些严重错误告终,因此您可能需要安排503 Service Unavailable 在WordPress安装之前进行响应。这是可以做到的using .htaccess.

    更新数据库内容现在是棘手的部分。目前,内容表中的所有URL仍然指向旧站点的资源。但更换它们并不是那么容易:更换每个http://foo.wp.tmp 具有http://wp.tmp 在第一步中http://wp.tmp 具有http://foo.wp.tmp 在下一步中,将最终使所有以前的URL指向站点ID 1(http://foo.wp.tmp).

    最好的方法是插入一个中间步骤:

    搜索http://foo.wp.tmp 并将其替换为一种最好是独特的弹头:http://3a4b522a.wp.tmp

  • 搜索http://wp.tmp 并将其替换为http://foo.wp.tmp
  • 搜索http://3a4b522a.wp.tmp 并将其替换为http://wp.tmp
  • 所有这些搜索和替换命令都应忽略这三个表(*_options *_blogs) 我们以前更新过,否则他们会破坏配置。您还可以在中手动查找URLwp_*_options 表外部homesiteurl 钥匙。

    我建议使用WP-CLIsearch-replace command 因为它可以处理序列化数据,并且没有HTTP可能具有的限制。

    SO网友:SuperAtic

    一个更简单的选择(不涉及任何代码行)是使用all-in-one-migration 插件:

    导出new.example.com 具有ID 15并将其重新导入example.com 具有ID 1