【发布时间】:2021-03-20 00:05:23
【问题描述】:
将 WooCommerce 和 Wordpress 更新到最新版本后,我有一些工作代码停止工作:
function rl_save_extra_register_fields($customer_id){
if(isset($_POST['billing_first_name'])){ update_user_meta($customer_id,'first_name',sanitize_text_field($_POST['billing_first_name']));
// Update user role
$user = new WP_User($customer_id);
$user->set_role('customer_pending');
}
add_action('woocommerce_created_customer','rl_save_extra_register_fields');
我用额外的字段扩展了普通用户注册表,并想更改用户角色。 以前的代码可以工作,现在用户数据没有更新。
我检查/测试的内容:
- 确保我的函数触发
- 确保使用正确的 $customer_id
- 确保没有其他内容使用相同的操作并覆盖我的更改(已转储 $wp_filter['woocommerce_created_customer'])
然后我查看了 Woo 代码——没有什么特别的。(函数 wc_create_new_customer()) 用于创建用户的标准 WP 函数和插入数据库的用户 ID 被传递给操作。应该可以,但是不行。
我尝试通过“woocommerce_created_customer”过滤器更改用户角色,这很有效。
我还尝试创建一个 WC_Customer 对象而不是 WP_User:
$user = new WC_Customer($customer_id);
$user->set_role('customer_pending');
任何想法为什么我的代码停止工作并且无法通过“woocommerce_created_customer”操作更改用户数据?
有人可以在这里解释一下吗?
编辑:附加信息 谢谢各位cmets 我现在可以使用该功能,但我讨厌它并且仍然不明白发生了什么。
首先,回答一些建议:
- 用户创建正常。没有错误
- 我的额外“customer_pending”角色也存在并且有效。
这里有更多信息以及我现在是如何“破解”它的。 调查结果:
- 用户已创建,挂钩中使用了正确的用户 ID。
- “first_name”元数据在该用户的数据库中出现两次(在 wp_user_meta 表中)。这很奇怪,因为“update_user_meta()”函数应该只在元不存在的情况下创建元。其中一个填充了我的数据,一个没有。
- 已添加
update_user_meta($customer_id,'test_meta',"TEST");
此元数据正在为正确的用户插入到数据库中。
- 我尝试使用“user_register”挂钩而不是“woocommerce_created_customer”。这是新用户创建的 WP 钩子。结果是一样的,所以这让我觉得问题可能出在 Wordpress 本身,而不是 Woo。但请继续阅读
在 Woo 调用“woocommerce_created_customer”操作之前,它会插入 WP 用户并将一些数据传递给此创建。可以通过过滤器“woocommerce_new_customer_data”在用户创建前访问此数据。当我在此过滤器中设置新角色时,它被正确分配。名字也一样。 代码是:
function rl_new_customer_role($args)
{
$args['role'] = 'customer_pending';
error_log(var_export($_POST,true));
if(isset($_POST['billing_first_name'])){
$args['first_name'] = sanitize_text_field($_POST['billing_first_name']);
$args['billing_first_name'] = sanitize_text_field($_POST['billing_first_name']);
}
return $args;
}
add_filter('woocommerce_new_customer_data', 'rl_new_customer_role');
但是...上面的代码不适用于“billing_post_name”字段。该字段甚至不存在于数据库中。 原始代码正确地插入了这个字段。 最后,我不得不拆分钩子更新的数据和过滤器更新的数据,以获得所需的功能。这是一个糟糕的解决方案,因为我不明白为什么事情会以这种方式发生。
这感觉就像某种竞争条件,用户元在它应该准备好的时候还没有准备好。
【问题讨论】:
-
请检查我的答案,如有任何问题,请告诉我。
-
woocommerce_created_customer钩子是正确的。但是,如果之前的wp_insert_user()函数返回错误,则不会触发。通过转到 Wordpress > 用户 > 所有用户或直接检查数据库(通过已知字段,例如电子邮件),确保正确创建用户。 Here 您将找到有关 Wordpress wp_insert_user () 函数的文档。
标签: wordpress woocommerce hook-woocommerce