web-dev-qa-db-fra.com

Woocommerce: changer de rôle d'utilisateur une fois la commande terminée

:)

J'utilise wordpress avec woocommerce et j'aimerais automatiser l'étape suivante. Quand une commande est terminée, je souhaite changer le rôle d'utilisateur associé à cet ID de commande de "client" à "abonné".


En cherchant autour de moi, je pense que je devrais pouvoir y arriver en utilisant un crochet dans functions.php:

add_action( 'woocommerce_order_status_completed', 'change_role_from_customer_to_subscriber' );

Ajoutez ensuite la fonction:

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

Dans le code, je pense que j'ai besoin de faire 2 choses: 1) obtenir l'ID utilisateur associé à cet ID d'ordre 2) changer le rôle de cet ID utilisateur en abonné


J'ai beaucoup essayé, mais je ne pouvais pas le faire fonctionner (ni obtenir le bon identifiant, ni changer le rôle d'un identifiant). Donc, toute aide serait appréciée! J'ai déjà vu 2 questions liées déjà posées sur le dépassement de capacité de la pile, mais malheureusement, les réponses n'y ont pas fonctionné. J'espère que quelqu'un pourra m'aider!

Merci beaucoup! :)



Edit: Quelqu'un m'a aidé avec la deuxième partie du problème, donc c'est une excellente nouvelle pour moi :)

Malheureusement, je n'ai toujours pas compris la première partie: comment obtenir l'ID utilisateur associé à l'ID de commande. Des idées?

2
Rostam

En parcourant le code, il y a un exemple très pertinent:

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

ce qui nous rappelle que le $ order_is est passé au hook woocommerce_order_status_completed. A partir de $ order_id, vous pouvez créer un nouvel objet de commande, avec le user_id en tant que propriété.

Fort de cette connaissance, je pense que nous pouvons simplement corriger les entrailles de la fonction, obtenir un nouvel objet utilisateur à partir de cet ID utilisateur, supprimer l'ancien rôle et enfin appliquer le nouveau rôle.

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' );
3
helgatheviking