如何在WooCommerce预订开始前15分钟执行PHP代码
解决方案:WooCommerce预订开始前15分钟执行PHP代码
1. 核心思路
依靠定时任务(Cron)每隔15/30分钟触发检查脚本,筛选出距离开始时间15分钟以内且未执行过触发操作的有效预订订单,执行目标业务代码后标记已处理,避免重复触发。
2. 具体实现步骤
步骤1:注册定时任务
在主题functions.php或自定义插件中添加以下代码,注册定时触发的钩子:
// 注册定时任务 add_action('wp', 'register_booking_pre_check_cron'); function register_booking_pre_check_cron() { if (!wp_next_scheduled('wc_booking_pre_start_trigger')) { // 每隔15分钟执行一次,需30分钟则改为 '*/30 * * * *' wp_schedule_event(time(), '*/15 * * * *', 'wc_booking_pre_start_trigger'); } } // 绑定定时任务的执行函数 add_action('wc_booking_pre_start_trigger', 'run_booking_pre_start_code');
步骤2:编写检查与执行逻辑
实现预订筛选、代码执行和重复防护逻辑:
function run_booking_pre_start_code() { global $wpdb; // 计算时间区间:当前时间到15分钟后 $now = current_time('mysql'); $fifteen_minutes_ahead = date('Y-m-d H:i:s', strtotime('+15 minutes')); // 查询符合条件的预订:已支付/确认状态、15分钟内开始、未执行过代码 $target_bookings = $wpdb->get_results($wpdb->prepare(" SELECT b.id, b.order_id, b.start_date FROM {$wpdb->prefix}wc_bookings b JOIN {$wpdb->prefix}posts p ON b.order_id = p.ID WHERE b.start_date BETWEEN %s AND %s AND p.post_status IN ('wc-completed', 'wc-processing') AND NOT EXISTS ( SELECT meta_id FROM {$wpdb->prefix}postmeta WHERE post_id = b.id AND meta_key = '_pre_start_code_done' AND meta_value = '1' ) ", $now, $fifteen_minutes_ahead)); if (!empty($target_bookings)) { foreach ($target_bookings as $booking) { // -------------------------- // 在这里插入你需要执行的PHP代码 // 示例:发送提醒邮件、调用第三方接口、更新订单数据等 // 可通过 $booking->order_id 获取关联订单ID,$booking->id 获取预订ID // -------------------------- // 标记该预订已处理,防止重复触发 update_post_meta($booking->id, '_pre_start_code_done', '1'); } } }
步骤3:保障定时任务正常运行
- 若主机禁用了WP Cron,可联系服务商开启,或设置系统级Cron替代,示例命令(每隔15分钟触发):
*/15 * * * * php /你的网站根目录路径/wp-cron.php > /dev/null 2>&1 - 可安装WP Crontrol插件,直观查看和管理定时任务的运行状态。
3. 关键注意事项
- 时区统一:使用WordPress的
current_time('mysql')获取时间,避免和WooCommerce预订存储的时间出现时区偏差。 - 状态适配:根据业务需求调整查询中的订单状态(比如仅处理
wc-completed已完成订单)。 - 性能优化:若预订量较大,可在SQL查询中添加合理的限制条件,避免单次查询数据过多。
内容的提问来源于stack exchange,提问作者Luis Machado
相关产品推荐
相关产品推荐

