web-dev-qa-db-fra.com

Question sur le fonctionnement de wp_register_script

Ok, j'utilise donc le thème Roots pour WordPress (https://github.com/retlehs/roots), qui est en quelque sorte un thème de démarrage ou un cadre de thème.

Je ne comprends pas comment il désenregistre la version chargée de jQuery dans WordPress, mais il l'enregistre à nouveau sans spécifier l'emplacement exact du script .

Donc, dans le header.php du thème, il y a ce code:

...
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
  <script>window.jQuery || document.write('<script src="<?php echo get_template_directory_uri(); ?>/js/libs/jquery-1.6.4.min.js"><\/script>')</script>
...

, qui me lit: 'téléchargez le script jQuery hébergé par Google, mais si, pour une raison quelconque, l’objet jQuery n’est pas présent, créez simplement un élément de script qui charge le script fourni avec le thème.

Toutefois, à l'intérieur d'un fichier de thème appelé roots-cleanup.php qui est inclus dans le fichier functions.php du thème, ce code annule l'enregistrement du script jQuery fourni avec WordPress, mais enregistre immédiatement à nouveau jQuery sans spécifier réellement l'URL du script:

...
function roots_head_cleanup() {
  ...

  // don't load jQuery through WordPress since it's linked in header.php
  if (!is_admin()) {
    wp_deregister_script('l10n');
    wp_deregister_script('jquery');
    wp_register_script('jquery', '', '', '', true);
  }
}

add_action('init', 'roots_head_cleanup');
...

Maintenant, je suis allé voir ce que dit la documentation à ce sujet et quelque chose comme: "Ce paramètre [paramètre d'emplacement] n'est requis que lorsque WordPress n'est pas déjà au courant de ce script."

Je me demande donc, en incluant les balises de script qui chargent jQuery dans le fichier header.php, cela signifie-t-il que WordPress en est conscient au moment d'appeler wp_register_script? Ainsi:

wp_register_script('jquery', '', '', '', true);

Je demande parce que je voulais essayer cette technique mais je n'ai pas obtenu les résultats escomptés. À savoir, les javascripts que j'ai inclus en utilisant wp_enqueue et qui dépendaient de jQuery toujours chargé même lorsque j'ai supprimé les balises de script qui les incluent dans l'en-tête, ce qui signifie que les javascripts que j'ai chargés ont échoué car aucun jQuery n'était chargé. Cela me dit également que WordPress n'est pas nécessairement au courant du script jQuery si je ne spécifie pas le paramètre d'emplacement.

1
racl101

Pour mémoire, c’est tout à fait la mauvaise chose à faire.

Les thèmes doivent éviter (lire jamais!) De désinscrire les scripts jQuery enregistrés dans WordPress (les plug-ins ne doivent absolument jamais le faire).

Si un thème doit désenregistrer le script jQuery (pour le remplacer), il devrait alors le réenregistrer correctement:

 wp_register_script( 'jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js');

C'est ici que se trouve le problème. Ce qui précède provient du codex . La version de jQuery ci-dessus est maintenant obsolète et pourrait éventuellement endommager les plug-ins. C'est pourquoi les thèmes et les plug-ins doivent éviter de remplacer la version de jQuery.

Le thème ci-dessus est une magnifique démonstration de mauvaise pratique. Non seulement il ne ré-enregistre pas correctement jQuery, mais il l'imprime ensuite directement dans l'en-tête (quel que soit le moment où il est requis).

En réponse à:

Je me demande donc, en incluant les balises de script qui chargent jQuery dans le fichier header.php, cela signifie-t-il que WordPress en est conscient au moment d'appeler wp_register_script?

Non.

Je demande parce que je voulais essayer cette technique mais je n'ai pas obtenu les résultats escomptés. À savoir, les javascripts que j'ai inclus en utilisant wp_enqueue et qui dépendaient de jQuery toujours chargé même lorsque j'ai supprimé les balises de script qui les incluent dans l'en-tête, ce qui signifie que les javascripts que j'ai chargés ont échoué car aucun jQuery n'était chargé.

Oui, WordPress pensait que jQuery était en cours de chargement (mais en réalité, '' a été passé comme chemin du fichier - cela aurait probablement dû causer une erreur.). Par conséquent, vos scripts étaient toujours chargés, même lorsque jQuery n'était pas réellement chargé.

wp_register_script (et les fonctions associées) existent pour charger javascript, tout en gérant les dépendances, de manière sans conflit. Ne pas l'utiliser, comme ce thème tente de le faire, casse les choses.

8
Stephen Harris