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関数を入れて止めてデータベースの値を見たらちゃんと登録されていたので、おそらくそうなんだと思います。
ちゃんと理解する必要はありますが、何はともあれ、無事にやりたいことができて良かった〜。