问题描述

我看到一些看起来很相似的问题,但他们都是以 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 实例。现在,主题,插件和数据库变得更小,独立。那么,维护,规模更容易

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

最佳解决方案

正如 @tom-j-nowell 在对 OP 的评论中所说的,多站点可以使这更容易。

性能和安全性对于多个站点来说并不是一个问题 (至少不是常规安装的问题),但是我同意多站点有时可能是一个问题,因为很多插件 (自定义或第三方) 可能不会在多站点上正常工作,或者是因为要让不同网站的用户完全分离。

那就是说你想要实现的不是那么难。

您需要在安装之间进行更改:

  • plugins 文件夹

  • 主题文件夹

  • 数据库设置

那些配置可以用 wp-config.php 中的常量来完成,你唯一的问题是如何根据 URL 进行切换。

服务器变量'SERVER_NAME'应该适合您,至少如果您的 Web 服务器配置正确。

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

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

  • 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 );

这将根据”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 使用特定分支的设置。

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

这里有一个可能的问题是如果你想共享/uploads 文件夹 (文件上传的地方) 。

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

如果这不是一个问题,而不是只是去与它,否则最简单的解决方案是将/uploads 在每个分支文件夹中的一个符号链接到要共享的真正的 uploads 文件夹。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。