使用do_shortcode调用表单时,无法触发update_user_meta更新用户元数据
解决Contact Form 7短代码调用时update_user_meta不生效的问题
问题场景
我需要在用户提交Contact Form 7表单后更新用户元数据,单独调用包含update_user_meta的updateUserType函数可以正常工作,但通过do_shortcode调用表单时,该函数完全不生效。当前代码如下:
echo do_shortcode('[contact-form-7 id="031c4e8" title="Dosya"]'); add_action( 'wpcf7_before_send_mail', 'updateUserType'); function updateUserType() { $user_idd = get_current_user_id(); update_user_meta( $user_idd, '_user_type', 'general' ) ;}
问题原因
核心问题是钩子注册时机过晚:当你通过do_shortcode调用CF7表单时,CF7的初始化逻辑已经在短代码执行过程中完成,而你在调用短代码之后才注册wpcf7_before_send_mail钩子,此时钩子已经错过了触发时机,导致函数无法执行。
解决方案
方案1:调整钩子注册顺序
将add_action代码移到do_shortcode之前,确保钩子在CF7初始化前完成注册,同时增加用户登录状态检查,避免无效操作:
add_action( 'wpcf7_before_send_mail', 'updateUserType'); function updateUserType() { $user_idd = get_current_user_id(); // 仅当用户已登录时执行更新 if ( $user_idd ) { update_user_meta( $user_idd, '_user_type', 'general' ); } } echo do_shortcode('[contact-form-7 id="031c4e8" title="Dosya"]');
方案2:使用更稳定的钩子
如果调整顺序后仍有问题,可以尝试CF7的wpcf7_submit钩子,该钩子在表单提交流程的后期触发,适配场景更广泛:
add_action( 'wpcf7_submit', 'updateUserType'); function updateUserType( $contact_form ) { $user_idd = get_current_user_id(); if ( $user_idd ) { update_user_meta( $user_idd, '_user_type', 'general' ); } } echo do_shortcode('[contact-form-7 id="031c4e8" title="Dosya"]');
内容的提问来源于stack exchange,提问作者user17890799
相关产品推荐
相关产品推荐

