問題描述

我看到一些看起來很相似的問題,但他們都是以 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。