web-dev-qa-db-ja.com

マルチサイトネットワークで正規のリソースURLを出力する

テーマ "foo"がサイトのネットワーク全体で使用されているとします。各サイトでは、すべてのテーマリソース(.css.jsなど)に個別のURLがあります。

私はこれらがすべてであることを望みます:

これを行うための最良の方法は何ですか?テーマに直接出力されるURLを修正できますが、エンキューされたスクリプト/スタイルシートでURLを正規化するにはどうすればよいですか?

get_bloginfo('template_url')のような式でサイト間で異なるURLを作成することの利点は何ですか?

4
Steve Clay

こんにちは@ mrclay:

良い質問です。

WordPressマルチサイトは多数独立サイトではなく、多数従属サイト

余談ですが、WordPressマルチサイトは、ユースケースとは異なり、各サイトが非常に異なる可能性がある1つに集められた独立したWordPressインストールのコレクションになるように設計されました。したがって、各サイトには独自のテーマがあり、WordPressはそれらのテーマが単一サイトのインストールとマルチサイトインストールのサイトの両方で機能することを望んでいます。

すぐに使えるWordPress:オプションではなく、プラグインによる変更の決定

WordPressには、WordPressの哲学で構築したいことを行うためのオプションがあったかもしれませんが、あなたが必要だと感じる千のオプションを与えるのではなく、あなたのために決定を下すことです理解し、必要に応じてプラグイン開発者にこれらの決定を変更させます。

はい:中央リソース=より良いロード時間

それでも、共通のテーマを持つマルチサイトのHTTP GETキャッシングを活用することで平均ロード時間を改善できるため、求めていることを実行できると便利です。

URLを「書き換える」必要はありません

まず、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のみを変更します。他の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 11優先度は、ほとんどのフックの前に非常に早く実行されます)。これを実現する'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%検証するための十分なユースケーステストシナリオがありませんでしたので、いくつかのユースケースが機能していないかどうかを教えてください。

4
MikeSchinkel