将WP多站点结构从子域更改为子目录

2020-02-27

如果您曾经安装过WordPress Multisite,则知道它首先要您做的是“ 请选择您是否希望WordPress网络的站点使用子域或子目录。您以后将无法更改此设置。” 从现在开始,您将需要遵循不同的步骤,具体取决于您的选择,并且不能逆转。但是生活经历了许多转折,您可能会发现自己需要沿途更改模型,这是WordPress本身不允许的。该怎么办?

结论是:您可以将WordPress多站点从子域更改为子文件夹,反之亦然。但这需要一些微妙的动作,因此,强烈建议您备份数据库,wp-config.php.htaccess文件,以防出现任何问题。警告:切勿在生产中这样做

将WordPress多站点从子域更改为子文件夹

也就是说,从http://site1.mydomain.com/转到http://mydomain.com/site1/

步骤1

在我们的wp-config.php配置文件中,查找以下行:

define( 'SUBDOMAIN_INSTALL', true );

并替换为以下内容:

define( 'SUBDOMAIN_INSTALL', false );

保存更改。

第2步

转到.htaccess文件,然后查找#BEGIN WordPress#END WordPress之间的规则。您将拥有:

# BEGIN WordPress

RewriteEngine On

RewriteBase /

RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin

RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]

RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^ - [L]

RewriteRule ^(wp-(content|admin|includes).*) $1 [L]

RewriteRule ^(.*\.php)$ $1 [L]

RewriteRule . index.php [L]

# END WordPress

and we will replace it with:

# BEGIN WordPress

RewriteEngine On

RewriteBase /

RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin

RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]

RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^ - [L]

RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]

RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]

RewriteRule . index.php [L]

# END WordPress

保留更改。

第三步

访问数据库并查找表wp_blogs,您将发现类似以下内容:

WordPress多站点-wp_blogs表

由于我们打算移至子文件夹,因此必须在表wp_blogs的domain字段中手动设置主站点为多站点的所有站点。在路径字段中,我们将输入曾经是我们的子域的名称。该表如下所示:

WP多站点结构更改-wp_blogs表更改
WordPress多站点-wp_blogs表检查

如果您只有几个站点,则可以轻松地手动完成此任务。但是,如果您有成百上千个站点,则可能需要编写一个小的脚本来自动执行此任务。

步骤4

如您所知,WordPress会存储您的所有链接,因此有必要替换我们所有网站的所有URL。为此,您需要使用WP-CLI或“ 搜索和替换”脚本。但是,请勿手动执行此操作或直接对数据库进行更新,因为可能会丢失序列化的信息。

第五步

检查一切是否正常。

将WordPress多站点从子文件夹更改为子域

如果您要将子文件夹的多站点传递到子域,则过程完全相同,但是相反:

  1. 有关数据库以及wp-config.php和.htaccess文件的安全性副本
  2. 在wp-config.php 中将> SUBDOMAIN_INSTALL设置为true
  3. 通过子域更改htaccess中的规则(此处有更多信息)
  4. 在所有站点中更改wp_blogs表的domain列,建立每个站点的子域。只需将路径栏留在/
  5. 通过搜索和替换WP-CLI脚本,将所有类型为mydomain.com/site1的 URL替换为site1.mydomain.com
  6. 检查一切是否正常。

--- END ---


( ! ) Warning: realpath(): open_basedir restriction in effect. File(/www/server/panel/tmp) is not within the allowed path(s): (/www/wwwroot/www.hqtweb.com/:/tmp/) in /www/wwwroot/www.hqtweb.com/wp-includes/functions.php on line 2124
Call Stack
#TimeMemoryFunctionLocation
10.553735507680shutdown_action_hook( ).../load.php:0
20.553735507680do_action( $hook_name = 'shutdown' ).../load.php:1260
30.553735508056WP_Hook->do_action( $args = [0 => ''] ).../plugin.php:517
40.553735508056WP_Hook->apply_filters( $value = '', $args = [0 => ''] ).../class-wp-hook.php:348
50.554135468648wpcf7_cleanup_captcha_files( ).../class-wp-hook.php:322
60.554135468648wpcf7_init_captcha( ).../really-simple-captcha.php:555
70.554135468936ReallySimpleCaptcha->__construct( ).../really-simple-captcha.php:396
80.554235469952path_join( $base = '/www/wwwroot/www.hqtweb.com/wp-content/plugins/really-simple-captcha', $path = 'tmp' ).../really-simple-captcha.php:46
90.554235469952path_is_absolute( $path = 'tmp' ).../functions.php:2154
100.554235469952realpath( $path = 'tmp' ).../functions.php:2124