Vorrei "geotag" tutti i miei post e visualizzarli su una singola mappa di Google.
Vorrei "geotag" tutti i miei post e visualizzarli su una singola mappa di Google.
Risposte:
Puoi farlo senza alcun plug-in, devi solo l' API di Google Maps .
Tieni presente che se prevedi di avere 20 o più marker su una singola pagina, devi geolocalizzare i post utilizzando le coordinate e non gli indirizzi.
Per salvare le coordinate da un indirizzo puoi:
Come implementare la seconda opzione non è strettamente correlato alla domanda e non la terrò in considerazione per la mia risposta, ma vedi questo esempio di API di Maps per vedere quanto è semplice recuperare le coordinate da un indirizzo.
Così mi assumere in questa risposta che i posti sono 'coordinate' un campo personalizzato in cui le coordinate sono memorizzate come una stringa di due separati da virgole valori, someting come: '38.897683,-77.03649'
.
Suppongo anche che ci sia un modello di pagina salvato nel file 'page-google-map.php'.
Inserisci il seguente codice 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 );
}
Come puoi vedere, nel modello di pagina della mappa, accedo
mygmap.js
situato nella sottocartella "js" del temainoltre, eseguendo il loop dei post, popolo un array $map_data
e, usando wp_localize_script
questo, passo questo array ai js nella pagina.
Ora mygmap.js
conterrà:
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 );
Il javascript non è correlato al WP e lo metto qui solo per mostrare l'uso di map_data
var. Non sono uno sviluppatore js e il codice è più o meno interamente preso da qui
È tutto. Basta creare il modello di pagina e inserire un div con l'id 'map', qualcosa del tipo:
<div id="map" style="width:100%; height:100%"></div>
Ovviamente il div può essere disegnato con css, e nota che anche le finestre informative dei marker possono anche essere disegnate: nel css usa h3.marker-title
per dare uno stile al titolo della finestra informativa e div.marker-desc
per dare uno stile al contenuto.
Si noti che il centro della mappa viene calcolato automaticamente e se si desidera modificare lo zoom predefinito, è necessario inserire un campo personalizzato "map_zoom" nella pagina assegnata al modello di pagina della mappa.
Spero che sia d'aiuto.
(37.983917, 23.729359899999963)
dove posso modificare il codice in modo che possa usare le corde con le parentesi attorno ad esse. Il mio tentativo è fallito. Grazie per questa risposta, anche se è fantastico!
$meta_coords = get_post_meta( get_the_ID(), 'coords', true );
a $meta_coords = trim(get_post_meta( get_the_ID(), 'coords', true ), '()');
e, naturalmente, sostituire coords
al campo reale gli usi di plugin per le coordinate dei negozi.