在WooCommerce的「我的账户>编辑账户」页面实现无需输入当前密码即可修改密码
如何在WooCommerce中禁用账户修改时的「当前密码」验证
我完全懂你的困扰——用户忘密码就没法改账户密码,光删模板里的字段根本没用,因为WooCommerce的验证逻辑在后端,根本不是靠前端的required属性卡着。下面给你一套完整的解决方案:
步骤1:移除前端的「当前密码」字段(你已经完成,再确认下)
把主题里的form-edit-account.php中对应「当前密码」的这段代码删掉:
<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide"> <label for="password_current"><?php esc_html_e( 'Current password (leave blank to leave unchanged)', 'woocommerce' ); ?></label> <input type="password" class="woocommerce-Input woocommerce-Input--password input-text" name="password_current" id="password_current" autocomplete="off" /> </p>
步骤2:禁用后端的当前密码验证
只改前端没用,WooCommerce会在后端强制验证当前密码(尤其是用户要改密码的时候)。你需要在主题的functions.php文件或者自定义插件里添加以下代码:
代码1:移除当前密码的必填要求
add_filter( 'woocommerce_save_account_details_required_fields', 'remove_current_password_requirement' ); function remove_current_password_requirement( $required_fields ) { // 从必填字段列表中移除当前密码 unset( $required_fields['password_current'] ); return $required_fields; }
代码2:跳过当前密码的正确性验证
哪怕移除了必填要求,用户提交新密码时,WooCommerce还是会检查当前密码是否匹配。这段代码帮你跳过这个验证:
add_action( 'woocommerce_save_account_details_validation', 'skip_current_password_check', 10, 2 ); function skip_current_password_check( $errors, $user ) { // 移除任何关于当前密码的错误提示 $errors->remove( 'password_current' ); // 用户输入新密码时,直接允许更新(WooCommerce会自动验证新密码和确认密码是否匹配) return $errors; }
可选:直接接管密码更新(更稳妥)
如果上面的代码还有问题,你可以直接接管密码更新逻辑,完全绕过WooCommerce的默认验证:
add_action( 'woocommerce_save_account_details', 'custom_update_user_password', 10, 1 ); function custom_update_user_password( $user_id ) { // 检查新密码和确认密码是否填写且一致 if ( ! empty( $_POST['password_1'] ) && $_POST['password_1'] === $_POST['password_2'] ) { // 直接更新用户密码,不需要验证当前密码 wp_set_password( $_POST['password_1'], $user_id ); wc_add_notice( __( '你的密码已成功更新。', 'woocommerce' ), 'success' ); } }
为什么之前的方法没用?
WooCommerce的账户修改验证是通过PHP钩子(比如woocommerce_save_account_details_validation)实现的,和前端表单的required属性无关。你只修改前端模板,后端的验证逻辑依然会运行,所以系统还是会要求提供当前密码。
把这些代码加上后,用户就可以直接修改密码,不需要输入当前密码了。
内容的提问来源于stack exchange,提问作者Snorlax
相关产品推荐
相关产品推荐

