テーマ "foo"がサイトのネットワーク全体で使用されているとします。各サイトでは、すべてのテーマリソース(.css
、.js
など)に個別のURLがあります。
私はこれらがすべてであることを望みます:
これを行うための最良の方法は何ですか?テーマに直接出力されるURLを修正できますが、エンキューされたスクリプト/スタイルシートでURLを正規化するにはどうすればよいですか?
脇:
get_bloginfo('template_url')
のような式でサイト間で異なるURLを作成することの利点は何ですか?
こんにちは@ mrclay:
良い質問です。
余談ですが、WordPressマルチサイトは、ユースケースとは異なり、各サイトが非常に異なる可能性がある1つに集められた独立したWordPressインストールのコレクションになるように設計されました。したがって、各サイトには独自のテーマがあり、WordPressはそれらのテーマが単一サイトのインストールとマルチサイトインストールのサイトの両方で機能することを望んでいます。
WordPressには、WordPressの哲学で構築したいことを行うためのオプションがあったかもしれませんが、あなたが必要だと感じる千のオプションを与えるのではなく、あなたのために決定を下すことです理解し、必要に応じてプラグイン開発者にこれらの決定を変更させます。
それでも、共通のテーマを持つマルチサイトのHTTP GETキャッシングを活用することで平均ロード時間を改善できるため、求めていることを実行できると便利です。
まず、URLを「書き換える」必要はありません。必要なスタイルシートやその他のリソースがメインサイトに割り当てられたテーマの一部であることを確認するだけで、必要なURLに配置されます。
style.css
の「フック」の作成WordPressでは、 "hooks"を追加することにより、すぐに使用できる決定を変更できます。つまり、値を変更できる関数への参照。そのようなフックの1つは、'stylesheet_uri'
です。これは、明示的に参照した'style.css'
ファイルのURLを変更します。このコードをテーマのfunctions.php
ファイルにコピーするか、作成しているWordPressプラグインの.PHPファイルに入れることができます。サブドメインのインストールまたはサブディレクトリのインストールをサポートするために、これをコーディングしたことに注意してください。
function normalize_resource_url($url) {
if (MULTISITE) {
$site_url = get_site_url(BLOG_ID_CURRENT_SITE);
if (SUBDOMAIN_INSTALL) {
$url = preg_replace("#^(https?://[^/]+)(/wp-.*\.(css|js))?$#","{$site_url}\\2",$url);
} else {
$url = preg_replace("#^({$site_url})(/[^/]+)(/wp-.*\.(css|js))?$#",'\1\3',$url);
}
}
return $url;
}
上記のコードは、メインスタイルシートのURLのみを変更します。他のURLを変更する必要がある場合は、他のフックを使用しないでください。たとえば、'style_loader_src'
や'plugins_url'
も使用する必要があるかもしれませんが、必要かどうかを検証するための十分なユースケースをテストシステムに設定していません。
add_filter('style_loader_src','normalize_resource_url');
add_filter('plugins_url','normalize_resource_url');
base_url
プロパティを使用しますそして、キューに入れられたスクリプトとスタイルは、グローバルURL base_url
と$wp_scripts
の$wp_styles
という名前のプロパティを使用して、完全なURLが明示的に渡されない場合、それぞれの場所を決定します。開発者。 base_url
のプロパティは、スクリプトに対して一度だけ設定され、スタイルに対しては空白のままになります。前者は、WP_Scripts
オブジェクトのインスタンス化時に設定され、グローバル変数$wp_scripts
に割り当てられます。
base_url
フックで'init'
プロパティを設定しますwp_enqueue_script()
またはwp_enqueue_style()
の呼び出しの前にそれらをインスタンス化して割り当てる場合、base_url
プロパティをすぐに設定でき、その後すぐにinit
フックで優先度を設定できますof 1
(1
優先度は、ほとんどのフックの前に非常に早く実行されます)。これを実現する'init'
フックを次に示します。
add_filter('init','normalize_base_urls',1);
function normalize_base_urls() {
$GLOBALS['wp_scripts'] = new WP_Scripts();
$GLOBALS['wp_styles'] = new WP_Styles();
$base_url = normalize_resource_url(get_site_url(BLOG_ID_CURRENT_SITE));
$GLOBALS['wp_scripts']->base_url = $base_url;
$GLOBALS['wp_styles']->base_url = $base_url;
}
base_url
プロパティを後の'init'
フックに設定しますまた、'init'
フック(100など)の優先度に非常に高い数値を使用することもできますwp_enqueue_script()
またはwp_enqueue_style()
が(小さい番号のフックの後に高い番号の優先度フックが実行されます)によって呼び出されました。その場合、グローバルをインスタンス化する必要はありません、base_url
プロパティを割り当てるだけです:
add_filter('init','normalize_base_urls',100);
function normalize_base_urls() {
$base_url = normalize_resource_url(get_site_url(BLOG_ID_CURRENT_SITE));
$GLOBALS['wp_scripts']->base_url = $base_url;
$GLOBALS['wp_styles']->base_url = $base_url;
}
'init'
フックの優先度を調整する必要がある場合がありますどちらを選択しても、これらの2つの'init'
フックのいずれかが機能すると信じていますが、競合する優先順位を使用するプラグインがある場合は、最初のアプローチで優先順位番号を0以下に下げる必要があります。または、2番目のアプローチの優先度を100より高くします。繰り返しますが、100%検証するための十分なユースケーステストシナリオがありませんでしたので、いくつかのユースケースが機能していないかどうかを教えてください。