Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.


I'm using wordpress with woocommerce, and I would like to automate the following step. When an order is completed, I would like to change the user role associated with that order id from 'customer' to 'subscriber'.

By searching around, I think I should be able to accomplish this by using a hook in functions.php:

add_action( 'woocommerce_order_status_completed', 'change_role_from_customer_to_subscriber' );

Then add the function:

function change_role_from_customer_to_subscriber($order_id){
// code to change role to subscriber

In the code, I think I need to do 2 things: 1) get the user id that is associated with that order id 2) change role of that user id to subscriber

I've tried a lot, but I couldn't get it to work (neither getting the right user id, nor changing the role of a user id). So any help would be appreciated! I've seen 2 related questions asked before on stack overflow, but unfortunately the answers there did not work for me. I hope someone can help me out!

Thanks a lot! :)

Edit: Someone helped me out with the second part of the problem, so that's great news for me :)

Unfortunately, I still haven't figured out the first part: how to get the user id that is associated with the order id. Any ideas?

share|improve this question
Why don't you include something of what you tried so far to give us a starting point? Maybe you almost did it and there's only a small piece missing or wrong... –  t f Oct 30 '13 at 14:20
Great idea! First thing I tried: $user = get_user_by( 'email', 'myemailaddress' ); $u = new WP_User( $user ); $u->remove_role( 'customer' ); $u->add_role( 'subscriber' ); –  Rostam Oct 30 '13 at 14:30
Second thing I tried: $user = get_user_by_email( 'myemailaddress' ); $u= new WP_User($user); $u->set_role('subscriber'); –  Rostam Oct 30 '13 at 14:33
Edit your question to post the code, it is really hard to read code in the comments. –  helgatheviking Oct 30 '13 at 17:40

1 Answer 1

up vote 1 down vote accepted

Looking through the code there is a very relevant example:

function woocommerce_paying_customer( $order_id ) {

    $order = new WC_Order( $order_id );

    if ( $order->user_id > 0 ) {

        $old_spent = absint( get_user_meta( $order->user_id, '_money_spent', true ) );
        update_user_meta( $order->user_id, '_money_spent', $old_spent + $order->order_total );

        $old_count = absint( get_user_meta( $order->user_id, '_order_count', true ) );
        update_user_meta( $order->user_id, '_order_count', $old_count + 1 );
add_action( 'woocommerce_order_status_completed', 'woocommerce_paying_customer' );

which reminds us that the $order_is passed to the woocommerce_order_status_completed hook. From the $order_id, you can create a new order object, with the user_id as a property.

Armed with that knowledge, I think we can just fix the inner guts of the function get a new user object from that user ID, and remove the old role and finally apply the new role.

function wpa_120656_convert_paying_customer( $order_id ) {

    $order = new WC_Order( $order_id );

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

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

        // Add role
        $user->add_role( 'subscriber' );
add_action( 'woocommerce_order_status_completed', 'wpa_120656_convert_paying_customer' );
share|improve this answer
Thank you! But unfortunately, it's not working. I'm new to PHP (and coding in general), any ideas on how to debug the code and see where things go wrong? –  Rostam Oct 30 '13 at 18:11
Bummer. I have to admit that I didn't test it, but it seemed like a reasonable approach. There are probably better ways to debug, but I'd step through with a die('some info'); after every line... printing out the variables to see where it is failing. –  helgatheviking Oct 30 '13 at 21:30
The strangest thing just happened: I was reading through my error logs, and tried your script again... and now it worked! Thank you so much, I'm very happy :) –  Rostam Oct 30 '13 at 21:58
Well cool! I removed the line about updating the user meta since Woo is handling that and I just forgot to delete it when copying their function. –  helgatheviking Oct 30 '13 at 23:12

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.