web-dev-qa-db-fra.com

Chargement/déchargement de script WordPress - wp_deregister_script ('jquery')

J'ai quelques questions relatives au chargement/déchargement de WordPress dans les outils javascript. Après avoir lu une réponse bien écrite à une question de Pieter Goosen, cela m’a amené à étudier un peu et à nettoyer le code que j’utilise pour charger mes bibliothèques. Ce code provient du fichier function.php de mon thème enfant. J'ai quelques fonctions sur mon site qui utilisent les outils de calendrier datepicker. De plus, il existe quelques plugins qui, j'en suis sûr, utilisent jQuery.

function jquery_loadup() {
        //wp_deregister_script('jquery');    <--- ?H
        wp_enqueue_script('jquery');
        //wp_enqueue_script('jquery-migrate');
        wp_enqueue_script('jquery-ui-core');
        wp_enqueue_script('jquery-ui-datepicker');
        wp_enqueue_style('jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css');
}
add_action('wp_enqueue_scripts','jquery_loadup');

J'avais l'impression que la ligne wp_deregister_script('jquery') réinitialise/efface toutes les 'demandes' précédentes pour les scripts jQuery afin qu'ils ne se gênent pas. Cette ligne suivie de wp_enqueue_script('jquery'); devrait aboutir à une charge propre minimale de jQuery via les scripts WordPress couramment utilisés, enregistrés par le système et le système de chemins de script, non? Je pense que l’appel de désenregistrement teste la présence d’une précédente "installation" pour jQuery, et si elle en trouve une ou plusieurs, arrête leur chargement, si aucune n’est enregistrée, ne fait rien.

Ce que je constate, c’est que lorsque j’utilise la fonction wp_deregister_script('jquery'), une erreur s’ajoute à la websie "ReferenceError: jQuery is not defined". Lorsque cela se produit, toutes mes fonctions JavaScript échouent. Que diable? Lorsque remarqué, le site fonctionne bien.

Questions: Est-ce que je manque quelque chose? Qu'est-ce que je ne comprends pas à propos de l'annulation de l'appel? Pourquoi devrais-je recevoir un message d'erreur?

Notez que la ligne ici pour jquery-migrate est supposée être destinée aux logiciels utilisant des versions plus anciennes de jQuery. Je l'ai testé, mais je ne vois pas qu'il fait quoi que ce soit sur mon site. Je l'ai donc sorti pour améliorer les temps de téléchargement et de réponse. Question: Est-ce une mauvaise idée?

références:

2
zipzit

Wordpress a essentiellement deux groupes de méthodes pour gérer les scripts, qui doivent tous deux être utilisés:

  • wp_register_script Enregistre un script dans Wordpress. Il n'est pas appelé, il est uniquement disponible pour Wordpress, si nécessaire.
  • wp_deregister_script est l'exact opposé. Il supprime les définitions effectuées dans wp_register_script, le script n'est plus disponible en tant que dépendance ou pour la mise en file d'attente.

Les scripts enregistrés ne génèrent rien dans le code. Ils définissent simplement le script par programmation afin que WP puisse réagir aux dépendances et aux mises en file d'attente.

  • wp_enqueue_script définit et met en file d'attente un script à afficher dans l'en-tête/le pied de page de la page HTML.
  • wp_dequeue_scriptde l'exact opposé et met en file d'attente un script pour la sortie.

L'impression réelle se produit sur l'action 'wp_head' ou 'wp_footer', en fonction des détails du registre.

Un exemple:

wp_deregister_script('jquery');
wp_register_script('jquery', ("https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"), false, '1.9.1', true);

wp_enqueue_script( 'script-1', get_template_directory_uri() . '/js/example1.js', array('jquery'), '1.0.0', false );
wp_enqueue_script( 'script-2', get_template_directory_uri() . '/js/example2.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-3', get_template_directory_uri() . '/js/example3.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-4', get_template_directory_uri() . '/js/example4.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-5', get_template_directory_uri() . '/js/example5.js', array('jquery'), '1.0.0', true );

Dans cet exemple, je désenregistre jQuery. Ce n'est plus disponible et j'obtiendrais la même erreur que vous, si je ne l'enregistrais pas à nouveau. (Cette fois, à partir du CDN de Google, j'espère que ma page sera plus rapide.)

Mais à la troisième ligne, jQuery ne sera pas imprimé. Il n'apparaîtra nulle part. Mais à partir de la quatrième ligne, j’appelle un tas de scripts, qui ont tous jquery comme dépendance. Le premier réside dans l'en-tête, tous les autres dans le pied de page. En raison des dépendances, jQuery est automatiquement mis en file d'attente dans l'en-tête, car il en a d'abord besoin.

Ainsi, avec le système de scripts de Wordpress, qui est assez solide, il n’est pas nécessaire de gérer les interférences ou les requêtes précédentes. Les scripts enregistrés sont appelés lorsque cela est nécessaire, et uniquement lorsque cela est nécessaire.

Dans votre exemple, vous annulez l'enregistrement du script à la ligne 1 de la fonction et appelez-le à nouveau à la ligne 2. Mais, en raison de l'annulation de l'enregistrement, Wordpress a oublié tous les détails tels que l'URL, la version, les dépendances, etc. La fonction correcte dans votre logique aurait été wp_dequeue_script, mais même cela n'est pas nécessaire. Wordpress évalue le besoin en consultant les scripts mis en file d'attente ou les dépendances.

Modifier:

comment wordpress sait-il comment arrêter le désordre laissé par 8 plugins différents essayant tous d'ajouter différentes versions de jQuery?

La dernière instance d’enregistrement de jquery avant l’action wp_print_scripts est celle qui est imprimée. C’est essentiellement à cela que sert le système de priorités en actions/filtres.

3
Hendrik Luehrsen

Juste pour participer, tout d’abord, merci pour le complément, apprécié.

Vous utilisez un thème enfant, dont le thème parent devrait avoir a mis en file d'attente la bibliothèque jQuery intégrée à wordpress. Comme je l'ai dit dans le message auquel vous faites référence, il est déconseillé d'inscrire un thème parent à ne pas mettre en file d'attente jquery par défaut.

Vous avez quelques problèmes avec votre code. Tout d’abord, ne désenregistrez jamais la bibliothèque jQuery par défaut, vous en ferez des dégâts plus tard. La méthode correcte consiste à retirer le script du script à l’aide de wp_dequeue_scripts .

Juste une question ici, pourquoi avez-vous besoin de retirer de la file d'attente et de la remettre en file d'attente? Ceci est généralement utilisé par les auteurs de plugins pour s'assurer que jquery ne se charge pas deux fois. La raison étant ici, les plugins fonctionnent sur tous les thèmes. Il est donc impossible de savoir si le thème qu'un utilisateur utilise avec le plugin a chargé jquery. Vous exécutez un thème enfant qui ne fonctionnera que sur ce thème parent spécifique. Vous saurez ainsi si jquery est chargé dans le thème parent. Il n'est donc pas nécessaire de retirer de la file d'attente et de la remettre en file d'attente.

Deuxièmement, vous devrez regarder en priorité. add_action a 4 paramètres, le troisième étant prioritaire ($priority). Généralement, les plugins et les thèmes enfants chargent leurs scripts après un thème parent afin de s’assurer qu’il ne sera pas surchargé plus tard. Il est donc sage et judicieux d’exercer votre action en dernier. Pour cela, vous aurez besoin d'une très faible priorité, c'est-à-dire d'un nombre très élevé.

  add_action( 'wp_enqueue_scripts', 'jquery_loadup', 999 );
2
Pieter Goosen