web-dev-qa-db-fra.com

Enregistrer et mettre en file d'attente des fichiers javascript conditionnels (spécifiques au navigateur)?

La communauté WP.SE a toujours recommandé l’utilisation de wp_register_script et wp_enqueue_script pour l’ajout de scripts dans un thème/modèle (de même que wp_register_style et wp_enqueue_style pour les feuilles de style).


C’est ainsi que j’enregistre et met en file d'attente mes scripts ...

D'abord, j'ajoute quelque chose comme ceci dans functions.php

add_action('init','wpse54189_register_script');
function wpse54189_register_script(){

    //Register scripts
    wp_enqueue_script( 'jquery' );
    wp_register_script( 'aahan_bootstrap_transition', get_template_directory_uri().'/js/bootstrap-transition.js');
    wp_register_script( 'aahan_bootstrap_carousel', get_template_directory_uri().'/js/bootstrap-carousel.js', array('aahan_bootstrap_transition'));    
    wp_register_script( 'wpse54189_ajax_comment', get_template_directory_uri().'/js/no-reload-comments.js');
}

puis appelez-le dans un fichier modèle (par exemple, header.php) comme ceci

<?php wp_enqueue_script( 'aahan_bootstrap_carousel' ); ?>
<?php wp_enqueue_script( 'wpse54189_ajax_comment' ); ?>

Maintenant, pour en venir au fait, comment puis-je enregistrer et mettre en file d'attente des "fichiers JavaScript conditionnels" qui doivent être reconnus par des navigateurs spécifiques? Par exemple:

<!--[if lt IE 9]>
<script src="<?php echo get_template_directory_uri(); ?>/js/html5.js" type="text/javascript"></script>
<![endif]-->

Comment puis-je m'inscrire et mettre cela en file d'attente correctement?

PS: J'utilise le thème Reddle , développé par les auteurs du thème de Automattic. Et header.php du thème utilise directement le code susmentionné - c’est-à-dire qu’il n’est pas mis en file d'attente. Alors, est-ce que ça veut dire que c'est la seule façon de le faire?

8
its_me

Les classes WP_Scripts et WP_Styles sont derrière les fonctions wp_enqueue_script et wp_enqueue_style. Si vous examinez l'implémentation des classes ( scripts et styles ), vous verrez que la classe WP_Scripts ne prend en charge aucun type de script conditionnel, mais! vous pouvez voir que WP_Styles fait! Le problème est que wp_enqueue_style ne vous permet pas de configurer une condition.

Nous devons donc faire un petit hack:

add_filter( 'wp_enqueue_scripts', 'wpse2345_enqueue_scripts' );
function wpse2345_enqueue_scripts() {
    wp_enqueue_style( 'mystyle', 'url/of/my/style.css', array(), '1.0.0' );

    global $wp_styles;
    $wp_styles->registered['mystyle']->add_data( 'conditional', 'lt IE 9' );
}

Un tel hack devient possible car tous les styles enregistrés sont stockés dans le champ registered de la classe WP_Styles. Chacun des styles enregistrés est un objet de la classe _WP_Dependency, qui vous permet d'ajouter des données supplémentaires.

Malheureusement, ce hack ne fonctionne pas pour les scripts.

Informations complémentaires:
En fait, je parcourais le code dans (Essence Theme) d'Aaron Campbell hier soir et j'ai remarqué qu'il appelait à la fois un script et un style conditionnels pour navigateur.

/**
 * @var WP_Scripts
 */
global $wp_scripts;
// Conditionally load this only for IE < 9
$wp_scripts->add_data( 'html5', 'conditional', 'lt IE 9' );

/**
 * @var WP_Styles
 */
global $wp_styles;
// Conditionally load this only for IE < 8
$wp_styles->add_data( 'blueprint-ie', 'conditional', 'lt IE 8' );

Il y a aussi un ticket et patch mais il n'est pas encore dans le noyau }. Il est évident que le script conditionnel ne fonctionnera pas sans le correctif, mais il convient de noter que vous pouvez utiliser la méthode add_data directement dans votre fonction qui est attachée à l'action wp_enqueue_scripts.

13
Eugene Manuilov