在购买时更改WooCommerce中的用户角色

时间:2017-10-30 01:18:29

标签: php wordpress woocommerce

我正在使用两种产品类型的WooCommerce。我需要其中一些($ products_to_check)来创建一个特定的角色帐户(订阅者),其余的一个(客户,这是WooCommerce的默认帐户)。

问题是,如果我有一个已经是客户的用户,我不希望他将其角色更改为订阅者(因此我检查他是否已登录,这意味着他不是新客户并且之前已定义角色)。另一方面,如果订户购买了一个未包含在$ products_to_check中的产品,他应该进行角色升级(从订户到客户)。

这是我的功能,但不起作用,但我不知道原因。

add_action( 'woocommerce_order_status_completed', 'change_role_on_purchase' );
function change_role_on_purchase( $order_id ) {
    $order = wc_get_order( $order_id );
    $items = $order->get_items();

    $products_to_check = array( ... );

    $user = new WP_User( $order->user_id );
    $user_meta = get_userdata( $order->user_id );
    $user_roles = $user_meta->roles;

    foreach ( $items as $item ) {
        if ( $order->user_id > 0 && in_array( $item['product_id'], $products_to_check ) ) {
                if (!is_user_logged_in()){
                        $user->set_role( 'subscriber' );
                }
        }
        elseif ( $order->user_id > 0 && !(in_array( $item['product_id'], $products_to_check)) ) {
                if (is_user_logged_in() && in_array('subscriber', $user_roles)){
                        $user->set_role( 'customer' );
                }
        }
    }
}

我真的很感激这个问题的任何帮助。我做错了什么?

1 个答案:

答案 0 :(得分:1)

您需要注意以下几点。

  1. 确保在覆盖或覆盖WooCommerce或任何其他插件之后调用挂钩'设置用户角色的钩子。
  2. 请勿使用您的登录条件来检查用户是否是新用户。 user_register是用于新注册用户的钩子。
  3. 你的角色逻辑循环也存在缺陷。您正在遍历所有产品订单并尝试在每次迭代时设置角色。这显然意味着如果条件满足并且可以覆盖先前的迭代,则每次迭代都可以更改用户角色。 (虽然看起来你希望你的登录状态可以解决问题,但我认为即使它可能有效也很容易出错。)
  4. WooCommerce订阅插件实际上将订阅者角色设置为具有有效订阅的用户和已过期订阅用户的客户角色。这是可配置的,但我认为这是一个更明确的任务。
  5. 首先确保你的钩子触发或覆盖WooCommerce用户角色钩子。而且我认为你可以完全取消新的或旧的用户逻辑,因为唯一重要的是他们是否购买了要升级它们的产品;如果没有,他们应该有默认角色。