ENGINEERING&RUN

26.2マイルを走る僕の旅

WordPressでテンプレートからショートコードの引数を変数で実行する

なんだかわかりづらいタイトルになってしまったが、ハマっていたことがあったので備忘録として残す。

やりたかったこと

  • カスタムフィールドで設定した緯度経度の情報から、各記事にGoogleMapを追加したい
  • 特定のカテゴリーの全ての記事にGoogleMapを入れたい為、テンプレートファイルに地図表示処理を書きたい

対策

functions.phpにGoogleMap出力の関数を書き、テンプレートファイルからカスタムフィールドの緯度経度を引数として呼び出すことを検討。
ただ、Google Mapの埋め込みコードって意外と面倒だったりする。エンジニア失格なのかもだけど。
そこで今回はSimple Mapsを使うことに。

wordpress.org

これを使うことで、ショートコードのみでGoogle Mapを呼び出すことができる。
こんな感じ。
[map lat="37.77493" lng="-122.41942"]

これでカスタムフィールドの値をlat,lngに入れればOK。

ハマったこと

下記コードでGoogle Mapが出力されない!

<?php
// カスタムフィールドの緯度経度を変数に格納
$lat = post_custom("lat");        
$long = post_custom("long");
// 変数を引数にしてSimpleMapsのショートコードを実行
echo do_shortcode('[map lat="$lat" lng="$long"]'); 
?>

うーむ、なぜだろうと小一時間。むしろ細切れの時間でやっていた案件なので悩むこと数日。 超簡単なミスをしていた。

正解はこれ。

<?php
$lat = post_custom("lat");
$long = post_custom("long");
echo do_shortcode("[map lat=\"$lat\" lng=\"$long\"]"); 
?>

そう、''でショートコードを囲んでいたので変数展開がされなかった。
エスケープしとかないとね。

ちなみに今回、Rails側のCGMで作成されたデータをWordPressにDB連携し、記事化する」という要件を設計した。 マスターであるRails側のDBを日次バッチ処理でWP側に連携し、そこから各項目をカスタムフィールドに格納し、テンプレートで記事として展開するということをしている。
少し冗長な気はするが、昔COBOLで生保システムをつくっていたときのオンラインホストの連携処理からヒントを得た。
経験が役にたってよかった。