问题描述
我想”geotag” 我所有的帖子,并显示在一个 GoogleMap 上。
最佳解决方案
可以做到这一点没有任何插件,你只需要 Google Maps API 。
请注意,如果您计划在单个页面上有 20 个或更多的标记,则必须使用坐标而不是地址来定位帖子。
要从地址中保存坐标,您可以:
-
手动使用服务 (类似于 this)
-
在创建或更新帖子时,请致电 WP 管理员的 GoogleMap 地理编码
如何实现第二个选项与问题并不是完全相关的,我不会考虑我的答案,但是看到这个 Maps API example 可以看到从地址中检索坐标是多么简单。
所以我会假设在这个答案中,帖子有自定义字段’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 );
}
如你所见,在 Map 页面模板中,我排队
-
google map 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_data
var 。我不是一个 js 开发人员,代码或多或少完全取自 here
就这样。只需创建页面模板并使用 id ‘map’ 插入一个 div,就像:
<div id="map" style="width:100%; height:100%"></div>
当然,div 可以用 css 来设计,并注意标记的信息窗口也可以设置样式:在 css 中使用 h3.marker-title
来设置信息窗口标题和 div.marker-desc
的样式。
请注意,自动计算 Map 中心,如果要更改默认缩放,则必须在分配给 Map 页面模板的页面中放置自定义字段’map_zoom’ 。
希望它有帮助。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。