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?
Bonjour @ mrclay:
Bonnes questions.
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.
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. .
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.
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.
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;
}
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');
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
.
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;
}
base_url
dans un crochet 'init'
tardifIl 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;
}
'init'
en cas de plugins en conflitQuelle 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.