2

使用 API vs3 创建谷歌地图插件?嗨,编码员!在网上搜索了几个小时后,找不到关于将新版本 3 功能集成到 wordpress 站点的权威文章。这是我希望实现的目标......

1.) 创建一个插件,通过简单的帖子元在管理员中收集“国家名称”。2.) 地图将对国家名称进行反向地理编码,拉取该谷歌地图的适当缩放版本 3.) 向谷歌地图的管理员提供预览

所以首先,这里有一个我们想要的静态文件的工作示例:http: //simondelasalle.com/file_drop/google-map-example.htm

一切都好...将画布拉到正确的尺寸,放大它...甜美。如果你调出源代码,你会注意到我已经通过取出正文 onload 并替换为 window.onload = loadScript; 为 wordpress 集成做了一些准备。

这几乎可以工作,但确实需要一些帮助微调。

1 Admin Box Heres 用于更新国家和在管理员中预览谷歌地图的管理元框。*note 下面不包括更新字段本身的功能。

'

// add meta box
add_action( 'add_meta_boxes', 'post_map' );

// add meta box to post type
function post_map() {
    add_meta_box( 
        'post_map_tab',
        __( 'Map', 'post_textdomain' ),
        'map_tab_box',
        'post' 
    );
}

// print box content
function map_tab_box( $post ) {
    // Use nonce for verification
    // wp_nonce_field( plugin_basename( __FILE__ ), 'post_map_noncename' );
    // The actual fields for data entry
    ?>
    <table border="0" align="center" cellpadding="5" cellspacing="0" class="customfieldtable">

      <tr>
        <td align="right">Country or Region<br />
    (This is to GeoCode Map the location using Google)</td>
        <td><input name="geoecode_country" type="text" value="<?php echo get_post_meta($post->ID, 'geoecode_country', true); ?>" size="30" /></td>
        <td rowspan="3">&nbsp;</td>
        <td width="400" rowspan="4" valign="top">
        Please enter country and update to preview Google Map
        <div id="mapcanvas" sty></div>
      </tr>

    </table>

    <?php
}

'

2 在你的插件 CSS 中添加样式

`

#map_canvas {
    width: 400px;
    height: 400px;
}

`

3 在头部加载必要的脚本以在管理页面中预览(为您的插件和 API 密钥自定义占位符)。这与 admin_head 挂钩,因此我们可以用动态值替换

'

    function print_google_map_script() {

        // we could load conditionally by page if we want here
        global $post;
            $geoecode_country = get_post_meta($post->ID, 'geoecode_country', true);
        ?>

        <script type='text/javascript'>

              var geocoder;
              var map;
              var query = '<?php echo $geoecode_country; ?>';
              function initialize() {
                geocoder = new google.maps.Geocoder();
                var mapOptions = {
                  zoom:3,
                  mapTypeId: google.maps.MapTypeId.ROADMAP
                }
                map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);
                codeAddress();
              }

              function codeAddress() {
                var address = query;
                geocoder.geocode( { 'address': address}, function(results, status) {
                  if (status == google.maps.GeocoderStatus.OK) {
                    map.setCenter(results[0].geometry.location);
                    var marker = new google.maps.Marker({
                        map: map,
                        position: results[0].geometry.location
                    });
                  } else {
                    alert('Geocode was not successful for the following reason: ' + status);
                  }
                });
              }

              function loadScript() {
                var script = document.createElement("script");
                script.type = "text/javascript";
                script.src = "http://maps.googleapis.com/maps/api/js?key=YOUR_API&sensor=false&callback=initialize";
                document.body.appendChild(script);
                }

              window.onload = loadScript;   

        </script>
        <?php

    }

     add_action('admin_head', 'print_google_map_script');

'

离工作太近了,很痛苦。所以地图加载有点......如果你坐在那里刷新几次,它似乎最终会起作用。但是,当您第一次加载编辑帖子页面时,您会在画布内看到地图,以及不正确的缩放级别。这是一个屏幕: http ://www.simondelasalle.com/file_drop/screen.jpg

也许脚本的加载方式?API 似乎没有识别画布宽度。

您可以提供的任何建议或反馈将不胜感激

谢谢!

S。

4

1 回答 1

0

问题是元框被添加到页面并在地图绘制后显示(因此给定宽度/高度)。页面加载后,您需要告诉地图刷新:

$(window).load(function() {
    google.maps.event.trigger(map, "resize");
});

更糟糕的是,元框可能会被用户隐藏,然后再显示;例如,他们可能会在编辑一个页面/帖子时隐藏元框,然后在编辑另一个页面/帖子时显示它。幸运的是,WP 提供了一个钩子,让您知道何时显示元框,因此您也可以处理它:

postboxes.pbshow = function() {
    google.maps.event.trigger(map, "resize");
};
于 2012-12-01T09:40:16.500 回答