この記事は1年以上前に書かれました。
内容が古くなっている可能性がありますのでご注意下さい。
内容が古くなっている可能性がありますのでご注意下さい。
WordPressの投稿や固定ページにOpenStreetMapの地図を貼り付けるためのプラグイン、Embed OSMのバージョン0.2では、プラグインに関する設定値をWordPressのテーブルに保存できるようにしました。そこで、設定値を変更するための管理画面が欲しくなるところですが、その前に、バージョン0.3ではちょっとした改善を施します。
1つめは、クラス化です。プラグインをクラスで定義することによって、他のプログラムとの関数名の重複を防ぐことができます。
2つめは、地図を貼り付ける<div>のIDです。
<div id="mapdiv" ...
と、固定的なIDを割り当てているため、結果として1つのページに1つの地図しか貼り付けられない仕様になってしまいました。
それでは不便ですので、<div>を出力する都度、動的にユニークなIDを割り当てるように修正します。
バージョン0.3のembed-osm.phpの完全なリストは以下のとおりです。
<?php /* Plugin Name: Embed OSM Plugin URI: http://midoriit.com/works/embed-osm.html Description: Embed OpenStreetMap on the page. Version: 0.3.1 Author: Midori IT Office Author URI: http://midoriit.com/ License: GPL3 */ $embedosm = new EmbedOSM(); class EmbedOSM { public function __construct() { register_activation_hook( __FILE__, array(&$this,'embed_osm_activate' )); register_uninstall_hook( __FILE__, 'EmbedOSM::embed_osm_uninstall' ); add_shortcode('embed_osm', array(&$this, 'embed_osm_handler')); } public function embed_osm_activate() { add_option('embed_osm_width', '400'); add_option('embed_osm_height', '300'); } public static function embed_osm_uninstall() { delete_option('embed_osm_width'); delete_option('embed_osm_height'); } public function embed_osm_handler( $atts ) { $width = get_option('embed_osm_width'); $height = get_option('embed_osm_height'); $uniq = uniqid("",1); extract( shortcode_atts( array( 'lon' => '0', 'lat' => '0', 'zoom' => '1'), $atts ) ); return ' <div id="mapdiv'.$uniq.'" style="width:'.$width.'px; height:'.$height.'px;"></div> <script type="text/javascript" src="'.plugins_url().'/embed-osm/openlayers/OpenLayers.js"></script> <script type="text/javascript"> var map = new OpenLayers.Map("mapdiv'.$uniq.'"); map.addLayer(new OpenLayers.Layer.OSM()); var lonLat = new OpenLayers.LonLat('.$lon.' , '.$lat.').transform( new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject() ); map.setCenter(lonLat, '.$zoom.'); var markers = new OpenLayers.Layer.Markers("Markers"); map.addLayer(markers); var marker = new OpenLayers.Marker(lonLat) markers.addMarker(marker); </script> <small> <a href="http://www.openstreetmap.org/?mlat='.$lat.'&mlon='.$lon.'#map='.$zoom.'/'.$lat.'/'.$lon.'" target="_blank">大きな地図を表示</a> </small>'; } } ?>
ヘッダコメントの次の
$embedosm = new EmbedOSM();
は、プラグインのクラスEmbedOSMのインスタンスを作成しています。
残りのコードでEmbedOSMクラスを定義していますす。
コンストラクタ
public function __construct() { register_activation_hook( __FILE__, array(&$this,'embed_osm_activate' )); register_uninstall_hook( __FILE__, 'EmbedOSM::embed_osm_uninstall' )); add_shortcode('embed_osm', array(&$this, 'embed_osm_handler')); }
では、プラグイン有効化/プラグイン削除のフック関数、[embed_osm]ショートコードのハンドラを登録しています。クラス化する前は単に関数名を渡していたregister_activation_hook()とadd_shortcode()の第2引数が、インスタンスとメソッド名のarrayになっている点に注意して下さい。さらに、register_uninstall_hook()の第2引数は「クラス名::メソッド名」の形式となっていますが、これは、uninstallのフック関数がstaticメソッドのためです。
ショートコードを処理する関数embed_osm_handler()は、<div>のIDが重複しないように修正してあります。まず、PHPのuniqid()関数を用いて
$uniq = uniqid("",1);
ユニークなIDを取得し、
<div id="mapdiv'.$uniq.'" style="width:'.$width.'px; height:'.$height.'px;"></div>
このIDを用いてユニークなIDを持つ<div>を定義し、
var map = new OpenLayers.Map("mapdiv'.$uniq.'");
そこに地図を貼り付けています。
これで、1つのページにいくつ地図を貼り付けても大丈夫です。
[embed_osm lat="35.32395" lon="139.55598" zoom="14"]大きな地図を表示
[embed_osm lat="35.32395" lon="139.55598" zoom="16"]大きな地図を表示
[embed_osm lat="35.32395" lon="139.55598" zoom="18"]大きな地図を表示
今回作成したプラグインのダウンロードはこちらからどうぞ。