WordPress如何使用$wpdb创建数据表并存储自定义表单提交数据
WordPress自定义RSVP表单提交入库实现方案
首先修正你现有表单的两个基础问题:单选按钮缺少value属性会导致提交后无法获取选中值,同时需要补充WordPress原生安全校验字段,修正后的表单直接替换原有代码即可:
<div class="my-form"> <h2>WILL YOU ATTEND?</h2> <?php if (isset($_GET['attend_status'])): ?> <div class="form-notice"> <?php echo $_GET['attend_status'] === 'success' ? '提交成功,感谢你的反馈!' : '提交失败,请检查填写内容后重试'; ?> </div> <?php endif; ?> <form action="" autocomplete="off" method="POST"> <?php wp_nonce_field('attend_form_submit', 'attend_nonce'); ?> <input class="input" type="text" spellcheck="false" name="name" placeholder="Name" required> <input class="input" type="email" spellcheck="false" name="email" placeholder="E-mail" required> <label class="ans">Yes <input type="radio" name="attend_ans" value="1"> <span class="checkmark"></span> </label> <label class="ans">No <input type="radio" name="attend_ans" value="0"> <span class="checkmark"></span> </label> <button type="submit" name="attend_submit_btn"> SUBMIT </button> </form> </div>
说明:
action属性留空即可,表单会默认提交到当前页面,不需要填写特殊地址;wp_nonce_field是WordPress自带的CSRF安全校验字段,必须添加。
第一步:创建存储提交数据的自定义数据表
不要每次提交表单都执行建表逻辑,会严重拖慢站点性能。推荐把建表逻辑绑定到主题激活钩子,仅在主题启用时执行一次。将以下代码添加到当前主题的functions.php文件中:
// 主题激活时创建RSVP表单存储表 function create_attend_form_table() { global $wpdb; $table_name = $wpdb->prefix . 'attend_records'; // 自动拼接WordPress表前缀,例如最终表名为wp_attend_records $charset_collate = $wpdb->get_charset_collate(); // 建表语句 $sql = "CREATE TABLE $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, name varchar(100) NOT NULL, email varchar(100) NOT NULL, will_attend tinyint(1) NOT NULL DEFAULT 0, submit_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY (id) ) $charset_collate;"; // 引入WordPress建表依赖文件 require_once ABSPATH . 'wp-admin/includes/upgrade.php'; dbDelta($sql); } add_action('after_switch_theme', 'create_attend_form_table');
如果不想通过切换/重启主题触发建表,也可以在表单处理逻辑前添加表存在判断,若表不存在则执行上述建表逻辑即可。
第二步:编写表单提交处理逻辑
将以下代码同样添加到functions.php文件中,逻辑覆盖安全校验、数据清洗、入库操作、提交后跳转防重复提交全流程:
// 处理RSVP表单提交请求 function handle_attend_form_submit() { // 判断是否为目标表单提交 if (!isset($_POST['attend_submit_btn'])) { return; } global $wpdb; $table_name = $wpdb->prefix . 'attend_records'; // 安全校验:验证nonce合法性 if (!isset($_POST['attend_nonce']) || !wp_verify_nonce($_POST['attend_nonce'], 'attend_form_submit')) { wp_redirect(add_query_arg('attend_status', 'error', wp_get_referer())); exit; } // 数据校验与清洗 $name = sanitize_text_field($_POST['name'] ?? ''); $email = sanitize_email($_POST['email'] ?? ''); $will_attend = intval($_POST['attend_ans'] ?? -1); // 必填项合法性判断 if (empty($name) || !is_email($email) || !in_array($will_attend, [0,1])) { wp_redirect(add_query_arg('attend_status', 'error', wp_get_referer())); exit; } // 插入数据,$wpdb->insert会自动做SQL转义,避免注入风险 $insert_result = $wpdb->insert( $table_name, [ 'name' => $name, 'email' => $email, 'will_attend' => $will_attend, 'submit_time' => current_time('mysql') ], ['%s', '%s', '%d', '%s'] ); // 跳转回表单页,携带提交状态,避免用户刷新重复提交 if ($insert_result) { wp_redirect(add_query_arg('attend_status', 'success', wp_get_referer())); } else { wp_redirect(add_query_arg('attend_status', 'error', wp_get_referer())); } exit; } add_action('init', 'handle_attend_form_submit');
注意事项
- 所有用户输入必须使用WordPress自带的
sanitize_*系列函数清洗,禁止直接读取$_POST原始值入库 - 禁止手动拼接SQL语句,优先使用
$wpdb->insert()方法,该方法会自动做转义处理,从根源避免SQL注入风险 - 表单处理完成后必须执行重定向,否则用户刷新页面会触发重复提交
- 后续查看提交数据时,可以直接通过数据库管理工具访问
{你的站点表前缀}attend_records表,也可以自行开发后台管理页面对提交记录做增删改查操作
内容的提问来源于stack exchange,提问作者Zeddy Emy
相关产品推荐
相关产品推荐

