You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:31:58