web-dev-qa-db-ja.com

余分なGoogleマップスクリプトを削除する

Google Maps APIを使用したプラグインを開発しています。このようにしてプラグインをエンキューするスクリプトは次のとおりです。

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

$handleは異なる可能性がありますが、他のプラグイン/テーマが同じマップライブラリを使用する可能性があるという事実を考慮すると、wp_script_is($handle,'registered')の検証は意味がありません。エンキューされたスクリプトを複製するとJSエラーが発生します。You have included the Google Maps API multiple times on this page. This may cause unexpected errors.

説明されていることに関して、私はGoogleマップスクリプトのために$wp_scriptsを検索するコードを作成し、見つかった場合はそれを設定解除します。

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]);
    }
}

問題は、削除したスクリプトの依存関係を確認して再割り当てする方法(他のプラグインやテーマで設定されている場合)を確認することです。複数のプラグインがGoogle Maps APIスクリプトの同じ&callback=initializeパラメータを使用する可能性があることとその処理方法について説明します。

5
Ignat B.

編集: 必要に応じてwp_enqueue_scriptを使用し(jQueryの後にヘッダーまたはフッターにエンキュー)、次のような名前のファイルをエンキューします。gmap.jsはプラグインに含まれています

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

これをあなたの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

それについて強調しないでください。プラグインとテーマがお互いを壊すことができる多くの方法があります、そして、すべてが同じ実行スペース/コンテキストで起こるときあなたはそれを避けることができません。

あなたがあなたのコードがうまく動作することを確かめたいと思うどんなプラグインやテーマに対してもテストするべきですが、あらゆる時点でみんなを幸せにする方法はありません。実際には、あなたのエンキューが他のものよりも優先されるべきであると決めるのはあなたの側からの一種の傲慢です....

4
Mark Kaplun

すでにキューに入っているスクリプトを削除するのではなく、答えを組み合わせてGoogle Mapsスクリプトをチェックし、@Kikiが推奨するJavaScriptチェックにフォールバックを追加することができます。

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