C'è un modo per visualizzare tutti i miei post su una singola mappa di Google?


Risposte:


11

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:

  1. utilizzare manualmente un servizio (qualcosa di simile a questo )
  2. chiama Google Maps geocoding dall'amministratore di WP quando crei o aggiorni il post

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

  • lo script API di google map
  • uno script chiamato mygmap.jssituato nella sottocartella "js" del tema

inoltre, eseguendo il loop dei post, popolo un array $map_datae, usando wp_localize_scriptquesto, passo questo array ai js nella pagina.

Ora mygmap.jsconterrà:

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_datavar. 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-titleper dare uno stile al titolo della finestra informativa e div.marker-descper 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.


Ho un plug-in geocoder che aggiunge le corde con le staffe attorno a loro in un campo personalizzato. Per esempio. (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!
Stemie

2
@stemie è possibile modificare $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 coordsal campo reale gli usi di plugin per le coordinate dei negozi.
gmazzap

Ciao. So che è piuttosto vecchio, ma non sono stato in grado di implementarlo con il nuovo WordPress 4.2 e il nuovo API di Google Maps. C'è qualcuno che può rivederlo? Grazie.
cmsdeployed

Sono in grado di visualizzare la mappa con la posizione centrale, ma non sono in grado di estrarre le posizioni dei miei post e quando visualizzo la vista in codice vedo solo la posizione centrale nel javascript che è stato prodotto. Funzionerà con il nuovo WordPress 4.2?
cmsdeployed

@exedesign2 onestamente, non ne ho idea. Non tocco questo codice su Google da molto tempo ormai.
gmazzap
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.