内容が古くなっている可能性がありますのでご注意下さい。
WordPressの投稿や固定ページにOpenStreetMapの地図を貼り付けるためのプラグイン、Embed OSMを開発します。
最初に作成するバージョン0.1は、以下のようなショートコード
[embed_osm lat="35.32395" lon="139.55598" zoom="16"]
を記述すると、指定された緯度、経度、ズームレベルの地図を表示するという簡単なものです。
地図の表示には、オープンソース(BSDライセンス)のJavaScriptライブラリOpenLayersを利用します。
WordPressのインストール先の、wp-content/pluginsフォルダに配置するファイルは以下のようにします。
embed-osm/embed-osm.php embed-osm/openlayers/OpenLayers.js embed-osm/openlayers/license.txt embed-osm/openlayers/img/* embed-osm/openlayers/theme/*
embed-osm.phpは、今回作成するプラグインの本体です。
openlayersフォルダの配下は、OpenLayersの配布物の一部をコピーしたものです。OpenLayersのプログラム本体であるOpenLayers.js、ライセンス情報を記したlicense.txt、imgフォルダとthemeフォルダの内容のすべてをコピーします。
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.1 Author: Midori IT Office Author URI: http://midoriit.com/ License: GPL3 */ function embed_osm_handler( $atts ) { extract( shortcode_atts( array( 'lon' => '0', 'lat' => '0', 'zoom' => '1'), $atts ) ); return ' <div id="mapdiv" style="width:400px; height:300px;"></div> <script type="text/javascript" src="'.plugins_url().'/embed-osm/openlayers/OpenLayers.js"></script> <script type="text/javascript"> var map = new OpenLayers.Map("mapdiv"); 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=16/'.$lat.'/'.$lon.'" target="_blank">大きな地図を表示</a> </small>'; } add_shortcode('embed_osm', 'embed_osm_handler'); ?>
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.1 Author: Midori IT Office Author URI: http://midoriit.com/ License: GPL3 */
は、PHPプログラムの開始タグと、コメントです。
このコメントには重要な意味があります。決められた作法に従ってコメントを記述することによって、WordPressの管理画面の「インストール済プラグイン」ページに以下のようにプラグイン情報が表示されるのです。
次に、embed_osm_handler()関数を定義します。この関数は、ショートコード[embed_osm]の処理をするハンドラです。
function embed_osm_handler( $atts ) { extract( shortcode_atts( array( 'lon' => '0', 'lat' => '0', 'zoom' => '1'), $atts ) );
[embed_osm]ショートコードには、緯度、経度、ズームレベルを表す3つの属性、lon、lat、zoomがあります。これらが、arrayの形でembed_osm_handler()関数に渡されます。
WordPressのshortcode_atts()関数は、無効な属性を取り除き、値の入っていない属性にはデフォルト値を設定します。
さらに、PHPのextract()関数を用いて、arrayの要素の1つ1つを変数に変換します。arrayのキー名が変数名になり、$lon、$lat、$zoomで参照できるようになります。
embed_osm_handler()関数の後半
return ' <div id="mapdiv" style="width:400px; height:300px;"></div> <script type="text/javascript" src="'.plugins_url().'/embed-osm/openlayers/OpenLayers.js"></script> <script type="text/javascript"> var map = new OpenLayers.Map("mapdiv"); 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>'; }
は、ページに埋め込むHTMLをreturn文で返しています。
まず最初に、地図を埋め込む領域を定義します。
<div id="mapdiv" style="width:400px; height:300px;"></div>
次に、OpenLayersのJavaScriptファイル、OpenLayers.jsを読み込むための<script>タグを返します。OpenLayers.jsは、プラグインのフォルダ内に配置しましたので、WordPressのplugins_url()関数を用いてパスを作成します。
<script type="text/javascript" src="'.plugins_url().'/embed-osm/openlayers/OpenLayers.js"></script>
return文の残りの部分では、OpenLayersを用いて地図を埋め込むためのJavaScriptコードと、別のウィンドウで地図を開くためのリンクを返していますが、説明は割愛します。
embed-osm.phpファイルの残り部分
add_shortcode('embed_osm', 'embed_osm_handler'); ?>
では、WordPressのadd_shortcode()関数を用いて、[embed_osm]ショートコードのハンドラとしてembed_osm_handler()関数を登録しています。
こうすることによって、投稿や固定ページの中で[embed_osm]ショートコードを記述すると、embed_osm_handler()関数によって処理された結果が出力されるようになります。
最後にPHPタグを閉じて終了です。
embed-osm.phpファイルではマルチバイト文字を使用していますので、ファイルを保存する際には文字コードに注意が必要です。バイト順マーク (BOM) なしのUTF-8(UTF-8Nと呼ばれることもあります)で保存する必要があります。
WordPressのインストール先の、wp-content/pluginsフォルダにembed-osmフォルダ以下をすべて配置してあれぱ、WordPressの管理画面の「インストール済プラグイン」ページにEmbed OSMプラグインが登録されていますので、有効化します。
あとは、投稿や固定ページにショートコードを記述すれば、指定した緯度、経度、ズームレベルの地図と、大きな地図へのリンクが表示されます。
[embed_osm lat="35.32395" lon="139.55598" zoom="16"]
と記述すると、以下のように表示されます。
大きな地図を表示
今回作成したプラグインのダウンロードはこちらからどうぞ。ライセンスは、ヘッダコメントに記述したとおり、GPL3です。(追記:バージョン0.9からはGPLv2 or laterとなりました)