WordPressの投稿画面から公開(更新)ボタンを押した時に、カスタムフィールドに設定した住所から緯度・経度を取得して、カスタムフィールドに反映させたいことがありました。
すごくニッチかもしれませんが、一応記録を残しておきます。
このページの目次
前提条件
- 住所が入力されたカスタムフィールドがある
- 緯度、経度それぞれのカスタムフィールドの枠がある
ここでは、それぞれのカスタムフィールド名を下記のものであると仮定して話を進めていきます。
- 住所:address
- 緯度:lat
- 経度:lng
アクションフックを利用する
公開ボタンを押した時に処理を無理やり加えることになるので、WordPressのフックを使うことになります。
今回は、更新系の処理なのでアクションフックを利用します。
今回初めてフックを使ったので、実はまだあまり分かっていません^^; その辺りを考慮して読んで頂けるとありがたいです。
ソース(ちょっと微妙だけど)
add_action('wp_insert_post', 'geo_setting', 12, 1);
function geo_setting($post_ID) {
$post = get_post($post_ID);
if(get_post_meta($post->ID,'lat', true) == '' && get_post_meta($post->ID,'lng', true) == ''){
// GET用のパラメータ作成
$parametar = "?sensor=false®ion=jp&address=".urlencode(mb_convert_encoding(get_post_meta($post->ID,'address', true), 'UTF8', 'auto'));
$datas = file_get_contents('http://maps.googleapis.com/maps/api/geocode/json'.$parametar);
// JSONデータをPHPの値に変換する
$geo = json_decode($datas);
$status = $geo->status;
// エラー判定をして値を取得する
if($status == "OK"){
$results = $geo->results[0];
$geometry = $results->geometry;
$location = $geometry->location;
update_post_meta($post->ID, 'lat', $location->lat);
update_post_meta($post->ID, 'lng', $location->lng);
}
}
}
緯度経度を取得するプログラムは「[GoogleGEO] PHPを使って住所から経度と緯度を取得する方法」をほぼそのまま流用しています。ありがとうございます。
緯度経度がカスタムフィールドに設定されていない場合だけ、緯度経度を取得しにいっています。住所はカスタムフィールドに入力されている前提なので、住所をもとに、GoogleMapのAPIを検索しにいき、緯度経度を取得しています。
緯度経度が取得できれば、それぞれをupdate_post_meta関数を使ってカスタムフィールドに設定しました。
苦労したところ
最初、フックの関数をwp_insert_postではなく、publish_post(publish_[投稿タイプ名])にしていました。
publish_postで動かしてみると、結局空白のままというのがありました。
publish_postのあとに、カスタムフィールドの更新処理が動いているためだろうと思います。update_post_metaのあとにdie関数を入れて止めてデータベースの値を見たらちゃんと登録されていたので、おそらくそうなんだと思います。
ちゃんと理解する必要はありますが、何はともあれ、無事にやりたいことができて良かった〜。






