如何在WordPress Forminator表单提交后获取提交数据?
解决Forminator表单提交后同步数据到其他数据库表的问题
你之前尝试的钩子中,forminator_form_after_save_entry是唯一正确的时机——它会在表单条目完全保存到数据库后触发。之前失败大概率是参数处理、表单ID匹配或字段取值逻辑有问题,以下是可直接复用的解决方案:
完整代码实现
将这段代码添加到主题的functions.php文件,或通过自定义代码插件(如Code Snippets)引入:
add_action( 'forminator_form_after_save_entry', 'sync_forminator_to_custom_table', 10, 4 ); function sync_forminator_to_custom_table( $entry_id, $form_id, $entry_data, $form_settings ) { // 仅处理目标表单,替换为你的表单ID(可在表单编辑页面URL中找到) $target_form = 123; if ( $form_id !== $target_form ) { return; } // 提取提交的字段数据,替换为你的表单实际字段标识(在Forminator字段的「高级」标签下查看Field ID) $user_name = isset( $entry_data['meta_data']['user-name']['value'] ) ? sanitize_text_field( $entry_data['meta_data']['user-name']['value'] ) : ''; $user_email = isset( $entry_data['meta_data']['user-email']['value'] ) ? sanitize_email( $entry_data['meta_data']['user-email']['value'] ) : ''; $user_phone = isset( $entry_data['meta_data']['user-phone']['value'] ) ? sanitize_text_field( $entry_data['meta_data']['user-phone']['value'] ) : ''; // 连接数据库(同WordPress库直接用全局$wpdb;外部库需单独配置) global $wpdb; // 外部库示例: // $external_db = new wpdb( 'DB_USER', 'DB_PASS', 'DB_NAME', 'DB_HOST' ); // 目标表名,替换为你的自定义表名 $target_table = $wpdb->prefix . 'your_custom_table'; // 插入数据到目标表 $wpdb->insert( $target_table, array( 'name' => $user_name, 'email' => $user_email, 'phone' => $user_phone, 'created_at' => current_time( 'mysql' ) ), array( '%s', '%s', '%s', '%s' ) // 对应字段的数据类型 ); // 可选:记录错误日志用于排查 if ( $wpdb->last_error ) { error_log( 'Forminator数据同步失败: ' . $wpdb->last_error ); } }
关键注意事项
- 表单ID匹配:必须替换
$target_form为你的实际表单ID,避免所有表单提交都触发同步。 - 字段标识正确:
entry_data['meta_data'][字段标识]['value']中的字段标识,要和Forminator编辑页面中字段的「Field ID」完全一致(比如文本框默认是user-name)。 - 数据安全:必须用
sanitize_text_field、sanitize_email等函数过滤用户输入,防止SQL注入和XSS攻击。 - 错误排查:如果仍失败,开启WP_DEBUG日志(在
wp-config.php中设置define('WP_DEBUG', true); define('WP_DEBUG_LOG', true);),查看wp-content/debug.log中的错误信息。
为什么之前的钩子无效
forminator_custom_form_after_handle_submit:触发时机在条目保存到数据库之前,无法获取完整的持久化数据。forminator_custom_form_submit_before_set_fields:触发时机过早,此时用户提交的原始数据还未被处理成可用格式。forminator_form_after_save_entry:本身是正确钩子,之前失败多是参数处理逻辑有误(比如未过滤表单ID、字段标识错误)。
内容的提问来源于stack exchange,提问作者Roy_In
相关产品推荐
相关产品推荐

