web-dev-qa-db-ja.com

1つのWordPressを複数のデータベース、ドメイン、そしてコンテンツディレクトリにインストールできますか

私は似たような質問をいくつか見ましたが、それらはすべて マルチサイト で終わりました。保守性、パフォーマンス、およびセキュリティの観点から、マルチサイトは使用したくありません。だから私と一緒に耐えてください。

これが私が考えていることです:

.
|_____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インスタンスは1つだけです。現在、テーマ、プラグイン、そしてデータベースはより小さくそして独立しています。それから、それは維持するのがはるかに簡単になるでしょう、スケール...

しかし、それは可能ですか?あなたが以前に同じ問題を経験したことがあるならば、あなたの考えを共有してください!本当にありがとうございます。

9
MinhTri

@ tom-j-nowell がOPのコメントで述べたように、マルチサイトはこれを簡単にすることができます。

パフォーマンスとセキュリティは実際にはマルチサイトの問題ではありません(少なくとも、通常のインストールの場合以上ではありません)が、多くのプラグイン(カスタムまたはサードパーティ)がそうでない場合があるため、マルチサイトが時々問題になる可能性があることに同意しますマルチサイトで適切に動作するか、異なるウェブサイトのユーザーを完全に分離したい場合があります。

つまり、達成したいことはそれほど難しくありません。

インストール間で変更する必要があるのは次のとおりです。

  • プラグインフォルダー
  • テーマフォルダ
  • データベース設定

これらの設定は 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'];

ドメイン名を取得する場所です。最初のオプションとして、WP CLIを使用する場合など、コマンドラインコンテキストで$_SERVER['SERVER_NAME']が機能しない可能性があるため、環境変数を使用しています。そのような状況では、WPが特定のブランチの設定を使用するように環境変数を設定できます。

ブランチ固有の設定ファイルでは、WP_CONTENT_DIRを変更しており、プラグインおよびテーマフォルダーを関連する/pluginsおよび/themesブランチサブフォルダーに自動的に設定することに注意してください。

ここで考えられる問題は、/uploadsフォルダー(ファイルのアップロード先)を共有する場合です。

デフォルトでは、そのフォルダーはコンテンツdirのサブフォルダーであるため、上記のワークフローを使用すると、各ブランチルートフォルダーの/uploadsサブフォルダーになります。

それがあなたにとって問題ではない場合、それをそのまま使うよりも、そうでない場合、最も簡単な解決策は、各ブランチフォルダの/uploadsrealアップロードへのシンボリックリンクにすることです共有したいフォルダ。

9
gmazzap

これはシンボリックリンクとちょっとした計画で可能です。私はネット上で同じことを何度か調べました。最後に、すべてのものをまとめて動かしました。

私はいくつかのウェブサイトを運営しています、それらはすべて同じテーマとプラグインフォルダーを共有します。同じフォルダがマルチサイトサイトとシングルサイトで機能します。しかし、あなたはマルチ/シングルサイトだけであり、風変わりであることができる特定のプラグインについて注意しなければなりません。

私はmaster-tnp/themesやmaster-tnp/pluginsのようなディレクトリを作りました。次に、ln -sコマンドを使用してwordpressディレクトリにシンボリックリンクします。

落とし穴もサーバー構成にあります。 follow symlinksディレクティブがallowに設定されていることを確認してください。

あなたがシングルWordPressインストールを使用したいならば、私は https://vaish.co/multiple-sites-single-wordpress-directory でそれをどのようにしたかについての詳細なガイドをまとめました。

0
Cpyder