Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Woocommerce change user role on purchase

I am trying to use this snippet of code to update my users from the default role of 'Subscriber' to the role of 'Premium' on the purchase of a product from my store.

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( '416' );

foreach ( $items as $item ) {
    if ( $order->user_id > 0 && in_array( $item['product_id'], $products_to_check ) ) {
        $user = new WP_User( $order->user_id );

        // Change role
        $user->remove_role( 'Subscriber' );
        $user->add_role( 'Premium' );

        // Exit the loop
        break;
    }
}
}

I only have 1 product in my store and it has the product ID 416 (which I have inserted in the code).

I have put this into functions.php, but i'm not having any luck. The role isn't being updated after any successful purchase. Any ideas?

like image 756
googleyberry Avatar asked Sep 14 '25 04:09

googleyberry


2 Answers

Have a try with this one:

function change_role_on_purchase( $order_id ) {

    $order = new WC_Order( $order_id );
    $items = $order->get_items();

    foreach ( $items as $item ) {
        $product_name = $item['name'];
        $product_id = $item['product_id'];
        $product_variation_id = $item['variation_id'];

        if ( $order->user_id > 0 && $product_id == '416' ) {
            update_user_meta( $order->user_id, 'paying_customer', 1 );
            $user = new WP_User( $order->user_id );

            // Remove role
            $user->remove_role( 'subscriber' ); 

            // Add role
            $user->add_role( 'premium' );
        }
    }
}

add_action( 'woocommerce_order_status_processing', 'change_role_on_purchase' );
like image 69
jjj Avatar answered Sep 16 '25 18:09

jjj


In case someone is interested in this. If your customer wants to have in the future more products that will update the buyers role after purchase, instead of manually adding the product ids in the function, you can use this one

$products_to_check = wc_get_products( array( 'return' => 'ids', 'tag' => array('your tag here') ) );

Your customer can edit by him/herself a product and assign the product tag, that will allow the update of the user role.

like image 25
Zisis Paparidis Avatar answered Sep 16 '25 16:09

Zisis Paparidis