基于特定日期的WordPress Contact Form 7重定向及中奖判定方案
WordPress表单提交后按特定日期判定跳转的实现方案
需求背景
- 使用Contact Form 7搭建表单,通过Post My CF7 Form插件将提交数据保存到自定义文章类型(CPT)
- 核心规则:预设13个每周固定的「中奖时刻」,在每个时刻之后,第一个提交表单的用户跳转至「PRIZE」页面;其余用户(包括该时刻之后的非首提交用户、未到中奖时刻的用户)跳转至「KEEP TRYING」页面,直到下一个中奖时刻到来
原方案问题
最初尝试纯前端JavaScript方案,但存在两个致命问题:
- 前端逻辑可被篡改,无法保证规则的公平性
- 无法持久化记录「中奖名额是否已使用」的状态,刷新页面后状态重置
ACF解决方案
通过Advanced Custom Fields(ACF)实现状态持久化与后端判断,具体步骤如下:
1. 配置ACF选项页与字段
- 创建一个ACF选项页(命名如「抽奖配置」),用来管理所有中奖时刻
- 添加重复字段(字段键:
pv_opt_moments),包含两个子字段:pv_opt_moment_date:日期时间字段,用来设置每周的中奖时刻(精确到时分)pv_opt_moment_used:布尔字段(或复选框),标记该中奖时刻是否已被使用(默认值为「未使用」)
2. 编写PHP逻辑处理跳转与状态更新
将以下代码添加到主题的functions.php文件或自定义插件中,监听CF7表单提交事件并执行判断:
add_action('wpcf7_mail_sent', 'cf7_submission_redirect_based_on_prize_moment'); function cf7_submission_redirect_based_on_prize_moment($contact_form) { // 获取选项页中的所有中奖时刻配置 $prize_moments = get_field('pv_opt_moments', 'option'); if (empty($prize_moments)) { // 无配置时默认跳转到未中奖页面 wp_redirect(home_url('/keep-trying/')); exit; } $current_timestamp = current_time('timestamp'); $redirect_to_prize = false; $updated_moments = $prize_moments; // 遍历查找当前可用的中奖时刻 foreach ($updated_moments as $index => $moment) { $moment_timestamp = strtotime($moment['pv_opt_moment_date']); $is_moment_used = $moment['pv_opt_moment_used']; // 判断条件:当前时间已过中奖时刻,且该时刻未被使用 if ($current_timestamp > $moment_timestamp && !$is_moment_used) { // 标记该时刻为已使用 $updated_moments[$index]['pv_opt_moment_used'] = true; $redirect_to_prize = true; break; // 仅处理第一个符合条件的时刻 } } // 更新ACF配置并执行跳转 if ($redirect_to_prize) { update_field('pv_opt_moments', $updated_moments, 'option'); wp_redirect(home_url('/prize/')); } else { wp_redirect(home_url('/keep-trying/')); } exit; }
3. 注意事项
- 确保Post My CF7 Form插件已正确配置,表单数据能正常保存到目标CPT
- 代码中的页面路径(
/prize/、/keep-trying/)需替换为站点实际的页面slug - 测试时可临时调整中奖时刻为当前时间附近,验证跳转逻辑与状态更新是否正常
- 若需要重置某个中奖时刻的使用状态,直接在ACF选项页修改对应字段即可
内容的提问来源于stack exchange,提问作者Guatman
相关产品推荐
相关产品推荐

