web-dev-qa-db-fra.com

wp_enqueue_script: l'ajout d'une instruction conditionnelle ne fonctionne pas

Voici le code que j'utilise dans mon fichier de fonctions:

add_action('init', 'sort_out_jquery_pngfix_frontend');
function sort_out_jquery_pngfix_frontend() {
    global $wp_scripts;
    if(!is_admin()) {
        wp_deregister_script('jquery');
        wp_register_script('jquery', 'https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js', array(), NULL, true);
        wp_register_script('dd_belatedpng', get_stylesheet_directory_uri() . '/js/dd_belatedpng.js', array(), NULL, true);
        $wp_scripts->add_data('dd_belatedpng', 'conditional', 'lt IE 7');
    }
}

add_action('wp_print_scripts', 'register_theme_scripts');
function register_theme_scripts() {
    if(!is_admin()) {
        wp_enqueue_script('modernizr', get_stylesheet_directory_uri() . '/js/modernizr-1.7.min.js', array(), NULL, false);
        wp_enqueue_script('googlemaps', 'http://maps.google.com/maps/api/js?sensor=false', array(), NULL, true);
        wp_enqueue_script('jquery');
        wp_enqueue_script('dd_belatedpng');
        wp_enqueue_script('sc_wc_js', get_stylesheet_directory_uri() . '/js/function.js', array('jquery', 'dd_belatedpng'), '1.0', true);
    }
}

J'utilise $wp_scripts->add_data('dd_belatedpng', 'conditional', 'lt IE 7'); pour ajouter une instruction conditionnelle à ce script, conformément à la documentation disponible en ligne, mais qui ne fonctionne pas. Le code conditionnel n'est pas affiché, mais le fichier js l'est.

Pourquoi ça ne marche pas?

5
Brady

À partir du code, cette condition ne semble être traitée que pour les styles et non pour les scripts.

8
Rarst

C'est long, mais vous pouvez essayer registering le script, then en ajoutant le conditionnel, et then mettre le script en file d'attente:

// Register the script
wp_register_script( 'dd_belatedpng', get_stylesheet_directory_uri() . '/js/dd_belatedpng.js', array(), NULL, true );
// Attempt to add in the IE conditional tags
$wp_scripts->add_data('dd_belatedpng', 'conditional', 'lt IE 7');
// Enqueue the script
wp_enqueue_script( 'dd_belatedpng' );

Je ne sais pas si ça va marcher

MODIFIER

Sur la base du ticket Trac associé, il apparaît que $wp_scripts ne prend pas en charge cette méthode.

Vous devrez peut-être simplement extraire le script du système wp_enqueue_script() et faire écho à l'appel de script IE conditionnel à l'intérieur d'une fonction enfichable reliée à wp_print_scripts ou wp_head. Ce n'est certainement pas idéal, mais s'il s'agit d'un thème de client à usage unique, vous n'avez pas à vous soucier du fait que quelqu'un d'autre doit annuler l'enregistrement du script.

5
Chip Bennett

C’est le travail que j’ai dû mettre en place car WP ne prend pas en charge ce que j’essayais de faire.

functions.php

add_action('init', 'sort_out_jquery_pngfix_frontend');
function sort_out_jquery_pngfix_frontend() {
    if(!is_admin()) {
        wp_deregister_script('jquery');
        wp_register_script('jquery', 'https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js', array(), NULL, true);
        wp_register_script('dd_belatedpng', get_stylesheet_directory_uri() . '/js/dd_belatedpng.js', array(), NULL, true);
    }
}

add_action('wp_print_scripts', 'register_theme_scripts');
function register_theme_scripts() {
    if(!is_admin()) {
        wp_enqueue_script('modernizr', get_stylesheet_directory_uri() . '/js/modernizr-1.7.min.js', array(), NULL, false);
        wp_enqueue_script('googlemaps', 'http://maps.google.com/maps/api/js?sensor=false', array(), NULL, true);
        wp_enqueue_script('jquery');
        wp_enqueue_script('sc_wc_js', get_stylesheet_directory_uri() . '/js/function.js', array('jquery'), '1.0', true);
    }
}

footer.php

<?php wp_footer(); ?>
<!--[if lt IE 7]>
<?php wp_print_scripts(array('dd_belatedpng')); ?>
<script>DD_belatedPNG.fix("img, .png_bg");</script>
<![endif]-->
5
Brady

Je viens de trouver une solution partielle à cela via $is_IE dans wp-includes/vars.php!

function emporium_enqueue_scripts() {
    global $is_IE;
    if( $is_IE ) {
        wp_register_script( 'emporium-focus' , get_template_directory_uri() . '/library/focus.js', '', '',  true );
        wp_enqueue_script( 'emporium-focus' );
    }
}
add_action('init', 'emporium_enqueue_scripts');

Cela semble charger library/focus.js sur une base if IE, mais rien dans le noyau ne permet de faire de IE conditions de version pour les scripts. On dirait qu'un ticket Trac sur le sujet a été mis de côté pour le moment.

3
esmi

On dirait que vous le mettez en bas de page. Avez-vous regardé à la fin de la page pour le fichier JS?

1
cbaigorri

Cela fonctionne aussi pour les scripts. Mais seulement dans un cas: Si le script était registered en premier. Vous ne pouvez pas aller directement pour enqueue. Vous devrez faire: register -> add_data -> enqueue. C'est à la fois pour les scripts et pour les styles que la même règle.

1
kaiser

Voici un exemple de travail pour Wordpress 4.2 et supérieur.

Ce premier exemple a déjà reçu une réponse ici .

    wp_register_script("ie_jshandle",
                 get_template_directory_uri() . "/js/jsSpecificIE.js",
                 array(),
                 '1.0',
                 false );
    wp_enqueue_script("ie_jshandle");
    wp_script_add_data("ie_jshandle", "conditional", "lt IE 9");    

Vous pouvez également utiliser la variable $wp_scripts comme ceci:

function wpse_20873_enq_scripts() {
global $wp_scripts;
        wp_register_script("ie_jshandle",
                     get_template_directory_uri() . "/js/jsSpecificIE.js",
                     array(),
                     '1.0',
                     false );
        wp_enqueue_script("ie_jshandle");

        $wp_scripts->add_data("ie_jshandle", "conditional", "lt IE 9"); 
}
add_action("wp_enqueue_scripts", "wpse_20873_enq_scripts");

Référence wp_script_add_data

0
KeepMove