背景: 私のクライアントは、(購入した機能豊富なテーマを使用して) 独自の WordPress サイトを構築しており、クライアントが望むカスタマイズを実現するために、必要に応じて子テーマを変更しています。テーマには、上部に全幅の Google マップを含むページ テンプレートが付属しており、テーマ オプション内で設定された単一の住所からマーカーを取得します。これは、1 つのメインの「お問い合わせ」ページに使用するためのものです。
クライアントのビジネスには複数の場所があり、各場所のページにそのような地図を含めたいと考えています。(例は以下にリンクされています。) 理想的な解決策は、Post のショートコード内で住所を指定し、マップ マーカーを設定できるようにすることです。
テーマがマップを作成する方法は次のとおりです ($mapAddress
はテーマ オプションのアドレスです)。
<?php
$mapAddress = ot_get_option( 'map_address' );
$mapHeight = ot_get_option( 'map_height' );
$mapContent = ot_get_option( 'map_content' );
?>
<section id="block-map-wrapper">
<div id="block-map" class="clearfix">
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=true"></script>
<script>
jQuery(document).ready(function(){
// Map Options
var mapOptions = {
zoom: 15,
scrollwheel: false,
zoomControl: true,
zoomControlOptions: {
style: google.maps.ZoomControlStyle.SMALL,
position: google.maps.ControlPosition.TOP_LEFT
},
mapTypeControl: true,
scaleControl: false,
panControl: false,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
// The Map Object
var map = new google.maps.Map(document.getElementById("map"), mapOptions);
var address = "";
var geocoder = new google.maps.Geocoder();
geocoder.geocode({ "address" : "<?php echo $mapAddress; ?>" }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
address = results[0].geometry.location;
map.setCenter(results[0].geometry.location);
var marker = new google.maps.Marker({
position: address,
map: map,
clickable: true,
animation: google.maps.Animation.DROP
});
var infowindow = new google.maps.InfoWindow({ content: "<?php echo $mapContent; ?>" });
google.maps.event.addListener(marker, "click", function() {
infowindow.open(map, marker);
});
}
});
});
</script>
<div id="map" class = "map" style = "width: 100%; height: <?php echo $mapHeight; ?>px"></div>
</div><!-- #block-map -->
<div class="shadow-bottom"></div>
</section><!-- #block-map-wrapper -->
これは、私が作成したカスタム ページ テンプレートを使用したテスト ページです。現在、上記と同じマップ コードを使用しています。(編集:以下の更新を参照してください。)
アドレス属性を取り、それを に設定するショートコードを作成しようとしましたが、うまくいき$mapAddress
ませんでした。ループが解析されるまでにマップが既に読み込まれているためだと思います。適切な住所を取得するために投稿に「戻ってくる」ようにマップに指示するにはどうすればよいですか?
私の専門は HTML と CSS ですが、Javascript はかなり簡単に混乱するので、実装を説明するときは明確にしてください。
ボーナス: さらなる目標は、場所の親ページにもそのようなマップを含めることですが、複数の場所を表す複数のマーカーを含めることです。複数の場所を取得する場合、Google マップは緯度/経度のみを受け入れます。クライアントに座標を気にしてほしくないので、ジオコーディング サービスで何かできることがあるとわかっているので、代わりにアドレスのリストを入力するだけで済みます (同じ、または同様の、クライアント用に開発されたショートコード ソリューションに)。私の主な質問)。しかし、私はそれを行う方法について非常に無知です。
アップデート
Brett の指摘に従って、テスト テンプレートを HTML のみに更新しました。
<section id="block-map-wrapper">
<div id="block-map" class="clearfix">
<div id="map" class = "map" style = "width: 100%; height: <?php echo $mapHeight; ?>px"></div>
</div><!-- #block-map -->
<div class="shadow-bottom"></div>
</section><!-- #block-map-wrapper -->
すべてのスクリプトをショートコードに追加しました。これは、投稿の冒頭で呼び出されます。テスト ページ (上記のリンク) で、Post に実際にスクリプトを記述している様子を確認できますが、マップは#map
div にレンダリングされていません。理由はありますか?