使用wp_enqueue_script加载Google Maps API

6

我正在尝试使用以下语法加载Google Maps API:

add_action('admin_enqueue_scripts', 'load_google_maps');

...

function load_google_maps()
{
  // The actual API key is configured in an options page
  $key = get_option('google_maps_api_key');
  $gmaps_url = 'http://maps.googleapis.com/maps/api/js?key=' . $key . '&sensor=false';
  wp_enqueue_script('google-maps', $gmaps_url, NULL, NULL);
}

WordPress正在将"&"转义为"&#038"。这实际上使得Google服务器拒绝请求。当我在浏览器地址栏直接输入带有"&sensor=false"的内容时,它可以正常加载。
我在WordPress跟踪系统中看到了一个类似的错误http://core.trac.wordpress.org/ticket/9243,但被视为无效,并且管理员回复请求者表明"&#038"方法是可行的。从Google的角度来看,这绝对不可行。
当然,我可以让函数将HTML作为脚本标记输出,但如果可能的话,我更愿意使用wp_enqueue_script系统。
有人知道解决方案吗?
干杯,
raff
1个回答

9

我们的代码中也有类似的内容,而且它运行得很好(即使编码为&#038)。我怀疑你的问题在于它被双重编码了,因为你已经使用了&。尝试将其更改为:

$gmaps_url = 'http://maps.googleapis.com/maps/api/js?key=' . $key . '&sensor=false';

就此而言,我们的(运作中)代码如下:

wp_register_script('googlemaps', 'http://maps.googleapis.com/maps/api/js?' . $locale . '&key=' . GOOGLE_MAPS_V3_API_KEY . '&sensor=false', false, '3');
wp_enqueue_script('googlemaps');

(在本例中,$locale 被设置为 hl=en)

编辑

看起来 WordPress 的最新版本行为已经改变 - 上述方法不再有效(但我会让那些使用旧版本的人知道它)。唯一的替代方案是添加一个 clean_url 过滤器,类似于下面这样:

add_filter('clean_url', 'so_handle_038', 99, 3);
function so_handle_038($url, $original_url, $_context) {
    if (strstr($url, "googleapis.com") !== false) {
        $url = str_replace("&", "&", $url); // or $url = $original_url
    }

    return $url;
}

这段代码看起来有点丑,但比直接输出脚本要好一些,因为它仍然使用 WordPress 的依赖管理。


抱歉回复慢了 - 我一直不在。非常感谢Hobo - 是的,就是这么简单。用&替换&完美解决了问题。 - codewithfeeling
调用Google Maps API,至少在3.X版本及以上,可以在URL中正确地使用&。 Google将十六进制代码转换回简单的&,然后再解析参数。您可以通过使用&代替&进行参数传递直接调用Google Maps API V3或使用Firefox + Firebug并查看您的脚本列表来验证此操作。 - Lance Cleveland
顺便说一下,我已经在Store Locator Plus的WordPress上使用Google Maps超过2年了。我强烈建议将sensor=false作为您的第一个参数。如果不这样做,某些主题会出现问题,因为它们会破坏URL过滤器并杀死第一个'&'之后的所有内容。需要sensor=true|false,所以将其放在第一位,您将减少许多主题/插件冲突。 - Lance Cleveland
只需在末尾添加'.&sensor=false',对我来说完美运行。 - Anupal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接