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 dans 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 puis-je 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
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
méta-poste 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;
}
Donc, 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 présume que vous n'autoriserez 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'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 de l'objet génère des avertissements PHP.
$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();