使用admin_post钩子提交Elementor自定义HTML表单对接WordPress数据库问题
PHP代码放置方案对比
两种方式都可以正常运行,适用场景不同:
- 放置到主题
functions.php:仅适合功能和当前主题深度绑定、且你已经部署了WordPress子主题的场景。如果直接将代码写在官方原版主题的functions.php里,主题更新时所有自定义代码会被直接覆盖丢失。 - 通过PHP代码片段插件添加:更适合当前场景。优势是代码不会随主题更新/切换丢失,大部分同类插件还支持单段代码临时禁用、运行错误自动回滚,调试阶段改代码更方便,不需要通过FTP修改主题文件。
你当前代码无法正常运行的修复方案
你现在wpdb->insert不生效是代码存在多处明显错误,和放置位置无关,需要先修正:
1. 前端代码问题
你把提交按钮放在了<form>标签外部,浏览器默认不会把按钮参数随表单提交:
<!-- 错误写法,按钮在form外部 --> </form> <input type="submit" value="SUBMIT" name="submit" onclick="setTimeout(validate, 1500)" /> <!-- 修正后,按钮移到form内部 --> <input type="submit" value="SUBMIT" name="submit" onclick="setTimeout(validate, 1500)" /> </form>
2. PHP后端代码问题
add_action('admin_post_compass_data','storedata_compass',11); add_action('admin_post_nopriv_compass_data','storedata_compass',11); function storedata_compass(){ // 修正1:和前端name属性一致用小写submit,同时添加登录校验防止恶意提交 if(isset($_POST['submit']) && is_user_logged_in()){ global $wpdb; $user = wp_get_current_user(); // 修正2:变量名统一,原来的$user_id是未定义变量 $userId = $user->ID; $user_data = get_userdata($userId); // 修正3:确认数据库表字段名没有空格,如果你表字段确实带空格再保留,否则建议改成下划线格式比如student_id $data = array( 'Student Id' => $userId, 'First Name' => $user_data->user_firstname, 'Email' => $user_data->user_email, 'Group Id' => 2, 'Intro Selection' => 'DBTEST', 'End Selection' => 'test2' ); $format = array('%d', '%s', '%s', '%d', '%s', '%s'); $wpdb->insert( 'wpqc_compass', $data, $format); // 提交后跳转回原页面,防止用户重复提交 wp_redirect(wp_get_referer()); exit; } }
3. 前端JS变量提交方案
如果你需要把JS里的变量提交到后端,只需要在表单里新增隐藏的input标签,JS逻辑里计算完变量值后给对应隐藏input赋值即可,后端直接通过$_POST取对应input的name属性值就能拿到,插入数据库即可。
内容的提问来源于stack exchange,提问作者NewProgrammer
相关产品推荐
相关产品推荐

