web-dev-qa-db-fra.com

wp_register_script (... $ in_footer = true) ne fonctionne pas

J'aimerais charger des fichiers javascript dans mon pied de page. J'ai essayé d'accomplir cela dans functions.php comme ceci:

function my_init() {
        // LOAD JQUERY
        wp_deregister_script('jquery');
        wp_register_script('jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js',$deps = array(),$in_footer = true);
        wp_enqueue_script('jquery');

        // LOAD STUTS
        wp_register_script('stuts',get_bloginfo('template_url') . '/js/spss-tutorials-custom-functions.js',$deps = array('jquery'),$in_footer = true);
        wp_enqueue_script('stuts');

        // CONDITIONALLY LOAD MATHJAX
        wp_register_script('mathjax','//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML',$deps = array(),$in_footer = true);
        $url = explode('?', 'http://'.$_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]);
        $ID = url_to_postid($url[0]);
        $mathjax = get_post_meta($ID,'mathjax',true);
            if($mathjax == 'y'){
                wp_enqueue_script('mathjax');
            }
}

add_action('init', 'my_init');

Cependant, tous les scripts continuent de se charger dans mon en-tête.

J'ai essayé les solutions ici , ici et ici mais ils n'ont pas résolu le problème.

Idoont

<?php wp_footer(); ?>
</body>

dans mon fichier footer.php. Aucune suggestion?

1
RubenGeert

Choisissez le bon endroit au moment du rendu

Tout d’abord, vous décrochez à init, alors que vous voulez ajouter votre rappel sur wp_enqueue_script.

Exemple:

add_action( 'wp_enqueue_script', function() {
    wp_deregister_script( 'jquery' );
    // Rest of logic
} );

Rester à jour avec le noyau

Vous pouvez également utiliser la version correct utilisée par le noyau. Je sais que regarder constamment cela est fastidieux et que personne ne veut surveiller les actifs/dépendances. Heureusement, vous pouvez utiliser les informations déjà présentes dans le noyau. Il en va de même pour les dépendances nécessaires pour un actif. Exemple:

add_action( 'wp_enqueue_script', function() {

    $version      = $GLOBALS['wp_scripts']->registered['jquery']->ver;
    $protocol     = 'sprintf( 'http%s://', is_ssl() ? 's' : '' );
    $dependencies = $GLOBALS['wp_scripts']->registered['jquery']->deps;

    wp_enqueue_script( 
        'jquery',
        "{$protocol}cdn.example.com", 
        $dependencies,
        $version,
        TRUE
    );
} );

Déplacer les scripts enregistrés vers le pied de page

Il existe également un moyen plus simple de déplacer un script déjà enregistré vers le pied de page: modifiez directement ses informations dans le registre de script. Considérez le plugin suivant (MU):

<?php
/* Plugin Name: Moves registered scripts to the footer */
add_action( 'wp_enqueue_scripts', function() {
    foreach ( apply_filters( 'wp_scripts.footer', [] as $script )
        $GLOBALS['wp_scripts']->add_data( $script, 'group', 1 );
}, PHP_INT_MAX -1 );

Maintenant, vous pouvez simplement attacher un tableau à filtre ci-dessus et déplacer les scripts vers le pied de page:

add_filter( 'wp_scripts.footer', function( Array $scripts ) {
    return [ 
        'jquery', 
        # Other scripts
    ];
} );

Notes supplémentaires, je ne pouvais pas rester en arrière pour écrire…

Il y a aussi plusieurs choses très étranges (mais qui fonctionnent) à noter sur votre code:

  • Vous affectez des variables lorsque vous n'en avez pas besoin. Surtout dans un appel de fonction, il n'est pas nécessaire d'utiliser myFunction( $var = 'foo' ). Ajoutez simplement la valeur et c'est tout.
  • Lorsque vous utilisez //url.tld/script.js, le client sera en mesure de décider de la route à suivre: HTTPS vs HTTP. Cela pourrait être correct pour le code distribué (même dans ce cas, il est préférable d'extraire le protocole à l'avance et de l'utiliser), mais si vous connaissez la façon dont vous servez votre site, utilisez-le simplement. C'est plus rapide et s'il y a du HTTPS disponible, alors, pour l'amour de Dieu, utilisez-le!
  • Ne désenregistrez pas WP scripts principaux. Utilise les. Ils sont mis en cache pour les utilisateurs connectés déjà dans leurs clients/navigateurs. Pour tous les autres, vous livrerez une version single , compatible.
  • Compter sur $_SERVER n’est acceptable que si votre script ne sera toujours exécuté que par un client. Sur la ligne de commande, l’utilisation des données de ce tableau n’est pas fiable. Dans certains cas, cela change, dans d'autres, ce n'est pas réglé. WP a quelques solutions de rechange que vous pouvez utiliser à la place.
1
kaiser