WordPressのマルチサイト機能には、2つの異なるインストールモードがあります。 subdomain および subdirectory install。デフォルトでは、どちらのモードでも1つのインストール内と1つのプライマリドメイン内で別々のWordPressインスタンス(サイト)を管理できます。明らかな違いは、すべてのサイトのURLスキーマです(この例では、multisite.tld
が主要なドキュメントです)。
http://site1.multisite.tld
http://multisite.tld/site1
。任意のドメインをサイトにマッピングすることは可能です 両方のモードで作成された後に - 、両者の実際の違いは何でしょうか。また、インストール後にモードを変更する方法はありますか?
ユーザーから見ると、2つの大きな違いがあります。まず新しいサイトを作成するためのGUI。 URLパス(サブディレクトリ)のfirst segmentの入力フィールド、または新しいサイトに使用するサブドメインの入力フィールドのどちらかが表示されます。 (URLを完全に任意の値に設定することは、既に作成されたサイトを編集するときにだけ可能です。しかし、それは両方のモードで可能です。)
もう1つは、一見したところでは明らかではなく、サブディレクトリモードにのみ影響します。メインサイトのパーマリンク構造は、変更されることを意図していない静的プレフィックスblog/
を持ちます。 (解決策があるかもしれないのにプレフィックスを変更するか、または取り除きなさい)。
技術的な観点からは、構成定数、データベース内の構成値、およびWebサーバーの構成によって定義されるシステム構成は異なります。最初にモードを定義するものは、true
(サブドメインモード)またはfalse
(サブディレクトリモード)に設定できる定数IS_SUBDOMAIN_INSTALL
です。しかし、それがこの情報が保存される唯一の場所ではありません。インストール処理中、WordPressはキーsubdomain_install
を使ってサイトメタとして整数値を保存します。それはWP-CLIで読むことができます(または更新することができます):
$ wp site option get subdomain_install
1
サブディレクトリモードでは、さらに禁止されたサイトスラッグのリストに追加の要素が追加されます:blog
。これらのリストはサイトメタillegal_names
に格納されています。したがって、サブディレクトリモードでは、デフォルトで次のようになります。
$ wp site option get illegal_names
array (
0 => 'www',
1 => 'web',
2 => 'root',
3 => 'admin',
4 => 'main',
5 => 'invite',
6 => 'administrator',
7 => 'files',
8 => 'blog',
)
WebサーバはWordPressの内部構造を担当していないため、その設定はすべて、要求されたURLを正しいスクリプトまたはアセットファイルにルーティングすることです。主に、/site-slug/wp-[admin|content|includes]
や/site-slug/wp-*.php
のようなリクエストURLを適切なディレクトリ(/wp-*/
)に送るのか、スクリプトに送るのかという問題です。
そのため、 サブディレクトリモード のデフォルトの書き換え規則は次のようになります。
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
これに対して、 サブドメインモード の設定が推奨されます。
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
どのタイプのルールセットを使用するかは、マルチサイト用に計画しているドメインスキーマによって大きく異なります。より柔軟なものはもちろん最初のもの(サブディレクトリ)です。URLパスセグメント("サブディレクトリ")は完全にオプションです。
is_subdomain_install()
API関数どのモードが設定されているかを知るために、WordPressは以下の場合にtrue
を返す関数is_subdomain_install()
を提供しています。
SUBDOMAIN_INSTALL
が定義され、true
または に設定されているSUBDOMAIN_INSTALL
は定義されていませんがVHOST
が定義されていて'yes'
に設定されていますSUBDOMAIN_INSTALL
が定義されていてfalse
に設定されている場合はfalse
を返します。 SUBDOMAIN_INSTALL
が定義されているがboolean型ではない場合、それ以外のものを返します。上記のサイトメタ値は、マルチセットアップのプロセス中にのみ使用されます。 WordPressコアは、この定数の他の部分の値にのみ依存しています。
ただし、is_subdomain_install()
の値は、定数DOMAIN_CURRENT_SITE
およびPATH_CURRENT_SITE
が定義されていない場合にのみ、要求されたURLのネットワーク内の特定のサイトへのルーティングに影響します。 (ms_load_current_site_and_network()
を参照)つまり、両方のモードでドメインURLをサイトURLとして使用できます(ドメインマッピング)。
IS_SUBDOMAIN_INSTALL
の値をtrue
からfalse
に変更しますサイトメタsubdomain_install
の値を0
に設定します。
$wp site option set subdomain_install 0
/blog/
を追加してください。設定が更新された後に修正されます。blog
を追加してください。このリストは直列化された値なので、これはWP-CLI経由で実行できる小さなPHPスクリプトを介して実行する必要があります。$ wp eval-file patch-forbidden-slugs.php
// patch-forbidden-slugs.php
<?php
$illegalNames = get_metadata( 'site', SITE_ID_CURRENT_SITE, 'illegal_names', true );
$blogSlug = 'blog';
if ( in_array( $blogSlug, $illegalNames ) ) {
exit( 'Noting to do' . PHP_EOL );
}
$illegalNames[] = $blogSlug;
update_metadata( 'site', SITE_ID_CURRENT_SITE, 'illegal_names', $illegalNames );
exit( 'Done' . PHP_EOL );
IS_SUBDOMAIN_INSTALL
の値をfalse
からtrue
に変更しますサイトメタsubdomain_install
の値を1
に設定します。
$ wp site option set subdomain_install 1
メインサイトのパーマリンク構造から/blog/
プレフィックスを削除する
blog
スラッグを削除します(それに応じて上記のスクリプトを修正します)。私の発言は、クリーンなWordPressインストールとその直後のネットワークインストールのみを考慮しています。最新のWordPressバージョン4.8も考慮されています。プラグインまたはそれ以前のバージョンのWordPressを使用している既存のシステムにマルチサイトインストールを実行すると、影響が生じる可能性があります。
しかし、私が好む設定は、サブディレクトリ用の.htaccessルールセットを備えたサブドメインモードです。それは WPStarter のような現代の作曲家によって制御された設定でさえも動作する(.htaccess規則のわずかな適応を伴う)。