4. 位置情報をデータベースへ保存する
functions.php
・wp_driver_locationsテーブルにデータを保存する
<?php
function save_driver_location() {
if ( ! isset($_POST['save_location_nonce']) || ! wp_verify_nonce($_POST['save_location_nonce'], 'save_location_nonce_action') ) {
wp_die('Nonceが無効です');
}
global $wpdb;
$table_name = $wpdb->prefix . 'driver_location';
$latitude = sanitize_text_field($_POST['latitude']);
$longitude = sanitize_text_field($_POST['longitude']);
$accuracy = sanitize_text_field($_POST['accuracy']);
$driver_id = sanitize_text_field($_POST['driver_id']);
$data = array(
'driver_id' => $driver_id,
'latitude' => $latitude,
'longitude' => $longitude,
'accuracy' => $accuracy,
'timestamp' => current_time('mysql')
);
$format = array('%s', '%f', '%f', '%f', '%s');
$inserted = $wpdb->insert($table_name, $data, $format);
if ($inserted === false) {
wp_die('データの保存に失敗しました');
} else {
echo '位置情報が保存されました';
}
die(); // PHP終了
}
// WordPressのAjaxアクションをフックして保存処理を呼び出し
add_action('wp_ajax_save_location', 'save_driver_location');
add_action('wp_ajax_nopriv_save_location', 'save_driver_location');
?>
※Ajax用にfunctions.phpにjQueryを読み込んでおいたほうがいいかもしれない
/* jQueryの使用 */
function enqueue_my_scripts() {
wp_enqueue_script('jquery');
}
add_action('wp_enqueue_scripts', 'enqueue_my_scripts');
page-savelocation.php
・AjaxやWPRESTAPIの処理を書いたら保存できなかったので、formタグから位置情報を直接送信した
<?php get_header(); ?>
<main>
<div>
<p id="status">現在位置を取得中</p>
<p id="latitude">latitude:</p>
<p id="longitude">longitude:</p>
<p id="accuracy">accuracy:</p>
<p id="timestamp">timestamp:</p>
<?php wp_nonce_field('save_location_nonce_action', 'save_location_nonce'); ?>
<button id='startTracking'>startTracing</button>
<button id='stopTracking'>stopTracking</button>
</div>
<div id='map' style='height: 400px; width: 100%; margin: 20px 0;'></div>
<script>
// 地図や経路の初期化
let watchId = null;
let map;
let marker;
let path;
let locations = [];
const DRIVER_ID = '<?php echo wp_get_current_user()->ID; ?>'; // 現在のユーザーID
// Google Mapsの読み込み
function initMap() {
map = new google.maps.Map(document.getElementById('map'), {
zoom: 15,
center: { lat: 35.6812, lng: 139.7671 },
mapTypeId: google.maps.MapTypeId.ROADMAP
});
path = new google.maps.Polyline({
path: locations,
geodesic: true,
strokeColor: '#ff0000',
strokeOpacity: 1.0,
strokeWeight: 2
});
path.setMap(map);
}
// 位置情報を更新する
function updateMap(latitude, longitude) {
const position = { lat: latitude, lng: longitude };
map.setCenter(position);
if (!marker) {
marker = new google.maps.Marker({
position: position,
map: map,
title: '現在位置'
});
} else {
marker.setPosition(position);
}
locations.push(position);
path.setPath(locations);
}
// 位置情報を直接送信して保存する
function saveLocationDirectly(latitude, longitude, accuracy) {
var formData = new FormData();
formData.append('action', 'save_location');
formData.append('latitude', latitude);
formData.append('longitude', longitude);
formData.append('accuracy', accuracy);
formData.append('driver_id', DRIVER_ID);
formData.append('save_location_nonce', '<?php echo wp_create_nonce('save_location_nonce_action'); ?>');
fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
method: 'POST',
body: formData
})
.then(response => response.text())
.then(data => {
console.log('位置情報が保存されました:', data);
})
.catch(error => {
console.error('位置情報保存エラー:', error);
});
}
// 追跡を開始する
function startTracking() {
if ('geolocation' in navigator) {
document.getElementById('status').textContent = '追跡中...';
locations = [];
if (path) { path.setPath(locations); }
watchId = navigator.geolocation.watchPosition(
function(position) {
const latitude = position.coords.latitude;
const longitude = position.coords.longitude;
const accuracy = position.coords.accuracy;
const timestamp = new Date(position.timestamp).toLocaleString();
document.getElementById('status').textContent = '位置情報を追跡中';
document.getElementById('latitude').textContent = `latitude: ${latitude}`;
document.getElementById('longitude').textContent = `longitude: ${longitude}`;
document.getElementById('accuracy').textContent = `accuracy: ${accuracy}m`;
document.getElementById('timestamp').textContent = `timestamp: ${timestamp}`;
updateMap(latitude, longitude);
saveLocationDirectly(latitude, longitude, accuracy); // 位置情報を直接保存
},
function(error) {
let errorMessage = '';
switch(error.code) {
case error.PERMISSION_DENIED:
errorMessage = '位置情報の使用が許可されていません';
break;
case error.POSITION_UNAVAILABLE:
errorMessage = '位置情報が取得できませんでした';
break;
case error.TIMEOUT:
errorMessage = '位置情報の取得がタイムアウトになりました';
break;
default:
errorMessage = 'その他のエラー: ' + error.message;
}
document.getElementById('status').textContent = '失敗: ' + errorMessage;
console.error(errorMessage);
},
{
enableHighAccuracy: true,
timeout: 1000,
maximumAge: 0
}
);
} else {
document.getElementById('status').textContent = 'Geolocationはサポートされていません';
}
}
// 追跡を停止する
function stopTracking() {
if (watchId !== null) {
navigator.geolocation.clearWatch(watchId);
watchId = null;
document.getElementById('status').textContent = '追跡を中止しました';
}
}
document.getElementById('startTracking').addEventListener('click', startTracking);
document.getElementById('stopTracking').addEventListener('click', stopTracking);
// Google Maps APIの読み込み
function loadGoogleMapsAPI() {
const script = document.createElement('script');
script.src = 'https://maps.googleapis.com/maps/api/js?key=AIzaSyBc4f0GB_-ZGxU4-oPdzy4VfVLckM_NRNo&callback=initMap';
script.async = true;
script.defer = true;
document.head.appendChild(script);
}
loadGoogleMapsAPI();
</script>
</main>
<?php get_footer(); ?>