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

23

Je crée une fonction qui doit être appelée après la fin d'une commande dans WooCommerce. Pour cela, j'utilise le crochet * 'woocommerce_order_status_completed' *. Je souhaite vérifier si la commande comporte un produit appartenant à une catégorie de produit spécifique. Si tel est le cas, l'utilisateur sera ajouté à un groupe dans Wordpress. Pour gérer la logique de groupe, j'utilise l'API d'un autre plugin. Cette méthode a besoin du * group_id * et du * user_id *. La seule chose qui me manque est d'obtenir le * user_id *.

Comment puis-je obtenir l'utilisateur (en détail: l'identifiant) de 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

Nazeem
la source

Réponses:

33

À partir de la __get()méthode de la WC_Orderclasse, vous pouvez voir que la user_idpropriété est prise / stockée en tant que _customer_userméta-post pour l'ordre 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'ID utilisateur comme suit:

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

Je suppose que vous n'autorisez pas le paiement en tant qu'invité, mais vous voudrez peut-être une sorte de solution de rechange au cas où il n'y aurait pas d'ID utilisateur.

Mise à jour pour WooCommerce 3.0

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

$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();
helgatheviking
la source
7
La WC_Orderclasse WooCommerce est livrée avec get_user()qui renvoie l'objet utilisateur ou falsepour les invités et get_user_id()qui renvoie l'ID utilisateur ou zéro pour les invités ... Vous n'avez plus à vous soucier d'un rappel si vous les utilisez.
Nabil Kadimi du
1
méfiez-vous lorsque la commande appartenant à l'invité sur get_user_id renverra 0
Vincent Guesné