(WooCommerce) Come ottenere l'utente appartenente a un ordine?
Sto creando una funzione che deve essere chiamata dopo che un ordine è stato completato in WooCommerce. Per questo sto utilizzando l'hook *'woocommerce_order_status_completed'*. Voglio verificare se l'ordine contiene un prodotto appartenente a una specifica categoria di prodotti. In tal caso, l'utente verrà aggiunto a un gruppo all'interno di WordPress. Per gestire la logica dei gruppi, sto utilizzando l'API di un altro plugin. Questo metodo necessita del *group_id* e dello *user_id*. L'unica cosa che mi manca è ottenere lo *user_id*.
Come posso ottenere l'utente (in dettaglio: l'id) dal mio ordine WooCommerce?
codice:
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: Aggiungi messaggio di errore + email?
}
$user_id = 0 // TODO: Ottieni l'id utente dall'ordine.
$user_group = array(
"user_id" => $user_id,
"group_id" => $group->group_id
);
$result = Groups_User_Group::create($user_group);
if(!result) {
return; // TODO: Aggiungi messaggio di errore + email?
}
}
Dettagli tecnici:
Versione WordPress: 3.8
Versione WooCommerce: 2.1

Dal metodo __get()
nella classe WC_Order
si può vedere che la proprietà user_id
viene presa/archiviata come meta post _customer_user
per l'ordine in questione.
/**
* __get function.
*
* @access public
* @param mixed $key
* @return mixed
*/
public function __get( $key ) {
// Ottieni valori o default se non impostati
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;
}
Quindi nel tuo codice puoi ottenere l'ID utente in questo modo:
$order = new WC_Order( $order_id );
$user_id = $order->user_id;
Presumo che non permetterai il checkout come ospite, ma potresti voler avere un fallback nel caso in cui non ci sia un ID utente.
Aggiornamento per WooCommerce 3.0
Ignora tutto quanto sopra. Come sottolineato nei commenti, ci sono metodi diretti per ottenere queste informazioni. In effetti, quasi tutti i "metodi magici" sono stati rimossi e accedere direttamente alle proprietà degli oggetti genererà avvisi PHP.
$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();

La classe WC_Order
di WooCommerce include get_user()
che restituisce l'oggetto utente o false
per gli ospiti e get_user_id()
che restituisce l'ID utente o zero per gli ospiti... Non devi più preoccuparti di un callback se usi questi metodi.
