如何避免WooCommerce下单时触发profile_update钩子致用户元数据被覆盖?
解决WooCommerce下单时误触发用户资料更新代码的问题
嘿,我懂你的困扰——这段代码现在会在WooCommerce下单时也跟着执行,把user_pass2清空,完全偏离了你只想在用户更新个人资料时运行的预期对吧?
问题根源
profile_update这个钩子的触发场景比你预想的要宽泛:它不仅在用户手动编辑个人资料时触发,WooCommerce在创建新用户或者更新下单用户资料的过程中,也会调用这个钩子。这时候$_POST['password_1']根本不存在,相当于给password_hash传了空值,最后就把user_pass2覆盖成空字符串了。
修复方案
我们给代码加几个关键判断,精准限制触发条件,确保只有用户主动更新个人资料且提交新密码时才执行操作:
function my_profile_update( $user_id ) { // 1. 保持你原来的前台操作判断 // 2. 确认是编辑个人资料的请求(排除WooCommerce下单场景) // 3. 检查是否存在非空的新密码输入 if ( ! is_admin() && isset( $_POST['action'] ) && $_POST['action'] === 'edit_profile' && isset( $_POST['password_1'] ) && ! empty( $_POST['password_1'] ) ) { update_user_meta($user_id, 'user_pass2', password_hash($_POST['password_1'], PASSWORD_DEFAULT)); } } add_action( 'profile_update', 'my_profile_update' );
为什么这么改?
$_POST['action'] === 'edit_profile':只有用户在前台「编辑个人资料」页面提交表单时,这个action值才会出现,WooCommerce下单的请求绝不会触发这个条件。- 检查
$_POST['password_1']存在且非空:确保只有用户确实输入了新密码时,才去更新user_pass2,彻底避免空值覆盖的问题。
这样修改后,代码就只会在用户主动更新个人资料并提交新密码时运行,完美避开WooCommerce下单的误触发场景啦!
内容的提问来源于stack exchange,提问作者zEn feeLo
相关产品推荐
相关产品推荐

