(Woocommerce) Comment obtenir l'utilisateur appartenant à une commande? [fermé]

20

Je suis en train de créer une fonction qui doit être appelée après l’achèvement d’une commande dans WooCommerce. Pour cela, j'utilise le hook * 'woocommerce_order_status_completed' *. Je souhaite vérifier si la commande a un produit appartenant à une catégorie de produit spécifique. Si tel est le cas, l'utilisateur sera ajouté à un groupe au sein de Wordpress. Pour gérer la logique de groupe, je me sers de l'API d'un autre plugin. Cette méthode nécessite * group_id * et * user_id *. La seule chose qui me manque, c'est d'obtenir le * user_id *.

Comment obtenir l'utilisateur (en détail: l'identifiant) depuis ma commande WooCommerce?

code:

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

    foreach($items as $item) {
        $product = $order->get_product_from_item($item);
        $has_membership_product = has_term('Lidmaatschap','product_cat',$product->post);

        if($has_membership_product) {
            break;
        }
    }

    $group = Groups_Group::read_by_name('ISA Leden');

    if(!group) {
        return; // TODO: Add error message + email?
    }

    $user_id = 0 // TODO: Get user id from order.

    $user_group = array(
        "user_id" => $user_id,
        "group_id" => $group->group_id
    );

    $result = Groups_User_Group::create($user_group);

    if(!result) {
        return; // TODO: Add error message + email?
    }

}

Détails techniques:

Version WordPress: 3.8

Version WooCommerce: 2.1

    
posée Nazeem 16.03.2014 - 12:31

1 réponse

30

Dans la méthode __get() de la classe WC_Order , vous pouvez voir que la propriété user_id est extraite de / stockée sous la forme _customer_user post meta pour la commande en question.

/**
 * __get function.
 *
 * @access public
 * @param mixed $key
 * @return mixed
 */
public function __get( $key ) {
    // Get values or default if not set
    if ( 'completed_date' == $key ) {
        $value = ( $value = get_post_meta( $this->id, '_completed_date', true ) ) ? $value : $this->modified_date;
    } elseif ( 'user_id' == $key ) {
        $value = ( $value = get_post_meta( $this->id, '_customer_user', true ) ) ? absint( $value ) : '';
    } else {
        $value = get_post_meta( $this->id, '_' . $key, true );
    }

    return $value;
}

Ainsi, dans votre code, vous pouvez saisir l'identifiant de l'utilisateur comme suit:

$order = new WC_Order( $order_id );
$user_id = $order->user_id;

Je suppose que vous n'allez pas autoriser le paiement en tant qu'invité, mais vous souhaiterez peut-être une sorte de solution de secours au cas où il n'y aurait pas d'identifiant d'utilisateur.

Mise à jour pour WooCommerce 3.0

Ne tenez pas compte de tout ce qui précède. Comme indiqué dans les commentaires, il existe des méthodes directes pour obtenir cette information. En fait, presque toutes les "méthodes magiques" ont été supprimées et l'accès direct aux propriétés des objets émettra des avertissements PHP.

$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();
    
réponse donnée helgatheviking 16.03.2014 - 14:08

Lire d'autres questions sur les étiquettes