Pour l’un des sites que j’ai crée, j’utilise l’extension wp Time Machine pour réaliser des sauvegardes du site via Dropbox, Amazon’s S3, ou FTP. Or, la dernière version 1.9.21 arrive avec un petit bug empêchant jQuery de fonctionner. Voici comment réparer ceci.
¿Que pasa?
En regardant la fonction qui insère le javascript dans le head de l’administration, je me suis aperçu que le plugin utilise ses propres scripts plutôt que ceux de WordPress, comme jQuery lui-même ou jQuery UI par exemple, mais là n’est pas le problème. Enfin si, mais pas exactement, c’est juste que le développeur du plugin a oublié un détail qui a son importance en le faisant :
873
wp_register_script( 'jquery-ui-core', 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/jquery-ui.min.js' );
Si on se réfère au codex, wp_register_script() peut prendre (optionnellement) d’autres paramètres :
1
wp_register_script( $handle, $src, $deps, $ver, $in_footer );
Ici, ‘$handle’ est le « nom » du script, et ‘$src’ son url. Le paramètre très important mais oublié est ‘$depts’, il indique les « dépendances » d’un script. Pour faire plus clair, si un script ne peut pas fonctionner sans qu’un autre soit chargé avant lui, c’est là qu’on l’indique. Et c’est le cas, jQuery UI ne peut pas fonctionner sans jQuery.
Do not forget me!
Vous avez donc compris en quoi consiste cette petite réparation. Nous allons en profiter pour rectifier le tir sur tous les autres scripts puisque eux aussi dépendent de jQuery. Pour la peine, je rajoute le paramètre ‘$ver’ qui est la version du script, et qui n’est absolument pas obligatoire. Notez que ‘$depts’ doit être un array().
Ce code est à mettre dans le fichier functions.php de votre thème (pas besoin de modifier le plugin).
0102030405060708091011121314151617181920212223242526272829
function sf_wpTimeMachine_enqueue_scripts() {
wp_deregister_script( 'jquery' );
wp_register_script( 'jquery', 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js', false, '1.6.2');
wp_enqueue_script( 'jquery' );
wp_deregister_script( 'jquery-ui-core' );
wp_register_script( 'jquery-ui-core', 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/jquery-ui.min.js', array('jquery'), '1.8.4' );
wp_enqueue_script( 'jquery-ui-core' );
wp_deregister_script( 'jquery-form' );
wp_register_script( 'jquery-form', wpcontent_url . '/plugins/wp-time-machine/javascript/jquery.form.js', array('jquery'), '2.43' );
wp_enqueue_script( 'jquery-form' );
wp_register_script( 'jquery.validate', wpcontent_url . '/plugins/wp-time-machine/javascript/jquery.validate.js', array('jquery'), '1.8.1' );
wp_enqueue_script( 'jquery.validate' );
wp_register_script( 'jquery.fadeSliderToggle', wpcontent_url . '/plugins/wp-time-machine/javascript/jquery.fadeSliderToggle.js', array('jquery') );
wp_enqueue_script( 'jquery.fadeSliderToggle' );
wp_register_script( 'jquery.simplemodal-1.3.5.min', wpcontent_url . '/plugins/wp-time-machine/javascript/jquery.simplemodal-1.3.5.min.js', array('jquery'), '1.3.5' );
wp_enqueue_script( 'jquery.simplemodal-1.3.5.min' );
}
if ( function_exists( 'wpTimeMachine_init' ) ) {
remove_action('admin_enqueue_scripts', 'wpTimeMachine_enqueue_scripts');
if ( isset($_GET['page']) && $_GET['page'] == 'wpTimeMachineCore.php' )
add_action('admin_enqueue_scripts', 'sf_wpTimeMachine_enqueue_scripts');
else
remove_action('admin_head','wpTimeMachine_head');
}
Avec ce code, nous créons une fonction sf_wpTimeMachine_enqueue_scripts() identique à l’originale, mais avec les paramètres ‘$depts’ et ‘$ver’ en plus. Ensuite, si le plugin est bien activé, nous enlevons l’action originale. Pour la suite je rajoute une petite modification : avec if ( isset($_GET['page']) && $_GET['page'] == 'wpTimeMachineCore.php' )
nous vérifions si nous sommes sur la page du plugin. Si c’est le cas, nous ajoutons alors nos scripts (ils sont inutiles dans les autres pages, alors pourquoi les charger partout?!). Sinon, nous supprimons le css chargé par le plugin (le plugin utilise un fichier css pour styler sa page, sur les autres pages de l’administration, le css est inutile).
Conclusion
Un petit oubli qui a ses conséquences, mais fort heureusement, facilement réparable. En plus, cela nous a permis d’empêcher le chargement des scripts et css en dehors de la page du plugin, histoire de ne pas ralentir l’administration de WordPress pour rien.
NOTA : n’oubliez pas de supprimer ce bout de code lors de la prochaine mise à jour du plugin ;) (enfin, si son développeur corrige le tir)
Oh, wait!
Vous n’utilisez pas ce plugin et il vous semble intéressant? Vous n’avez pas de Dropbox (qui pourtant est un service très pratique)? Vous ne savez pas comment me remercier pour tous ces super tutos?
Alors gagnons 250Mo supplémentaires sur Dropbox avec mon parrainage! ;)
See ya!
Commentaires
Commentaire de Hadrien01.
Ce que je ne comprends pas, c’est comment l’erreur est arrivée la. Ce n’est pas un nouveau code, non ?
(PS : on dit ¿ Que pasa ?)
Commentaire de Greg.
Je viens de regarder dans la précédente version et le dev a changé la façon dont il insère les scripts. Avant il faisait simplement avec des echo :
1
Il a donc changé pour une méthode plus propre, mais avec des erreurs ;) Ça arrive :)
(PS : merci, c’est corrigé)