web-dev-qa-db-fra.com

Afficher les URL de ressources canoniques sur un réseau multisite?

Dites qu'un thème "foo" est utilisé sur un réseau de sites. Dans chaque site, toutes les ressources de thème (.css, .js, etc.) auront des URL distinctes:

Je veux que tous soient:

Quelle est la meilleure façon de faire cela? Je peux corriger les URL directement dans le thème, mais comment puis-je normaliser les URL dans les scripts/feuilles de style mis en file d'attente?

Aside : Quel est l'avantage de disposer d'expressions telles que get_bloginfo('template_url'): créez des URL qui diffèrent d'un site à l'autre?

4
Steve Clay

Bonjour @ mrclay:

Bonnes questions.

WordPress Multisite, c'est beaucoup Sites indépendants , pas beaucoup Sites dépendants

Pour répondre à votre question, WordPress multisite a été conçu pour être un ensemble d’installations WordPress indépendantes rassemblées dans une installation où chaque site est susceptible d’être très différent, contrairement à votre cas d’utilisation. Chaque site a donc son propre thème et WordPress souhaite que ces thèmes fonctionnent à la fois sur des installations à site unique et sur des sites dans une installation multisite.

WordPress Out-of-the-Box: Des décisions, pas des options, mais des modifications avec des plugins

Alors que WordPress aurait pu avoir une option pour faire ce que vous voulez, la philosophie de WordPress est de prendre des décisions pour vous plutôt que de vous donner mille options que vous estimerez devoir comprendre, puis de laisser les développeurs de plugins modifier ces décisions si nécessaire. .

Oui: ressources centrales = meilleurs temps de chargement

Néanmoins, il serait bien de pouvoir faire ce que vous demandez, car cela améliorerait les temps de chargement moyens en exploitant la mise en cache HTTP GET pour les multisites avec des thèmes communs.

Pas besoin de "réécrire" les URL

Pour commencer, il n'est pas nécessaire de "réécrire" les URL. Assurez-vous simplement que la feuille de style et les autres ressources souhaitées font partie du thème attribué au site principal. Elles seront ensuite placées au niveau des URL souhaitées.

Création du "crochet" pour style.css

Dans WordPress, vous modifiez les décisions prêtes à l'emploi en ajoutant "crochets" ; c'est-à-dire des références à des fonctions qui vous permettront de modifier des valeurs. Un de ces crochets est 'stylesheet_uri' qui modifie l'URL du fichier 'style.css' que vous avez explicitement référencé. Vous pouvez copier ce code dans le fichier functions.php de votre thème ou vous pouvez l'insérer dans le fichier .PHP d'un plugin WordPress en cours d'écriture. Notez que je l'ai codé pour prendre en charge les installations de sous-domaine ou de sous-répertoire:

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;
}

D'autres URL de ressources peuvent avoir besoin de leurs propres crochets

Le code ci-dessus ne modifie que l'URL principale de la feuille de style; si vous avez besoin d'autres URL modifiées, vous ne pouvez pas utiliser d'autres hooks. Par exemple, vous devrez peut-être aussi utiliser 'style_loader_src' et/ou 'plugins_url', mais mon système de test ne contient pas assez de cas d'utilisation pour vérifier si c'est nécessaire ou non:

add_filter('style_loader_src','normalize_resource_url');
add_filter('plugins_url','normalize_resource_url');

Les scripts et les styles en attente utilisent une propriété base_url

Et il s'avère que les scripts et les styles mis en file d'attente utilisent une propriété nommée base_url des variables globales $wp_scripts et $wp_styles, respectivement, pour déterminer leur emplacement si une URL complète n'est pas explicitement passée par le développeur. La propriété base_url n'est définie qu'une fois pour les scripts et laissée vide pour les styles; le premier est défini lors de l'instanciation d'un objet WP_Scripts qui est ensuite affecté à la variable globale $wp_scripts.

Définir la propriété base_url dans un premier crochet 'init'

Si vous instanciez et affectez ceux-ci avant tout appel à wp_enqueue_script() ou wp_enqueue_style(), vous pouvez alors définir la propriété base_url immédiatement après quoi vous pouvez utiliser un hook init avec une priorité de 1 (les priorités de 1 étant très tôt, avant la plupart des crochets) . Voici le crochet 'init' pour accomplir ceci:

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;
}

Ou définissez la propriété base_url dans un crochet 'init' tardif

Il est également possible d’utiliser un nombre très élevé pour la priorité du hook 'init' (tel que 100) après que tous les wp_enqueue_script() ou wp_enqueue_style() ont été appelés par ( les crochets de priorité avec un nombre plus élevé courent après ceux avec des nombres plus bas) . Si vous n'avez pas besoin d'instancier les globales, affectez simplement la propriété 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;
}

Peut-être besoin d'ajuster les priorités de crochet 'init' en cas de plugins en conflit

Quelle que soit votre préférence, je pense que l’un ou l’autre de ces deux (2) hooks 'init' fonctionnera pour vous, mais si vous avez des plugins qui utilisent des priorités conflictuelles, vous devrez peut-être abaisser le numéro de priorité à 0 ou moins avec la première approche, ou augmenter la priorité. au-dessus de 100 pour la deuxième approche. Encore une fois, je n'avais pas assez de scénarios de test de cas d'utilisation à vérifier à 100%, alors laissez-moi savoir si certains cas d'utilisation ne fonctionnent pas pour vous.

4
MikeSchinkel