(WooCommerce) Come ottenere l'utente appartenente a un ordine?

16 mar 2014, 13:31:25
Visualizzazioni: 78.9K
Voti: 29

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

0
Tutte le risposte alla domanda 1
2
41

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

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.

Nabil Kadimi Nabil Kadimi
1 gen 2015 18:00:25

fai attenzione quando l'ordine appartiene a un ospite, get_user_id restituirà 0

Vincent Guesné Vincent Guesné
24 ott 2019 20:40:39