在开发 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() 的结果是服务器时间标准,如果插件要适配不同服务器地区,还需要更精细的时区处理。
请为你的插件添加合理的错误提示,比如用户拒绝共享位置信息时。