文章目录[隐藏]
WordPress网站活动倒计时与自动提醒功能模块开发详细教程
引言:为什么需要活动倒计时与提醒功能
在当今数字营销时代,活动倒计时与自动提醒功能已成为网站提升用户参与度和转化率的重要工具。无论是电商限时促销、线上研讨会报名、产品发布会还是节日特惠活动,一个精心设计的倒计时模块能够有效制造紧迫感,激发用户行动。
对于WordPress网站管理员而言,虽然市面上有许多倒计时插件可供选择,但通过代码二次开发实现自定义功能具有独特优势:完全控制样式与行为、避免插件冲突、提升网站性能,以及根据特定需求定制功能。本教程将详细指导您如何为WordPress网站开发一个功能完整、可自定义的活动倒计时与自动提醒模块。
第一部分:开发环境准备与项目规划
1.1 开发环境配置
在开始开发之前,请确保您已准备好以下环境:
- 本地开发环境:推荐使用XAMPP、MAMP或Local by Flywheel搭建本地WordPress环境
- 代码编辑器:VS Code、Sublime Text或PHPStorm等
- 浏览器开发者工具:用于调试JavaScript和CSS
- 版本控制系统:Git(可选但推荐)
1.2 功能需求分析
我们的倒计时与提醒模块需要实现以下核心功能:
- 前端倒计时显示:在网站指定位置显示活动剩余时间
- 管理后台配置:允许管理员设置活动时间、提醒规则等
- 自动提醒系统:通过邮件或浏览器通知提醒用户
- 响应式设计:适配各种设备屏幕
- 短代码支持:方便在文章、页面和小工具中插入倒计时
1.3 项目文件结构规划
我们将创建一个独立的WordPress插件来实现此功能,文件结构如下:
wp-content/plugins/countdown-reminder/
├── countdown-reminder.php # 主插件文件
├── includes/
│ ├── class-countdown-admin.php # 后台管理类
│ ├── class-countdown-frontend.php # 前端显示类
│ ├── class-countdown-reminder.php # 提醒功能类
│ └── class-countdown-shortcode.php # 短代码类
├── assets/
│ ├── css/
│ │ ├── admin-style.css # 后台样式
│ │ └── frontend-style.css # 前端样式
│ └── js/
│ ├── admin-script.js # 后台脚本
│ └── frontend-script.js # 前端脚本
├── templates/ # 模板文件
│ └── countdown-display.php
└── languages/ # 国际化文件(可选)
第二部分:创建基础插件框架
2.1 主插件文件设置
首先创建主插件文件 countdown-reminder.php:
<?php
/**
* Plugin Name: 活动倒计时与自动提醒
* Plugin URI: https://yourwebsite.com/countdown-reminder
* Description: 为WordPress网站添加活动倒计时与自动提醒功能
* Version: 1.0.0
* Author: 您的名称
* Author URI: https://yourwebsite.com
* License: GPL v2 or later
* Text Domain: countdown-reminder
* Domain Path: /languages
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('CDR_VERSION', '1.0.0');
define('CDR_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('CDR_PLUGIN_URL', plugin_dir_url(__FILE__));
define('CDR_PLUGIN_BASENAME', plugin_basename(__FILE__));
// 自动加载类文件
spl_autoload_register(function ($class_name) {
if (strpos($class_name, 'Countdown_Reminder_') !== false) {
$class_file = 'class-' . strtolower(str_replace('_', '-', $class_name)) . '.php';
$file_path = CDR_PLUGIN_DIR . 'includes/' . $class_file;
if (file_exists($file_path)) {
require_once $file_path;
}
}
});
// 初始化插件
function cdr_init_plugin() {
// 检查WordPress版本
if (version_compare(get_bloginfo('version'), '5.0', '<')) {
add_action('admin_notices', function() {
echo '<div class="notice notice-error"><p>';
echo __('活动倒计时与自动提醒插件需要WordPress 5.0或更高版本。', 'countdown-reminder');
echo '</p></div>';
});
return;
}
// 初始化各个功能模块
if (is_admin()) {
new Countdown_Reminder_Admin();
}
new Countdown_Reminder_Frontend();
new Countdown_Reminder_Shortcode();
new Countdown_Reminder_Reminder();
}
add_action('plugins_loaded', 'cdr_init_plugin');
// 插件激活时执行的操作
function cdr_activate_plugin() {
// 创建必要的数据库表
cdr_create_database_tables();
// 设置默认选项
$default_options = array(
'default_countdown_style' => 'modern',
'enable_email_reminders' => true,
'enable_browser_notifications' => false,
'reminder_intervals' => array('24', '6', '1'), // 小时
'default_timezone' => get_option('timezone_string', 'UTC'),
);
add_option('cdr_settings', $default_options);
// 添加定时任务
if (!wp_next_scheduled('cdr_daily_reminder_check')) {
wp_schedule_event(time(), 'hourly', 'cdr_daily_reminder_check');
}
}
register_activation_hook(__FILE__, 'cdr_activate_plugin');
// 插件停用时执行的操作
function cdr_deactivate_plugin() {
// 清除定时任务
wp_clear_scheduled_hook('cdr_daily_reminder_check');
}
register_deactivation_hook(__FILE__, 'cdr_deactivate_plugin');
// 创建数据库表
function cdr_create_database_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$table_name = $wpdb->prefix . 'cdr_events';
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
event_name varchar(255) NOT NULL,
event_description text,
start_datetime datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
end_datetime datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
timezone varchar(50) DEFAULT 'UTC',
countdown_style varchar(50) DEFAULT 'modern',
enable_reminders tinyint(1) DEFAULT 1,
reminder_intervals varchar(255) DEFAULT '24,6,1',
status varchar(20) DEFAULT 'active',
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
// 创建提醒记录表
$reminders_table = $wpdb->prefix . 'cdr_reminders';
$sql2 = "CREATE TABLE IF NOT EXISTS $reminders_table (
id mediumint(9) NOT NULL AUTO_INCREMENT,
event_id mediumint(9) NOT NULL,
user_id mediumint(9),
user_email varchar(255),
reminder_type varchar(20) DEFAULT 'email',
reminder_sent tinyint(1) DEFAULT 0,
scheduled_time datetime NOT NULL,
sent_time datetime,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY event_id (event_id),
KEY user_email (user_email)
) $charset_collate;";
dbDelta($sql2);
}
第三部分:开发后台管理界面
3.1 创建管理类
在 includes/class-countdown-admin.php 中创建后台管理类:
<?php
class Countdown_Reminder_Admin {
private $settings_page;
public function __construct() {
add_action('admin_menu', array($this, 'add_admin_menu'));
add_action('admin_init', array($this, 'register_settings'));
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
add_action('wp_ajax_cdr_save_event', array($this, 'ajax_save_event'));
add_action('wp_ajax_cdr_get_events', array($this, 'ajax_get_events'));
add_action('wp_ajax_cdr_delete_event', array($this, 'ajax_delete_event'));
}
public function add_admin_menu() {
$this->settings_page = add_menu_page(
__('活动倒计时管理', 'countdown-reminder'),
__('活动倒计时', 'countdown-reminder'),
'manage_options',
'countdown-reminder',
array($this, 'render_admin_page'),
'dashicons-clock',
30
);
// 添加子菜单
add_submenu_page(
'countdown-reminder',
__('添加新活动', 'countdown-reminder'),
__('添加新活动', 'countdown-reminder'),
'manage_options',
'countdown-reminder-add',
array($this, 'render_add_event_page')
);
add_submenu_page(
'countdown-reminder',
__('设置', 'countdown-reminder'),
__('设置', 'countdown-reminder'),
'manage_options',
'countdown-reminder-settings',
array($this, 'render_settings_page')
);
}
public function enqueue_admin_scripts($hook) {
if (strpos($hook, 'countdown-reminder') === false) {
return;
}
// 引入日期时间选择器
wp_enqueue_style('jquery-ui-style', 'https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css');
wp_enqueue_script('jquery-ui-datepicker');
// 引入时间选择器
wp_enqueue_style('timepicker-style', 'https://cdnjs.cloudflare.com/ajax/libs/timepicker/1.3.5/jquery.timepicker.min.css');
wp_enqueue_script('timepicker-script', 'https://cdnjs.cloudflare.com/ajax/libs/timepicker/1.3.5/jquery.timepicker.min.js', array('jquery'), '1.3.5', true);
// 引入插件自定义样式和脚本
wp_enqueue_style('cdr-admin-style', CDR_PLUGIN_URL . 'assets/css/admin-style.css', array(), CDR_VERSION);
wp_enqueue_script('cdr-admin-script', CDR_PLUGIN_URL . 'assets/js/admin-script.js', array('jquery', 'jquery-ui-datepicker'), CDR_VERSION, true);
// 本地化脚本
wp_localize_script('cdr-admin-script', 'cdr_admin_ajax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('cdr_admin_nonce'),
'confirm_delete' => __('确定要删除这个活动吗?', 'countdown-reminder'),
'saving' => __('保存中...', 'countdown-reminder'),
'saved' => __('已保存', 'countdown-reminder')
));
}
public function render_admin_page() {
?>
<div class="wrap cdr-admin-wrap">
<h1><?php _e('活动倒计时管理', 'countdown-reminder'); ?></h1>
<div class="cdr-admin-header">
<a href="<?php echo admin_url('admin.php?page=countdown-reminder-add'); ?>" class="button button-primary">
<?php _e('添加新活动', 'countdown-reminder'); ?>
</a>
<a href="<?php echo admin_url('admin.php?page=countdown-reminder-settings'); ?>" class="button">
<?php _e('设置', 'countdown-reminder'); ?>
</a>
</div>
<div class="cdr-events-list">
<h2><?php _e('活动列表', 'countdown-reminder'); ?></h2>
<div class="cdr-events-table-container">
<table class="wp-list-table widefat fixed striped">
<thead>
<tr>
<th><?php _e('活动名称', 'countdown-reminder'); ?></th>
<th><?php _e('开始时间', 'countdown-reminder'); ?></th>
<th><?php _e('结束时间', 'countdown-reminder'); ?></th>
<th><?php _e('状态', 'countdown-reminder'); ?></th>
<th><?php _e('操作', 'countdown-reminder'); ?></th>
</tr>
</thead>
<tbody id="cdr-events-body">
<!-- 通过AJAX加载活动列表 -->
<tr>
<td colspan="5" class="cdr-loading">
<?php _e('加载中...', 'countdown-reminder'); ?>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="cdr-shortcode-help">
<h3><?php _e('使用短代码', 'countdown-reminder'); ?></h3>
<p><?php _e('在文章或页面中使用以下短代码显示倒计时:', 'countdown-reminder'); ?></p>
<code>[countdown event_id="1"]</code>
<p><?php _e('或使用活动名称:', 'countdown-reminder'); ?></p>
<code>[countdown event_name="新年促销"]</code>
<p><?php _e('在小工具中使用文本小工具并插入短代码。', 'countdown-reminder'); ?></p>
</div>
</div>
<?php
}
public function render_add_event_page() {
$timezones = timezone_identifiers_list();
$current_timezone = get_option('timezone_string', 'UTC');
?>
<div class="wrap cdr-admin-wrap">
<h1><?php _e('添加新活动', 'countdown-reminder'); ?></h1>
<form id="cdr-event-form" method="post">
<?php wp_nonce_field('cdr_save_event_nonce', 'cdr_nonce'); ?>
<div class="cdr-form-section">
<h2><?php _e('活动基本信息', 'countdown-reminder'); ?></h2>
<div class="cdr-form-row">
<label for="event_name"><?php _e('活动名称 *', 'countdown-reminder'); ?></label>
<input type="text" id="event_name" name="event_name" required class="regular-text">
</div>
<div class="cdr-form-row">
<label for="event_description"><?php _e('活动描述', 'countdown-reminder'); ?></label>
<textarea id="event_description" name="event_description" rows="4" class="large-text"></textarea>
</div>
</div>
<div class="cdr-form-section">
<h2><?php _e('时间设置', 'countdown-reminder'); ?></h2>
<div class="cdr-form-row">
<label for="start_date"><?php _e('开始日期', 'countdown-reminder'); ?></label>
<input type="text" id="start_date" name="start_date" class="cdr-datepicker">
<input type="text" id="start_time" name="start_time" class="cdr-timepicker" placeholder="HH:MM">
</div>
<div class="cdr-form-row">
<label for="end_date"><?php _e('结束日期 *', 'countdown-reminder'); ?></label>
<input type="text" id="end_date" name="end_date" class="cdr-datepicker" required>
<input type="text" id="end_time" name="end_time" class="cdr-timepicker" placeholder="HH:MM" required>
</div>
<div class="cdr-form-row">
<label for="timezone"><?php _e('时区', 'countdown-reminder'); ?></label>
<select id="timezone" name="timezone">
<?php foreach ($timezones as $tz): ?>
<option value="<?php echo esc_attr($tz); ?>" <?php selected($current_timezone, $tz); ?>>
<?php echo esc_html($tz); ?>
</option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="cdr-form-section">
<h2><?php _e('倒计时样式', 'countdown-reminder'); ?></h2>
<div class="cdr-form-row">
<label for="countdown_style"><?php _e('选择样式', 'countdown-reminder'); ?></label>
<select id="countdown_style" name="countdown_style">
<option value="modern"><?php _e('现代风格', 'countdown-reminder'); ?></option>
<option value="classic"><?php _e('经典风格', 'countdown-reminder'); ?></option>
<option value="minimal"><?php _e('简约风格', 'countdown-reminder'); ?></option>
<option value="flip"><?php _e('翻牌效果', 'countdown-reminder'); ?></option>
</select>
</div>
<div class="cdr-style-previews">
preview" data-style="modern">
<h4><?php _e('现代风格', 'countdown-reminder'); ?></h4>
<div class="preview-countdown">
<div class="countdown-unit">
<span class="number">12</span>
<span class="label"><?php _e('天', 'countdown-reminder'); ?></span>
</div>
<div class="countdown-unit">
<span class="number">23</span>
<span class="label"><?php _e('小时', 'countdown-reminder'); ?></span>
</div>
<div class="countdown-unit">
<span class="number">45</span>
<span class="label"><?php _e('分钟', 'countdown-reminder'); ?></span>
</div>
<div class="countdown-unit">
<span class="number">30</span>
<span class="label"><?php _e('秒', 'countdown-reminder'); ?></span>
</div>
</div>
</div>
</div>
</div>
<div class="cdr-form-section">
<h2><?php _e('提醒设置', 'countdown-reminder'); ?></h2>
<div class="cdr-form-row">
<label>
<input type="checkbox" id="enable_reminders" name="enable_reminders" value="1" checked>
<?php _e('启用自动提醒', 'countdown-reminder'); ?>
</label>
</div>
<div class="cdr-form-row cdr-reminder-intervals" id="reminder_intervals_container">
<label><?php _e('提醒间隔(活动开始前的小时数)', 'countdown-reminder'); ?></label>
<div class="interval-checkboxes">
<label><input type="checkbox" name="reminder_intervals[]" value="168" checked> <?php _e('7天前', 'countdown-reminder'); ?></label>
<label><input type="checkbox" name="reminder_intervals[]" value="72" checked> <?php _e('3天前', 'countdown-reminder'); ?></label>
<label><input type="checkbox" name="reminder_intervals[]" value="24" checked> <?php _e('1天前', 'countdown-reminder'); ?></label>
<label><input type="checkbox" name="reminder_intervals[]" value="6"> <?php _e('6小时前', 'countdown-reminder'); ?></label>
<label><input type="checkbox" name="reminder_intervals[]" value="1"> <?php _e('1小时前', 'countdown-reminder'); ?></label>
<label><input type="checkbox" name="reminder_intervals[]" value="0.5"> <?php _e('30分钟前', 'countdown-reminder'); ?></label>
</div>
</div>
<div class="cdr-form-row">
<label for="reminder_message"><?php _e('自定义提醒消息', 'countdown-reminder'); ?></label>
<textarea id="reminder_message" name="reminder_message" rows="3" class="large-text" placeholder="<?php esc_attr_e('例如:您关注的活动即将开始!不要错过...', 'countdown-reminder'); ?>"></textarea>
<p class="description"><?php _e('使用 {event_name}、{start_time}、{days_left} 等占位符', 'countdown-reminder'); ?></p>
</div>
</div>
<div class="cdr-form-actions">
<button type="submit" class="button button-primary button-large">
<?php _e('保存活动', 'countdown-reminder'); ?>
</button>
<a href="<?php echo admin_url('admin.php?page=countdown-reminder'); ?>" class="button button-large">
<?php _e('返回列表', 'countdown-reminder'); ?>
</a>
</div>
<div id="cdr-form-message" class="cdr-message" style="display:none;"></div>
</form>
</div>
<?php
}
public function render_settings_page() {
$settings = get_option('cdr_settings', array());
?>
<div class="wrap cdr-admin-wrap">
<h1><?php _e('倒计时与提醒设置', 'countdown-reminder'); ?></h1>
<form method="post" action="options.php">
<?php settings_fields('cdr_settings_group'); ?>
<?php do_settings_sections('cdr_settings_group'); ?>
<div class="cdr-form-section">
<h2><?php _e('常规设置', 'countdown-reminder'); ?></h2>
<div class="cdr-form-row">
<label for="default_timezone"><?php _e('默认时区', 'countdown-reminder'); ?></label>
<select id="default_timezone" name="cdr_settings[default_timezone]">
<?php
$timezones = timezone_identifiers_list();
$current_tz = isset($settings['default_timezone']) ? $settings['default_timezone'] : get_option('timezone_string', 'UTC');
foreach ($timezones as $tz) {
echo '<option value="' . esc_attr($tz) . '" ' . selected($current_tz, $tz, false) . '>' . esc_html($tz) . '</option>';
}
?>
</select>
</div>
<div class="cdr-form-row">
<label for="default_countdown_style"><?php _e('默认倒计时样式', 'countdown-reminder'); ?></label>
<select id="default_countdown_style" name="cdr_settings[default_countdown_style]">
<option value="modern" <?php selected(isset($settings['default_countdown_style']) ? $settings['default_countdown_style'] : 'modern', 'modern'); ?>>
<?php _e('现代风格', 'countdown-reminder'); ?>
</option>
<option value="classic" <?php selected(isset($settings['default_countdown_style']) ? $settings['default_countdown_style'] : '', 'classic'); ?>>
<?php _e('经典风格', 'countdown-reminder'); ?>
</option>
<option value="minimal" <?php selected(isset($settings['default_countdown_style']) ? $settings['default_countdown_style'] : '', 'minimal'); ?>>
<?php _e('简约风格', 'countdown-reminder'); ?>
</option>
<option value="flip" <?php selected(isset($settings['default_countdown_style']) ? $settings['default_countdown_style'] : '', 'flip'); ?>>
<?php _e('翻牌效果', 'countdown-reminder'); ?>
</option>
</select>
</div>
</div>
<div class="cdr-form-section">
<h2><?php _e('提醒设置', 'countdown-reminder'); ?></h2>
<div class="cdr-form-row">
<label>
<input type="checkbox" name="cdr_settings[enable_email_reminders]" value="1"
<?php checked(isset($settings['enable_email_reminders']) ? $settings['enable_email_reminders'] : true, true); ?>>
<?php _e('启用邮件提醒', 'countdown-reminder'); ?>
</label>
</div>
<div class="cdr-form-row">
<label>
<input type="checkbox" name="cdr_settings[enable_browser_notifications]" value="1"
<?php checked(isset($settings['enable_browser_notifications']) ? $settings['enable_browser_notifications'] : false, true); ?>>
<?php _e('启用浏览器通知', 'countdown-reminder'); ?>
</label>
<p class="description"><?php _e('注意:浏览器通知需要用户授权', 'countdown-reminder'); ?></p>
</div>
<div class="cdr-form-row">
<label for="reminder_intervals"><?php _e('默认提醒间隔(小时,用逗号分隔)', 'countdown-reminder'); ?></label>
<input type="text" id="reminder_intervals" name="cdr_settings[reminder_intervals]"
value="<?php echo isset($settings['reminder_intervals']) ? esc_attr(is_array($settings['reminder_intervals']) ? implode(',', $settings['reminder_intervals']) : $settings['reminder_intervals']) : '24,6,1'; ?>"
class="regular-text">
<p class="description"><?php _e('例如:24,6,1 表示活动开始前24小时、6小时和1小时发送提醒', 'countdown-reminder'); ?></p>
</div>
<div class="cdr-form-row">
<label for="email_from_name"><?php _e('发件人名称', 'countdown-reminder'); ?></label>
<input type="text" id="email_from_name" name="cdr_settings[email_from_name]"
value="<?php echo isset($settings['email_from_name']) ? esc_attr($settings['email_from_name']) : get_bloginfo('name'); ?>"
class="regular-text">
</div>
<div class="cdr-form-row">
<label for="email_from_address"><?php _e('发件人邮箱', 'countdown-reminder'); ?></label>
<input type="email" id="email_from_address" name="cdr_settings[email_from_address]"
value="<?php echo isset($settings['email_from_address']) ? esc_attr($settings['email_from_address']) : get_bloginfo('admin_email'); ?>"
class="regular-text">
</div>
<div class="cdr-form-row">
<label for="default_reminder_subject"><?php _e('默认提醒邮件主题', 'countdown-reminder'); ?></label>
<input type="text" id="default_reminder_subject" name="cdr_settings[default_reminder_subject]"
value="<?php echo isset($settings['default_reminder_subject']) ? esc_attr($settings['default_reminder_subject']) : __('活动提醒: {event_name}', 'countdown-reminder'); ?>"
class="large-text">
</div>
<div class="cdr-form-row">
<label for="default_reminder_message"><?php _e('默认提醒邮件内容', 'countdown-reminder'); ?></label>
<textarea id="default_reminder_message" name="cdr_settings[default_reminder_message]" rows="6" class="large-text"><?php
echo isset($settings['default_reminder_message']) ? esc_textarea($settings['default_reminder_message']) : __('亲爱的用户,
您关注的活动 "{event_name}" 即将开始!
开始时间: {start_time}
剩余时间: {days_left} 天 {hours_left} 小时
点击这里查看详情: {event_url}
祝好,
{site_name}', 'countdown-reminder');
?></textarea>
<p class="description"><?php _e('可用占位符: {event_name}, {start_time}, {end_time}, {days_left}, {hours_left}, {event_url}, {site_name}', 'countdown-reminder'); ?></p>
</div>
</div>
<div class="cdr-form-section">
<h2><?php _e('显示设置', 'countdown-reminder'); ?></h2>
<div class="cdr-form-row">
<label>
<input type="checkbox" name="cdr_settings[show_past_events]" value="1"
<?php checked(isset($settings['show_past_events']) ? $settings['show_past_events'] : false, true); ?>>
<?php _e('显示已结束的活动', 'countdown-reminder'); ?>
</label>
</div>
<div class="cdr-form-row">
<label>
<input type="checkbox" name="cdr_settings[auto_refresh]" value="1"
<?php checked(isset($settings['auto_refresh']) ? $settings['auto_refresh'] : true, true); ?>>
<?php _e('自动刷新倒计时', 'countdown-reminder'); ?>
</label>
</div>
<div class="cdr-form-row">
<label for="refresh_interval"><?php _e('刷新间隔(秒)', 'countdown-reminder'); ?></label>
<input type="number" id="refresh_interval" name="cdr_settings[refresh_interval]"
value="<?php echo isset($settings['refresh_interval']) ? esc_attr($settings['refresh_interval']) : '1'; ?>"
min="1" max="60" class="small-text">
</div>
</div>
<?php submit_button(); ?>
</form>
</div>
<?php
}
public function register_settings() {
register_setting('cdr_settings_group', 'cdr_settings', array($this, 'sanitize_settings'));
}
public function sanitize_settings($input) {
$sanitized = array();
if (isset($input['default_timezone'])) {
$sanitized['default_timezone'] = sanitize_text_field($input['default_timezone']);
}
if (isset($input['default_countdown_style'])) {
$sanitized['default_countdown_style'] = sanitize_text_field($input['default_countdown_style']);
}
if (isset($input['enable_email_reminders'])) {
$sanitized['enable_email_reminders'] = (bool)$input['enable_email_reminders'];
}
if (isset($input['enable_browser_notifications'])) {
$sanitized['enable_browser_notifications'] = (bool)$input['enable_browser_notifications'];
}
if (isset($input['reminder_intervals'])) {
$intervals = explode(',', $input['reminder_intervals']);
$sanitized_intervals = array();
foreach ($intervals as $interval) {
$clean_interval = absint(trim($interval));
if ($clean_interval > 0) {
$sanitized_intervals[] = $clean_interval;
}
}
$sanitized['reminder_intervals'] = $sanitized_intervals;
}
if (isset($input['email_from_name'])) {
$sanitized['email_from_name'] = sanitize_text_field($input['email_from_name']);
}
if (isset($input['email_from_address'])) {
$sanitized['email_from_address'] = sanitize_email($input['email_from_address']);
}
if (isset($input['default_reminder_subject'])) {
$sanitized['default_reminder_subject'] = sanitize_text_field($input['default_reminder_subject']);
}
if (isset($input['default_reminder_message'])) {
$sanitized['default_reminder_message'] = wp_kses_post($input['default_reminder_message']);
}
if (isset($input['show_past_events'])) {
$sanitized['show_past_events'] = (bool)$input['show_past_events'];
}
if (isset($input['auto_refresh'])) {
$sanitized['auto_refresh'] = (bool)$input['auto_refresh'];
}
if (isset($input['refresh_interval'])) {
$sanitized['refresh_interval'] = absint($input['refresh_interval']);
if ($sanitized['refresh_interval'] < 1) $sanitized['refresh_interval'] = 1;
if ($sanitized['refresh_interval'] > 60) $sanitized['refresh_interval'] = 60;
}
return $sanitized;
}
public function ajax_save_event() {
// 验证nonce
if (!check_ajax_referer('cdr_admin_nonce', 'nonce', false)) {
wp_die(json_encode(array(
'success' => false,
'message' => __('安全验证失败', 'countdown-reminder')
)));
}
// 验证权限
if (!current_user_can('manage_options')) {
wp_die(json_encode(array(
'success' => false,
'message' => __('权限不足', 'countdown-reminder')
)));
}
global $wpdb;
$table_name = $wpdb->prefix . 'cdr_events';
// 获取并清理数据
$event_data = array(
'event_name' => sanitize_text_field($_POST['event_name']),
'event_description' => wp_kses_post($_POST['event_description']),
'timezone' => sanitize_text_field($_POST['timezone']),
'countdown_style' => sanitize_text_field($_POST['countdown_style']),
'enable_reminders' => isset($_POST['enable_reminders']) ? 1 : 0,
'status' => 'active'
);
// 处理日期时间
$start_date = sanitize_text_field($_POST['start_date']);
$start_time = sanitize_text_field($_POST['start_time']);
$end_date = sanitize_text_field($_POST['end_date']);
$end_time = sanitize_text_field($_POST['end_time']);
if (!empty($start_date) && !empty($start_time)) {
$event_data['start_datetime'] = $this->combine_datetime($start_date, $start_time, $event_data['timezone']);
}
if (!empty($end_date) && !empty($end_time)) {
$event_data['end_datetime'] = $this->combine_datetime($end_date, $end_time, $event
