【问题标题】:User changes don't work after creating a new user in WooCommerce在 WooCommerce 中创建新用户后,用户更改不起作用
【发布时间】: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');

我用额外的字段扩展了普通用户注册表,并想更改用户角色。 以前的代码可以工作,现在用户数据没有更新。

我检查/测试的内容:

  1. 确保我的函数触发
  2. 确保使用正确的 $customer_id
  3. 确保没有其他内容使用相同的操作并覆盖我的更改(已转储 $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 我现在可以使用该功能,但我讨厌它并且仍然不明白发生了什么。

首先,回答一些建议:

  1. 用户创建正常。没有错误
  2. 我的额外“customer_pending”角色也存在并且有效。

这里有更多信息以及我现在是如何“破解”它的。 调查结果:

  1. 用户已创建,挂钩中使用了正确的用户 ID。
  2. “first_name”元数据在该用户的数据库中出现两次(在 wp_user_meta 表中)。这很奇怪,因为“update_user_meta()”函数应该只在元不存在的情况下创建元。其中一个填充了我的数据,一个没有。
  3. 已添加
update_user_meta($customer_id,'test_meta',"TEST");

此元数据正在为正确的用户插入到数据库中。

  1. 我尝试使用“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


【解决方案1】:

我只是浏览了您的代码,根据您的代码,如果您获得 billing_first_name 的值没有任何问题,但重点是您的用户角色

您不能先将直接用户添加到 WordPress,您需要创建自定义用户角色,然后设置用户角色,因此添加以下代码。

function wps_add_role()
{
  add_role(
     'customer_pending',
     __('customer pending'),
      array(
         'read'         => true,  // true allows this capability
         'edit_posts'   => true,
       )
   );
}
add_action('init', 'wps_add_role');
function rl_save_extra_register_fields($customer_id){
  if(isset($_POST['billing_first_name'])){  
        // echo 'going in if condition' // for debugging to check your condition is true or not
      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');

【讨论】:

  • 用户角色设置应该在if语句之外,否则只有billing_first_name字段存在时才会设置(这只是一个注释)。同样使用set_role() 方法将删除所有已经存在的用户角色并添加新角色。您应该改用add_role()。请参阅this answer 了解更多信息。
  • 我刚刚更新了原始问题的答案和更多信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多