(WooCommerce) Cum obții utilizatorul aparținând unei comenzi?

16 mar. 2014, 13:31:25
Vizualizări: 78.9K
Voturi: 29

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

0
Toate răspunsurile la întrebare 1
2
41

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();
16 mar. 2014 15:08:26
Comentarii

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.

Nabil Kadimi Nabil Kadimi
1 ian. 2015 18:00:25

atenție când comanda aparține unui vizitator, get_user_id va returna 0

Vincent Guesné Vincent Guesné
24 oct. 2019 20:40:39