我们可以将一个WordPress安装用于多个数据库、域和内容目录吗

时间:2016-06-13 作者:dan9vu

我看到一些问题看起来很相似,但最终都是multisite. 为了维护性、性能和安全性,我不想使用多站点。所以请容忍我。

这就是我所想的:

.
|_____branch1 // for branch1.domain.com
|  |_____themes
|  |_____plugins
|
|_____branch2 // for branch2.domain.com
|  |_____themes
|  |_____plugins
|
|_____branch3 // for branch3.domain.com
|  |_____themes
|  |_____plugins
|
|_____index.php
|_____WordPress
|_____wp-config.php
如您所见,每个域都有自己的数据库和内容目录,但只有一个WordPress实例。现在,主题、插件和数据库变得更小和独立。然后,它将更容易维护、扩展。。。

但这有可能吗?如果您以前遇到过同样的问题,请分享您的想法!我真的很感谢你的帮助。

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

@tom-j-nowell 在对OP的评论中说,多站点可以让这变得更容易。

性能和安全性对多站点来说并不是一个真正的问题(至少,不比常规安装更严重),但我同意多站点有时可能是一个问题,因为许多插件(无论是自定义插件还是第三方插件)可能无法在多站点上正常工作,或者可能是因为您想让不同网站的用户完全分开。

也就是说,你想要实现的目标并不难。

在安装之间需要更改的是:

这些配置可以使用constants in wp-config.php 您唯一的问题是如何根据URL切换它们。

服务器变量\'SERVER_NAME\' 至少在您的Web服务器配置正确的情况下,它应该适合您。

例如,您可以创建一个名为/conf 在同一级别wp-config.php 文件和/WordPress 文件夹

在该文件夹中,您可以添加一些文件:

  • branch1.domain.com.conf
  • branch2.domain.com.conf
  • branch3.domain.com.conf
在每一个内部,您可以执行以下操作

$branch = \'branch1\';
$base_dir = dirname( __DIR__) . "/{$branch}";

defined( \'WP_CONTENT_DIR\' ) or define( \'WP_CONTENT_DIR\', $base_dir );

// be sure WP understand URLs correctly
defined( \'DB_HOME\' ) or define( \'DB_HOME\', "{$branch}.example.com" );
defined(\'WP_SITEURL\') or define(\'WP_SITEURL\', "{$branch}.example.com/WordPress");

// adjust DB settings  as needed
defined( \'DB_NAME\' ) or define( \'DB_NAME\', $branch );
defined( \'DB_USER\' ) or define( \'DB_USER\', $branch );
defined( \'DB_PASSWORD\' ) or define( \'DB_PASSWORD\', \'********\' );

unset( $base_dir, $branch );
这将根据“分支”在每个配置文件上更改。

之后,在你独特的wp-config.php 您可以这样做:

$defaults_conf = [
  \'WP_CONTENT_DIR\' => __DIR__ . \'/branch1\',
  \'DB_HOST\'        => \'localhost\',
  \'DB_NAME\'        => \'branch1\',
  \'DB_USER\'        => \'branch1\',
  \'DB_PASSWORD\'    => \'********\',
];

$host = getenv(\'WORDPRESS_HOST\') ?: $_SERVER[\'SERVER_NAME\'];

if ($host && file_exists(__DIR__."/conf/{$host}.conf")) {
  require __DIR__."/conf/{$host}.conf";
}

array_walk($defaults_conf, function($value, $name) {
   defined($name) or define($name, $value);
});

unset($defaults_conf, $host);
上面发生的情况是,根据服务器名称加载不同的配置文件(如果找到),并且如果配置文件未定义任何默认配置(或者如果未找到文件),则根据默认设置配置。

很好的一点是,要添加新分支,只需创建分支文件夹并提供.conf 以新的分支域命名,您已经完成了,在WP方面没有什么可以更改的。

线路:

 $host = getenv(\'WORDPRESS_HOST\') ?: $_SERVER[\'SERVER_NAME\'];
就是我得到域名的地方。作为第一个选择,我使用一个环境变量,因为有机会$_SERVER[\'SERVER_NAME\'] 在命令行上下文中不起作用,例如在使用WP CLI时。在这些情况下,您可以设置环境变量以强制WP使用特定分支的设置。

注意,在分支特定的配置文件中,我正在更改WP_CONTENT_DIR 这将自动将插件和主题文件夹设置为相关/plugins/themes 分支子文件夹。

这里可能存在的一个问题是,如果您想共享/uploads 文件夹(上载文件的位置)。

默认情况下,该文件夹是content dir的子文件夹,因此使用上面的工作流将是/uploads 每个分支根文件夹的子文件夹。

如果这对你来说不是一个问题,那就去做吧,否则最简单的解决办法就是/uploads 在每个分支文件夹中,都有一个指向要共享的real uploads文件夹的符号链接。

SO网友:Cpyder

这可以通过符号链接和一些计划来实现。为了同样的事情,我在网上做了一些搜索。最后,把所有的东西放在一起,让它发挥作用。

我一直在运行一些网站,它们都共享相同的主题和插件文件夹。相同的文件夹适用于多站点和单站点。但您必须小心某些插件,这些插件只能是多/单站点的,而且很奇怪。

我制作了一个目录,像master tnp/themes和master tnp/plugins。然后使用ln-s命令符号链接到wordpress目录。

服务器配置中也存在陷阱。确保follow symlinks指令设置为允许。

如果您想使用单个WordPress安装,我已经整理了一份详细的指南,介绍了我在https://vaish.co/multiple-sites-single-wordpress-directory