有没有办法在单个Google地图上显示我的所有帖子?


9

我想对所有帖子进行“地理标记”,然后将它们显示在一张Google地图上。


3
我认为您可以通过阅读“ 显示标记帖子地图的最佳方法? ” 的答案来解决此问题。如果您在阅读完该问题后仍无法解决问题,请编辑问题以阐明尝试过的方法和无效的方法。
1

Answers:


11

无需任何插件即可执行此操作,您只需要Google Maps API即可

请注意,如果您打算在一个页面上放置20个或更多标记,则必须使用坐标而不是地址来对帖子进行地理定位。

要保存地址中的坐标,您可以:

  1. 手动使用服务(类似这样
  2. 创建或更新帖子时,可通过WP管理员致电Google地图地理编码

如何实现第二个选项与该问题并不严格相关,我的回答也不会考虑到它,但是请参阅此Maps API示例,以了解从地址中检索坐标有多简单。

因此,我将在此答案中假设帖子具有一个自定义字段“ coords”,其中坐标存储为两个逗号分隔值的字符串,例如:'38.897683,-77.03649'

我还假设文件“ page-google-map.php”中保存了一个页面模板。

将以下代码放入 functions.php

add_action( 'wp_enqueue_scripts', 'enqueue_gmap' );

function enqueue_gmap() {
    // script goes only in the map page template
    if ( ! is_page_template('page-google-map.php') ) return;

    wp_register_script( 'google-maps-api', '//maps.google.com/maps/api/js?sensor=false', false, false );
    wp_register_script( 'posts_map', get_template_directory_uri().'/js/mygmap.js', false, false, true );
    wp_enqueue_script( 'google-maps-api' );
    wp_enqueue_script( 'posts_map' );

    // use a custom field on the map page to setup the zoom
    global $post;
    $zoom = (int) get_post_meta( $post->ID, 'map_zoom', true );
    if ( ! $zoom ) $zoom = 6;

    $map_data = array( 
        'markers' => array(), 
        'center'  => array( 41.890262, 12.492310 ), 
        'zoom'    => $zoom,
    );
    $lats  = array();
    $longs = array();

    // put here your query args
    $map_query = new WP_Query( array( 'posts_per_page' => -1, ) );

    // Loop
    if ( $map_query->have_posts() ) : 
        while( $map_query->have_posts() ) : $map_query->the_post();
            $meta_coords = get_post_meta( get_the_ID(), 'coords', true );
            if ( $meta_coords ) {
                $coords = array_map('floatval', array_map( 'trim', explode( ",", $meta_coords) ) );
                $title = get_the_title();
                $link  = sprintf('<a href="%s">%s</a>', get_permalink(), $title);
                $map_data['markers'][] = array(
                    'latlang' => $coords,
                    'title'   => $title,
                    'desc'    => '<h3 class="marker-title">'.$link.'</h3><div class="marker-desc">'.get_the_excerpt().'</div>',
                );
                $lats[]  = $coords[0];
                $longs[] = $coords[1];
            }
        endwhile;
        // auto calc map center
        if ( ! empty( $lats ) )
            $map_data['center'] = array( 
                ( max( $lats ) + min( $lats ) ) /2,
                ( max( $longs ) + min( $longs ) ) /2 
            );
    endif; // End Loop

    wp_reset_postdata;
    wp_localize_script( 'posts_map', 'map_data', $map_data );
}

如您所见,在地图页面模板中,

  • 谷歌地图API脚本
  • mygmap.js位于主题的“ js”子文件夹中的脚本

同样,循环帖子,我填充一个数组,$map_data并使用wp_localize_script此数组传递给页面中的js。

现在,mygmap.js将包含:

function map_initialize() {
    var map_div     = document.getElementById( 'map' );
        map_markers = map_data.markers,
        map_center  = new google.maps.LatLng( map_data.center[0], map_data.center[1] ),
        map_zoom    = Number( map_data.zoom ),
        map         = new google.maps.Map( document.getElementById( 'map' ), {
            zoom      : map_zoom,
            center    : map_center,
            mapTypeId : google.maps.MapTypeId.ROADMAP
        } );

    if ( map_markers.length ) {
        var infowindow = new google.maps.InfoWindow(),
            marker, 
            i;
        for ( i = 0; i < map_markers.length; i++ ) {  
            marker = new google.maps.Marker( {
                position : new google.maps.LatLng(
                    map_markers[i]['latlang'][0], 
                    map_markers[i]['latlang'][1]
                ),
                title    : map_markers[i]['title'],
                map      : map
            } );
            google.maps.event.addListener( marker, 'click', ( function( marker, i ) {
                return function() {
                    infowindow.setContent( map_markers[i]['desc'] );
                    infowindow.open( map, marker );
                }
            } )( marker, i ) );
        }
    }
};
google.maps.event.addDomListener( window, 'load', map_initialize );

javascript与WP不相关,我在这里仅展示map_datavar 的用法。我不是js开发人员,并且代码或多或少完全是从这里获取的

就这样。只需创建页面模板,然后插入一个ID为'map'的div,就像这样:

<div id="map" style="width:100%; height:100%"></div>

当然,div可以使用CSS设置样式,请注意,标记的信息窗口也可以设置样式:在CSS中,用于h3.marker-title设置信息窗口标题和div.marker-desc内容的样式。

请注意,地图中心是自动计算的,如果要更改默认缩放比例,则必须在分配给地图页面模板的页面中放置自定义字段“ map_zoom”。

希望能帮助到你。


我有一个Geocoder插件,可以将带有刹车的坐标添加到自定义字段。例如。(37.983917, 23.729359899999963)我在哪里可以编辑代码,以便可以在周围使用带有刹车的坐标。我的尝试失败了。谢谢你的回答,尽管它很棒!
stemie 2015年

2
@stemie您可以更改$meta_coords = get_post_meta( get_the_ID(), 'coords', true );$meta_coords = trim(get_post_meta( get_the_ID(), 'coords', true ), '()');,当然可以替换coords为插件用来存储坐标的实际字段。
gmazzap

嗨,您好。我知道这已经很老了,但是我无法使用新的WordPress 4.2和新的Google Maps api来实现它。有没有人可以再次审查?谢谢。
cmsdeployed

我可以显示中心位置的地图,但是无法将其拉到我的帖子位置,并且当我查看代码视图时,我只能在生成的javascript中看到中心位置。可以在新的WordPress 4.2中使用吗?
cmsdeployed

老实说@ exedesign2,我不知道。我不碰这个代码的谷歌,因为现在很长一段时间..
gmazzap
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.