在開發WordPress 插件時,我們經常會需要根據用戶的地理位置提供動態內容,比如日出日落時間。 PHP 自帶的date_sunset()函數可以方便地計算日落時間。但要實時顯示用戶“當地”的日落時間,需要結合一些定位技術。
本文將帶你一步步實現,在WordPress 插件中嵌入date_sunset()並動態顯示日落時間。
PHP 運行在服務器端,無法直接訪問用戶設備的地理位置。因此,我們需要使用JavaScript 獲取用戶經緯度,並通過AJAX 將信息傳回服務器。
// 在你的插件主文件或特定的 PHP 文件中添加
function m66net_enqueue_location_script() {
wp_enqueue_script('m66net-location-script', 'https://m66.net/js/location.js', array('jquery'), null, true);
// 通過 wp_localize_script 把 AJAX URL 傳遞給 JS
wp_localize_script('m66net-location-script', 'm66net_ajax_object', array(
'ajax_url' => admin_url('admin-ajax.php')
));
}
add_action('wp_enqueue_scripts', 'm66net_enqueue_location_script');
location.js文件示例(存放在https://m66.net/js/location.js ):
jQuery(document).ready(function($){
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
$.post(m66net_ajax_object.ajax_url, {
action: 'm66net_send_location',
latitude: position.coords.latitude,
longitude: position.coords.longitude
}, function(response) {
$('#m66net-sunset-time').html(response);
});
});
} else {
$('#m66net-sunset-time').html('無法獲取您的位置信息');
}
});
接下來,我們在WordPress 中創建一個處理用戶地理位置信息並返回日落時間的AJAX 接口。
function m66net_calculate_sunset() {
if (isset($_POST['latitude']) && isset($_POST['longitude'])) {
$latitude = floatval($_POST['latitude']);
$longitude = floatval($_POST['longitude']);
$timestamp = time();
$sunset = date_sunset($timestamp, SUNFUNCS_RET_STRING, $latitude, $longitude, 90.583333, date('Z') / 3600);
echo '您當地的日落時間是:' . $sunset;
} else {
echo '無法計算日落時間';
}
wp_die(); // 重要:終止 AJAX 處理
}
add_action('wp_ajax_m66net_send_location', 'm66net_calculate_sunset');
add_action('wp_ajax_nopriv_m66net_send_location', 'm66net_calculate_sunset');
解釋一下:
SUNFUNCS_RET_STRING讓date_sunset()返回格式化後的時間字符串,比如19:21 。
90.583333是標準的海平面氣壓角度,通常使用這個默認值。
date('Z') / 3600會根據服務器的時區補正。
最後,在需要顯示日落時間的地方(比如文章、頁面或小工具),加上一段HTML:
<div id="m66net-sunset-time">正在獲取日落時間...</div>
只要用戶訪問頁面,就會觸發JavaScript,自動檢測用戶位置,並顯示準確的日落時間!
如果想支持HTTPS,確保你的m66.net資源也走HTTPS,否則瀏覽器會阻止混合內容請求。
date_sunset()的結果是服務器時間標準,如果插件要適配不同服務器地區,還需要更精細的時區處理。
請為你的插件添加合理的錯誤提示,比如用戶拒絕共享位置信息時。