WordPress中CF7表单提交后无法添加MyCred积分求助
问题排查与修正方案
核心问题:钩子参数不匹配
你的代码出现页面加载异常、积分无法添加的根本原因是CF7钩子的参数声明错误:
wpcf7_mail_sent钩子仅传递$contact_form一个参数,你却在函数里声明了两个参数,导致$submission变量为null。调用$submission->get_posted_data()会触发致命PHP错误,中断后续流程,造成页面持续加载,同时积分添加逻辑完全无法执行(但邮件已在钩子触发前发送完成,所以邮件能正常收到)。- 换成
wpcf7_before_send_mail钩子后,该钩子的参数是$contact_form和$abort,你仍将第二个参数当作$submission,同样导致$submission为null并触发错误,直接中断邮件发送流程,最终邮件发不出、页面也卡住。
修正后的代码
以下是修复参数问题、增加数据验证的完整代码:
function addcredits_withform( $contact_form ){ // 获取CF7提交实例 $submission = WPCF7_Submission::get_instance(); if ( ! $submission ) { return; } // 获取表单提交数据 $posted_data = $submission->get_posted_data(); $requesting_userid = isset( $posted_data['submitted_userid'] ) ? intval( $posted_data['submitted_userid'] ) : 0; $requested_amount = isset( $posted_data['number-805'] ) ? floatval( $posted_data['number-805'] ) : 0; // 验证关键数据有效性 if ( ! $requesting_userid || ! is_numeric( $requested_amount ) || $requested_amount <= 0 ) { return; } // 验证用户是否存在 if ( ! get_user_by( 'id', $requesting_userid ) ) { return; } // 执行积分添加 mycred_add( 'addcredits_withform', $requesting_userid, $requested_amount, '用户通过表单添加积分' ); } add_action( 'wpcf7_mail_sent', 'addcredits_withform' );
额外排查步骤
- 核对表单字段名:确保CF7表单中字段的
name属性与代码中submitted_userid、number-805完全一致(比如表单代码是[text submitted_userid]、[number number-805])。 - 开启错误日志:在
wp-config.php中开启WP_DEBUG和WP_DEBUG_LOG,查看wp-content/debug.log中的具体错误信息,辅助排查潜在问题。 - 检查mycred设置:确认mycred插件允许手动添加积分,且日志类型
addcredits_withform已在mycred设置中启用(若需要自定义日志类型)。 - 权限验证:如果是前台用户提交表单,需确保提交的
submitted_userid是当前登录用户ID(可改用get_current_user_id()替代表单提交的用户ID,防止恶意篡改)。
内容的提问来源于stack exchange,提问作者blackfox
相关产品推荐
相关产品推荐

