(WooCommerce) Cum obții utilizatorul aparținând unei comenzi?
Creez o funcție care trebuie apelată după ce o comandă este finalizată în WooCommerce. Pentru aceasta folosesc hook-ul *'woocommerce_order_status_completed'*. Vreau să verific dacă comanda are un produs care aparține unei categorii specifice de produse. Dacă este cazul, utilizatorul va fi adăugat într-un grup în WordPress. Pentru a gestiona logica grupului, folosesc API-ul unui alt plugin. Această metodă necesită *group_id* și *user_id*. Singurul lucru care îmi lipsește este obținerea *user_id*-ului.
Cum pot obține utilizatorul (mai exact: id-ul) dintr-o comandă WooCommerce?
cod:
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: Adaugă mesaj de eroare + email?
}
$user_id = 0 // TODO: Obține id-ul utilizatorului din comandă.
$user_group = array(
"user_id" => $user_id,
"group_id" => $group->group_id
);
$result = Groups_User_Group::create($user_group);
if(!result) {
return; // TODO: Adaugă mesaj de eroare + email?
}
}
Detalii tehnice:
Versiune WordPress: 3.8
Versiune WooCommerce: 2.1

Din metoda __get()
din clasa WC_Order
se poate observa că proprietatea user_id
este preluată/stocată ca metadate a postării _customer_user
pentru comanda în cauză.
/**
* __get function.
*
* @access public
* @param mixed $key
* @return mixed
*/
public function __get( $key ) {
// Obține valori sau valoare implicită dacă nu este setată
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;
}
Deci, în codul tău poți obține ID-ul utilizatorului astfel:
$order = new WC_Order( $order_id );
$user_id = $order->user_id;
Presupun că nu vei permite finalizarea comenzii pentru vizitatori (guest checkout), dar poate dorești să adaugi o rezervă în cazul în care nu există un ID de utilizator.
Actualizare pentru WooCommerce 3.0
Ignoră tot ce s-a scris mai sus. După cum s-a menționat în comentarii, acum există metode directe pentru obținerea acestei informații. De fapt, aproape toate "metodele magice" au fost eliminate, iar accesarea directă a proprietăților obiectului va genera avertismente PHP.
$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();

Clasa WooCommerce WC_Order
vine cu get_user()
care returnează obiectul utilizatorului sau false
pentru vizitatori și get_user_id()
care returnează ID-ul utilizatorului sau zero pentru vizitatori... Nu mai trebuie să vă faceți griji cu privire la un callback dacă utilizați aceste metode.
