web-dev-qa-db-fra.com

Supprimer le script Google Maps supplémentaire

Je développe un plugin qui utilise une API Google Maps. Le script de mise en file d'attente du plugin de cette manière:

wp_enqueue_script('google-maps', 'http://maps.google.com/maps/api/js?sensor=false&callback=initialize&language=en-us', array('jquery'), false, true);

Considérant le fait que d'autres plugins/thèmes peuvent utiliser la même bibliothèque de cartes, alors que $handle pourrait être différent, la validation wp_script_is($handle,'registered') n'a pas de sens. La duplication du script mis en file d'attente entraîne une erreur JS: You have included the Google Maps API multiple times on this page. This may cause unexpected errors.

En ce qui concerne les choses décrites, j'ai construit un code qui, grâce à la recherche, pensait $wp_scripts pour les scripts Google Maps et le désactive, au cas où:

global $wp_scripts;
foreach ($wp_scripts->registered as $key => $script) {
    if (preg_match('#maps\.google(?:\w+)?\.com/maps/api/js#', $script->src)) {
        unset($wp_scripts->registered[$key]);
    }
}

La question qui se pose est la suivante: comment vérifier et réaffecter les dépendances des scripts supprimés (au cas où ils seraient définis par d'autres plugins/thèmes). Que se passera-t-il et comment gérer le fait que plusieurs plug-ins peuvent utiliser le même paramètre &callback=initialize du script API Google Maps.

5
Ignat B.

EDIT: utilisez wp_enqueue_script comme vous le souhaitez (mettre en file d'attente dans l'en-tête ou le pied de page après jQuery selon votre choix) pour mettre en file d'attente un fichier appelé quelque chose comme: gmap.js inclus dans votre plugin.

wp_enqueue_script('custom-gmap', plugin_dir_url( __FILE__ ).'inc/js/gmap.js', array('jquery'), false, true);//just change your path and name of file

écrivez ceci dans votre fichier Js :)

$(document).ready(function() {
    if (typeof google === 'object' && typeof google.maps === 'object') {
        return;
    }else{
        $.getScript( 'http://maps.google.com/maps/api/js', function() {});
    }
});

http://codepen.io/khaled-sadek/pen/WwvOGb

7
Kika

Ne stresse pas à ce sujet. Les plugins et les thèmes peuvent se briser de plusieurs façons et vous ne pouvez pas l'éviter lorsque tout se passe dans le même espace/contexte d'exécution.

Vous devriez tester tous les plugins et thèmes pour lesquels votre code fonctionne, mais il n’ya aucun moyen de rendre tout le monde heureux à chaque instant. En fait, c’est un peu prétentieux de votre part que de décider que votre file d’attente devrait avoir la priorité sur celle des autres ....

4
Mark Kaplun

Plutôt que de supprimer un script s'il a déjà été mis en file d'attente, vous pouvez combiner votre réponse pour rechercher le script Google Maps et ajouter la solution de secours au contrôle javascript suggéré par @Kiki ...

add_action('wp_enqueue_scripts','google_maps_script_loader',999);

function google_maps_script_loader() {
    global $wp_scripts; $gmapsenqueued = false;
    foreach ($wp_scripts->registered as $key => $script) {
        if (preg_match('#maps\.google(?:\w+)?\.com/maps/api/js#', $script->src)) {
            $gmapsenqueued = true;
        }
    }

    if ($gmapsenqueued) {
        wp_enqueue_script('custom-gmap', plugin_dir_url( __FILE__ ).'inc/js/gmap.js', array('jquery'), false, true);
    } else {
        wp_enqueue_script('google-maps', 'http://maps.google.com/maps/api/js?sensor=false&callback=initialize&language=en-us', array('jquery'), false, true);
    }
}
0
majick