Dans un thème WordPress, comment inclure conditionnellement des scripts pour ie8 et les versions antérieures? Il s’agit principalement d’appliquer des polyfill pour diverses fonctions html5/css3. Je vois que wp a la variable $ is_IE qui peut être utilisée comme condition pour inclure uniquement les scripts pour IE. Existe-t-il un moyen d’ajouter le script pour certaines versions de IE plutôt que pour toutes les versions? C’est simple avec certains commentaires HTML, c’est-à-dire conditionnels, mais j’aimerais inclure les scripts au même endroit dans mon fichier de fonctions.
Conditionnel pour des versions spécifiques en HTML:
<!--[if lt IE 9]> <script src="iepolyfill.min.js"></script> <![endif]-->
Conditionnel pour tout IE dans WP:
global $is_IE;
if ( $is_IE ) {
wp_enqueue_script( 'iepolyfill', bloginfo('stylesheet_directory').'/js/iepolyfill.min.js' );
}
J'ai jeté un coup d'œil et surtout trouvé des détails sur les scripts conditionnels pour le backend wp uniquement.
Aucune suggestion?
Wordpress étant un script PHP, il peut accéder à la variable serveur via $ _SERVER.
Ensuite, vous pouvez rechercher un navigateur avec PHP, PHP: Si Internet Explorer 6, 7, 8 ou 9
Pour WordPress 4.2+
Utilisez wp_script_add_data
pour envelopper le script dans un commentaire conditionnel:
wp_enqueue_script( 'html5shiv', '//cdn.jsdelivr.net/html5shiv/3.7.2/html5shiv.js' );
wp_script_add_data( 'html5shiv', 'conditional', 'lt IE 9' );
wp_enqueue_script( 'respond', get_template_directory_uri() . '/js/respond.min.js' );
wp_script_add_data( 'respond', 'conditional', 'lt IE 9' );
Assurez-vous simplement d'enregistrer le script avant d'appeler wp_script_add_data
(l'enregistrement est géré par wp_enqueue_script
ci-dessus) et que le premier argument que vous transmettez à wp_script_add_data
correspond au premier argument que vous avez transmis lors de l'enregistrement du script.
Pour WordPress 4.1
Vous pouvez utiliser le filtre script_loader_tag
today pour mettre en file d'attente les scripts encapsulés dans des commentaires conditionnels. Voici un exemple de mise en œuvre:
wp_enqueue_script( 'html5shiv', '//cdn.jsdelivr.net/html5shiv/3.7.2/html5shiv.js', array(), '3.7.2', false );
add_filter( 'script_loader_tag', function( $tag, $handle ) {
if ( $handle === 'html5shiv' ) {
$tag = "<!--[if lt IE 9]>$tag<![endif]-->";
}
return $tag;
}, 10, 2 );
Et si vous souhaitez inclure plusieurs scripts de la même manière, vous pouvez utiliser quelque chose comme:
// Conditional polyfills
$conditional_scripts = array(
'html5shiv' => '//cdn.jsdelivr.net/html5shiv/3.7.2/html5shiv.js',
'html5shiv-printshiv' => '//cdn.jsdelivr.net/html5shiv/3.7.2/html5shiv-printshiv.js',
'respond' => '//cdn.jsdelivr.net/respond/1.4.2/respond.min.js'
);
foreach ( $conditional_scripts as $handle => $src ) {
wp_enqueue_script( $handle, $src, array(), '', false );
}
add_filter( 'script_loader_tag', function( $tag, $handle ) use ( $conditional_scripts ) {
if ( array_key_exists( $handle, $conditional_scripts ) ) {
$tag = "<!--[if lt IE 9]>$tag<![endif]-->";
}
return $tag;
}, 10, 2 );
wp_register_script()
chaque fois que vous ajoutez des scripts à vos thèmes ou plugins WP.Pour IE, les balises conditionnelles fonctionnent très bien. Voici comment ajouter des balises conditionnelles dans un script, par exemple pour HTML5shiv :
global $wp_scripts;
wp_register_script(
'html5shiv',
get_bloginfo('template_url').'/assets/js/html5shiv.js',
array(),
'3.6.2'
);
$wp_scripts->add_data( 'html5shiv', 'conditional', 'lt IE 9' );
Solution pour WordPress 4.2 et supérieur
La bonne façon serait d'appliquer wp_enqueue_script puisqu'il s'agit de JavaScripts ici, et non de styles css. En outre, il est préférable d'utiliser get_bloginfo ('stylesheet_url') pour vous assurer que cela fonctionne également dans les thèmes enfants.
/**
* IE Fallbacks
*/
function load_IE_fallback() {
wp_register_script( 'ie_html5shiv', get_bloginfo('stylesheet_url'). '/js/html5shiv.min.js', __FILE__, false, '3.7.2' );
wp_enqueue_script( 'ie_html5shiv');
wp_script_add_data( 'ie_html5shiv', 'conditional', 'lt IE 9' );
wp_register_script( 'ie_respond', get_bloginfo('stylesheet_url'). '/js/respond.min.js', __FILE__, false, '1.4.2' );
wp_enqueue_script( 'ie_respond');
wp_script_add_data( 'ie_respond', 'conditional', 'lt IE 9' );
}
add_action( 'wp_enqueue_scripts', 'load_IE_fallback' );
Mise à jour pour WordPress 4.7.3 avec chargement des scripts depuis le CDN:
add_action( 'wp_enqueue_scripts', 'load_IE_fallback' );
function load_IE_fallback() {
wp_register_script( 'ie_html5shiv', 'https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js', '', '3.7.3', false );
wp_register_script( 'ie_respond', 'https://oss.maxcdn.com/respond/1.4.2/respond.min.js', '', '1.4.2', false );
wp_enqueue_script( 'ie_html5shiv');
wp_enqueue_script( 'ie_respond');
wp_script_add_data( 'ie_html5shiv', 'conditional', 'lt IE 9' );
wp_script_add_data( 'ie_respond', 'conditional', 'lt IE 9' );
}
La meilleure façon de le faire est de mettre les scripts en file d'attente, puis d'utiliser wp_style_add_data () pour mettre conditionnel. Cette méthode est utilisée par des thèmes officiels comme vingt-treize
Il y a une réponse semblable à celle-ci mais il ajoute un supplément si dans l'état qui ne va pas.
wp_register_style( 'ie_html5shiv', get_template_directory_uri() . '/js/html5shiv.js' );
wp_enqueue_style( 'ie_html5shiv');
wp_style_add_data( 'ie_html5shiv', 'conditional', 'lt IE 9' );
wp_register_style( 'ie_respond', get_template_directory_uri() . '/js/respond.min.js' );
wp_enqueue_style( 'ie_respond');
wp_style_add_data( 'ie_respond', 'conditional', 'lt IE 9' );
C'est un cauchemar bizarre. Je veux juste dormir un peu ce soir, d'accord?
Ça ne marche pas
$wp_styles->add_data("foo", "conditional", "lt IE 9");
Considérant que tout ce qui est suggéré ici n’est qu’un hack, j’ai fini par les coder en dur dans mon modèle.
header.php
<head>
<!-- ... -->
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7/html5shiv.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/es5-shim/2.3.0/es5-shim.js"></script>
<![endif]-->
<?php wp_head(); ?>
</head>
Le seul inconvénient est que si vous ne les voulez pas sur toutes les pages. Soyons honnêtes, vous les voudrez sur la plupart pages, donc règle 80/20 dicte que cela suffit pour moi.
Essayez d’utiliser la fonction wp_style_add_data()
(utilisée officiellement dans vingt-treize et vingt-quatorze thème:
wp_enqueue_style( 'iepolyfill', bloginfo( 'stylesheet_directory' ) . '/js/iepolyfill.min.js' );
wp_style_add_data( 'iepolyfill', 'conditional', 'if lt IE 9' );
Update: Depuis WordPress> = 4.2.0, une fonction est utilisée de la même manière. C'est appelé:
wp_script_add_data()