投稿時に住所から緯度経度をカスタムフィールドに設定する方法

スポンサーリンク

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&region=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関数を入れて止めてデータベースの値を見たらちゃんと登録されていたので、おそらくそうなんだと思います。

ちゃんと理解する必要はありますが、何はともあれ、無事にやりたいことができて良かった〜。