J'ai lu sur la WP docs, qui pointait vers cet élément Gist que la bonne manière de mettre en file d'attente les styles pour IE consiste à utiliser le $wp_styles
. J'imagine que cela serait vrai également pour les scripts.
Option 1 - Utilisation de wp_scripts
add_action('wp_print_scripts', function() {
global $wp_scripts;
wp_enqueue_script( 'html5shiv', 'https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js', array( 'bootstrap' ) );
$wp_scripts->add_data( 'html5shiv', 'conditional', 'lt IE 9' );
} );
Deuxième option - Utilisez wp_scripts
avec is_IE
add_action('wp_print_scripts', function() {
global $wp_scripts, $is_IE;
if($is_IE) {
wp_enqueue_script( 'html5shiv', 'https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js', array( 'bootstrap' ) );
$wp_scripts->add_data( 'html5shiv', 'conditional', 'lt IE 9' );
}
} );
Troisième option - Répondez simplement dans la tête:
add_action('wp_head', function(){
echo '<!--[if lt IE 9]><script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script><![endif]-->' . "\n";
});
Option Quatre - Mettez-le en tête de liste:
add_action('wp_print_scripts', function(){
wp_enqueue_script( 'html5shiv', 'https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js', array( 'bootstrap' ) );
});
La deuxième option. semble cool car il semble un peu plus propre sur les navigateurs non-IE. Mais je ne suis pas sûr si cela a réellement un avantage de vitesse ou si le contrôle seul le ralentit davantage. À part cela, je n'arrive pas à comprendre pourquoi l'option 1 est meilleure que l'option 3 ou 4.
J'utilise le framework Genesis et ils incluent HTML5shiv comme dans l'exemple ci-dessous qui ne me semblait pas correct:
add_action( 'wp_head', 'genesis_html5_ie_fix' );
/**
* Load the html5 shiv for IE8 and below. Can't enqueue with IE conditionals.
*/
function genesis_html5_ie_fix() {
if ( ! genesis_html5() )
return;
echo '<!--[if lt IE 9]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->' . "\n";
}
Pour prolonger @gmazzap suggestion sur le fait de ne pas utiliser de globales lorsque vous pouvez utiliser wp_scripts()
, il existe un raccourci pour wp_scripts()
permettant d'ajouter des commentaires conditionnels appelés wp_script_add_data
et __ également wp_style_add_data
pour les styles conditionnels.
/**
* IE enqueue HTML5shiv with conditionals
* @link http://tiny.cc/html5shiv
*/
function wpse_213701_enqueue_html5shiv() {
wp_enqueue_script( 'html5shiv',
'https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js',
array(),
false,
false
);
wp_script_add_data( 'html5shiv', 'conditional', 'lt IE 9' );
}
add_action('wp_enqueue_scripts', 'wpse_213701_enqueue_html5shiv');
Cependant, l'exemple ci-dessus utilise HTML5shiv, ce qui est une situation unique. Puisque doit être chargé dans la tête, vous pourriez faire quelque chose comme cet exemple suivant si vous craignez un plugin comme Roots Soil en supprimant tous les scripts de la tête.
Très probablement, vous ne rencontrerez pas une telle situation. C'est une chose très instable à faire car il faut beaucoup de scripts pour charger dans la tête. Pour placer des scripts dans le pied de page, définissez $in_footer
variable sur true lors de la mise en file d'attente des scripts. Par conséquent, si vous utilisez des racines ou tout autre plug-in de cache, planifiez pas que tout fonctionne correctement. boîte.
Voici un exemple moche de ce que vous pouvez faire:
add_action( 'wp_head', 'wpse_213701_check_html5shiv', 1 );
function wpse_213701_check_html5shiv() {
remove_action( 'wp_head', 'genesis_html5_ie_fix' );
if ( !has_filter( 'wp_head', 'wp_enqueue_scripts' ) && !wp_script_is( 'html5shiv', 'done' ) ) {
add_action('wp_head', 'wpse_213701_echo_html5shiv');
wp_dequeue_script('html5shiv');
}
}
function wpse_213701_echo_html5shiv() {
echo '<!--[if lt IE 9]><script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script><![endif]-->' . "\n";
}
C'est exagéré cependant et cela ne garantit toujours pas que cela fonctionnera. Au cours des 4 dernières années, html5shiv a pris de nombreux noms, ce qui a provoqué son enregistrement/mise en file d'attente avec plusieurs descripteurs différents (html5, html5shiv, html5shim, nom_thème-html5shiv, html5-ie-fix, et html5- polyfill pour n'en nommer que quelques-uns). De plus, il s'agit souvent de fourni avec modernizr . Dans cet esprit, si vous pensez que l'exemple ci-dessus est ridicule, vous pouvez également ajouter le script à wp_head
dans votre thème enfant depuis un plugin html5shiv handle nommera probablement autre chose.
Cela a déclenché une action sur la page Roots/Soil Github. Voici probablement le meilleur moyen de le faire (comme suggéré par @grappler )) et de toujours déplacer les scripts vers le pied de page. Une approche similaire a été publiée sur @ kaiser blog il y a quelques années.
function grappler_move_js_to_footer()
$scripts = wp_scripts();
foreach( $scripts->registered as $script ) {
if ( 'html5' == $script->handle ) {
wp_script_add_data( $script->handle, 'group', 0 );
} else {
wp_script_add_data( $script->handle, 'group', 1 );
}
}
}
add_action( 'wp_enqueue_scripts', 'grappler_move_js_to_footer', 99 );
Quant à ce que Mark Kaplan a suggéré et à ce quetoscho mentionné ici, vous ne devriez pas utiliser la méthode $ is_IE de l'option 2 . Apparemment, si l'en-tête HTTP Vary: User- L’agent n’est pas envoyé, vous enverrez le mauvais résultat aux utilisateurs derrière un cache, ce qui le cassera. En ce qui concerne la détection côté navigateur voici un long fil d’exemples sur la façon dont cela pourrait être fait. Même la détection côté client a ses pièges.
En fin de compte, la meilleure solution est peut-être de ne pas utiliser ces méthodes et d'oublier les navigateurs hérités, car Microsoft a cessé de les prendre en charge à compter du 12 janvier .
Et l'option 5 consiste à détecter du côté du navigateur de quel navigateur il s'agit et à créer un élément de script pour votre script directement dans le dom, comme le fait Google Analytics comme le FB SDK.
Cela présente l’avantage de faire la détection du navigateur au seul endroit où cela devrait être fait, le navigateur, et de charger les scripts spécifiques à IE uniquement lorsque cela est nécessaire.
Dans l’esprit, cela ressemble beaucoup à votre troisième option, mais elle est plus générique.
Sidenote: is_IE
devrait être évité, comme tous les autres navigateurs côté serveur, car ils empêcheraient la mise en cache.
De manière générale, les scripts et les styles ne doivent jamais être directement imprimés sur la page.
La raison en est qu'un autre plugin ou thème peut ajouter le même script à nouveau, et vous obtenez le même script ajouté 2 fois ou plus.
Si vous mettez la ressource en file d'attente de la manière appropriée, si un autre code met la ressource en file d'attente à nouveau, elle sera ajoutée une fois.
Pour cette raison, vous devez ignorer les options 3 et 4.
En ce qui concerne l'option 2, comme Mark Kaplun a souligné , il utilise la détection de navigateur côté serveur, qui n'est jamais très abordable, et même si ce serait le cas, ne laissez pas la version sélectionnée du navigateur et dans votre cas, il inclura le script même dans les versions modernes IE, qui n'en ont pas besoin.
Donc, en fait, l'option 1 est la meilleure parmi celles que vous avez proposées.
Les seuls changements que je ferais:
'wp_enqueue_scripts'
au lieu de 'wp_print_scripts'
wp_scripts()
function plutôt que d'accéder à globalQuelque chose comme:
add_action('wp_enqueue_scripts', function() {
wp_enqueue_script(
'html5shiv',
'https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js',
array( 'bootstrap' ),
'3.7.2',
false
);
wp_scripts()->add_data( 'html5shiv', 'conditional', 'lt IE 9' );
} );
En procédant ainsi, si un autre plugin met en file d'attente le script 'html5shiv'
, il ne sera ajouté qu'une seule fois.
Notez qu'en utilisant l'extrait ci-dessus, ce qui est imprimé sur une page est:
<!--[if lt IE 9]>
<script type='text/javascript' src='https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js'></script>
<![endif]-->
Cette condition est analysée par le navigateur (côté client) et non par le serveur. Elle est donc abordable et vous permet d'ajouter le script uniquement pour la version IE que vous souhaitez cibler.
Si vous souhaitez en savoir plus sur la plate-forme cliente (système d'exploitation, type d'écran et résolution, version détaillée du navigateur, etc.), vous ne pouvez utiliser que du javascript pour obtenir ces informations et ajouter dynamiquement le script à DOM Mark Kaplun solution), mais si connaître la "famille de navigateurs" et la version majeure vous suffit, ma suggestion est d'utiliser cette solution.