Như @ tom-j-nowell đã nói trong bình luận với OP, multisite có thể làm cho việc này dễ dàng hơn.
Hiệu suất và bảo mật không thực sự là vấn đề đối với multisite (ít nhất, không nhiều hơn so với cài đặt thông thường), nhưng tôi đồng ý rằng multisite đôi khi có thể là một vấn đề, bởi vì rất nhiều plugin (tùy chỉnh hoặc bên thứ 3) có thể không hoạt động đúng trên multisite hoặc có thể vì bạn muốn giữ cho người dùng của các trang web khác nhau tách biệt hoàn toàn.
Điều đó nói rằng những gì bạn muốn đạt được không khó.
Những gì bạn cần thay đổi giữa các cài đặt là:
- thư mục bổ trợ
- thư mục chủ đề
- cài đặt cơ sở dữ liệu
Những cấu hình đó có thể được thực hiện bằng cách sử dụng các hằng số trongwp-config.php
vấn đề duy nhất của bạn là làm thế nào để chuyển đổi chúng dựa trên URL.
Biến máy chủ 'SERVER_NAME'
sẽ hoạt động cho bạn, ít nhất là nếu máy chủ web của bạn được cấu hình đúng.
Ví dụ: bạn có thể tạo một thư mục có tên /conf
cùng cấp wp-config.php
tệp và /WordPress
thư mục.
Trong thư mục đó, bạn có thể thêm một số tệp:
branch1.domain.com.conf
branch2.domain.com.conf
branch3.domain.com.conf
bên trong mỗi người bạn có thể làm một cái gì đó như
$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 );
Điều này sẽ thay đổi trên mỗi tệp cấu hình theo "nhánh".
Sau đó, trong sự độc đáo của wp-config.php
bạn, bạn có thể có một cái gì đó như:
$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);
Điều xảy ra ở trên là dựa trên tên máy chủ mà bạn tải một tệp cấu hình khác (nếu tìm thấy) và nếu tệp cấu hình không xác định bất kỳ cấu hình mặc định nào (hoặc nếu không tìm thấy tệp) thì cấu hình được đặt theo mặc định.
Điều thú vị là để thêm một nhánh mới, bạn chỉ cần tạo thư mục nhánh và cung cấp một .conf
tên theo tên miền nhánh mới, và bạn đã hoàn thành, không có gì phải thay đổi ở phía WP.
Dòng:
$host = getenv('WORDPRESS_HOST') ?: $_SERVER['SERVER_NAME'];
là nơi tôi có được tên miền. Như tùy chọn đầu tiên tôi đang sử dụng biến môi trường, vì có thể $_SERVER['SERVER_NAME']
sẽ không hoạt động trên ngữ cảnh dòng lệnh, như chúng tôi khi sử dụng WP CLI. Trong những tình huống đó, bạn có thể đặt biến môi trường để buộc WP sử dụng cài đặt từ một nhánh cụ thể.
Lưu ý rằng trong các tệp cấu hình dành riêng cho chi nhánh, tôi sẽ thay đổi WP_CONTENT_DIR
và sẽ tự động đặt các thư mục bổ trợ và chủ đề cho các thư mục con liên quan /plugins
và /themes
chi nhánh.
Một vấn đề có thể xảy ra ở đây là nếu bạn muốn chia sẻ /uploads
thư mục (nơi các tệp được tải lên).
Theo mặc định, thư mục đó là thư mục con của thư mục nội dung, vì vậy sử dụng dòng công việc ở trên nó sẽ là /uploads
thư mục con của mỗi thư mục gốc chi nhánh.
Nếu đó không phải là vấn đề với bạn, hơn là chỉ đi với nó, nếu không, giải pháp đơn giản nhất là tạo cho /uploads
mỗi thư mục nhánh một liên kết tượng trưng đến thư mục tải lên thực mà bạn muốn chia sẻ.