มีวิธีแสดงโพสต์ของฉันทั้งหมดใน Google แผนที่เดียวหรือไม่?


9

ฉันต้องการ "ใส่แท็กตำแหน่ง" โพสต์ทั้งหมดของฉันและแสดงไว้ในแผนที่ Google เดียว


3
ฉันคิดว่าคุณสามารถแก้ไขคำถามนี้ได้โดยการอ่านคำตอบของ " วิธีที่ดีที่สุดในการแสดงแผนที่ของโพสต์ที่ติดแท็ก? " หากคุณไม่สามารถแก้ไขได้หลังจากอ่านคำถามนั้นแล้วโปรดแก้ไขคำถามของคุณเพื่อชี้แจงสิ่งที่คุณพยายามและสิ่งที่ใช้ไม่ได้
Jan Fabry

คำตอบ:


11

สามารถทำเช่นนี้ได้โดยไม่ต้องปลั๊กอินใด ๆ ที่คุณต้องการเพียงGoogle Maps API

โปรดทราบว่าหากคุณวางแผนที่จะมีเครื่องหมาย 20 เครื่องหมายขึ้นไปในหน้าเดียวคุณต้องระบุตำแหน่งทางภูมิศาสตร์โดยใช้พิกัดและไม่ใช่ที่อยู่

หากต้องการบันทึกพิกัดจากที่อยู่คุณสามารถ:

  1. ใช้บริการด้วยตนเอง (บางอย่างเช่นนี้ )
  2. โทร Google geocoding จากผู้ดูแลระบบ WP เมื่อคุณสร้างหรืออัพเดทโพสต์

วิธีใช้ตัวเลือกที่สองนั้นไม่เกี่ยวข้องกับคำถามอย่างเคร่งครัดและฉันจะไม่คำนึงถึงคำตอบของฉัน แต่ดูตัวอย่าง Maps APIนี้เพื่อดูว่าการดึงข้อมูลพิกัดจากที่อยู่นั้นง่ายเพียงใด

ดังนั้นผมจึงจะถือว่าในคำตอบนี้ว่าโพสต์มี 'coords' ฟิลด์ที่กำหนดเองที่พิกัดจะถูกเก็บไว้เป็นสตริงสองคั่นด้วยเครื่องหมายจุลภาค, someting '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 );
}

อย่างที่คุณเห็นในเทมเพลตหน้าแผนที่ฉันเข้าคิว

  • สคริปต์ 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 );

จาวาสคริปต์นั้นไม่เกี่ยวข้องกับ WP และฉันวางไว้ที่นี่เพื่อแสดงการใช้map_datavar เท่านั้น ฉันไม่ใช่นักพัฒนา js และรหัสถูกนำมาจากที่นี่มากหรือน้อย

นั่นคือทั้งหมดที่ เพียงสร้างเทมเพลตหน้าและใส่ div ด้วย id 'map' สิ่งที่ชอบ:

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

แน่นอน div สามารถจัดรูปแบบด้วย css และโปรดทราบว่าหน้าต่างข้อมูลของเครื่องหมายสามารถจัดรูปแบบได้เช่นกัน: ใน css ใช้h3.marker-titleเพื่อจัดรูปแบบหัวเรื่องของหน้าต่างข้อมูลและจัดdiv.marker-descรูปแบบเนื้อหา

โปรดทราบว่าศูนย์แผนที่จะคำนวณโดยอัตโนมัติและหากคุณต้องการเปลี่ยนการซูมเริ่มต้นคุณต้องใส่ฟิลด์ที่กำหนดเอง 'map_zoom' ในหน้าที่กำหนดให้กับเทมเพลตหน้าแผนที่

หวังว่ามันจะช่วย


ฉันมีปลั๊กอิน geocoder ที่เพิ่ม coords ด้วย brakets รอบ ๆ พวกเขาในฟิลด์ที่กำหนดเอง เช่น. (37.983917, 23.729359899999963)ฉันจะแก้ไขรหัสได้ที่ไหนเพื่อให้สามารถใช้ coords กับ brakets รอบ ๆ ได้ ความพยายามของฉันล้มเหลว ขอบคุณสำหรับคำตอบนี้ แต่มันยอดเยี่ยม!
stemie

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 ใหม่และ API แผนที่ใหม่ของ Google ได้ มีใครบ้างที่สามารถตรวจสอบได้อีกครั้ง? ขอบคุณ
cmsdeployed

ฉันสามารถแสดงแผนที่ด้วยตำแหน่งกึ่งกลาง แต่ฉันไม่สามารถดึงตำแหน่งของโพสต์ของฉันและเมื่อฉันดู codeview ฉันเห็นเฉพาะตำแหน่งกลางในจาวาสคริปต์ที่สร้างขึ้น มันจะใช้งานกับ WordPress 4.2 ใหม่ได้หรือไม่
cmsdeployed

@ exedesign2 โดยสุจริตฉันไม่มีความคิด ฉันไม่ได้แตะรหัสนี้กับ Google มานานแล้ว
gmazzap
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.