(Woocommerce) Come ottenere l'utente che appartiene a un ordine? [chiuso]


23

Sto creando una funzione che deve essere chiamata dopo che un ordine è stato completato all'interno di WooCommerce. Per questo sto usando l'hook * 'woocommerce_order_status_completed' *. Voglio verificare se l'ordine ha un prodotto appartenente a una specifica categoria di prodotti. In tal caso, l'utente verrà aggiunto a un gruppo in Wordpress. Per gestire la logica di gruppo, sto usando l'API di un altro plugin. Questo metodo richiede * group_id * e * user_id *. L'unica cosa che mi manca è ottenere * 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: 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?
    }

}

Dettagli tecnici:

Versione di WordPress: 3.8

Versione WooCommerce: 2.1

Risposte:


33

Dal __get()metodo nella WC_Orderclasse puoi vedere che la user_idproprietà è presa / archiviata come _customer_usermeta post per l'ordine in questione.

/**
 * __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;
}

Quindi nel tuo codice puoi prendere l'ID utente in questo modo:

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

Presumo che non consentirai il checkout degli ospiti, ma potresti desiderare un tipo di 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 l'accesso diretto alle proprietà degli oggetti genererà avvisi PHP.

$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();

7
Viene WC_Orderfornita la classe WooCommerce get_user()che restituisce l'oggetto utente o falseper gli ospiti e get_user_id()che restituisce l'id utente o zero per gli ospiti ... Non è più necessario preoccuparsi di una richiamata se si utilizzano quelli.
Nabil Kadimi,

1
attenzione quando l'ordine appartenente all'ospite su get_user_id restituirà 0
Vincent Guesné il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.