2014-04-03 9 views
16

Ho una funzione che fa questo:Come ottenere i dettagli del cliente da ordine in WooCommerce?

$order = new WC_Order($order_id); 
$customer = new WC_Customer($order_id); 

Come posso ottenere dati dei clienti di questo ?. Ho provato di tutto nella documentazione, ma in qualche modo, solo alcuni dettagli sono presenti ma il resto arent, per esempio

$data['Address'] = $customer->get_address() . ' ' . $customer->get_address_2(); 
$data['ZipCode'] = $customer->get_postcode(); 

è vuoto.

Facendo

var_dump($customer) 

produce:

oggetto (WC_Customer) # 654 (2) {[ "_data": protected] => array (14) {[ "paese"] = > string (2) "IT"> ["stato"] => stringa (0) "" ["codice postale"] => stringa (0) "" ["città"] => stringa (0) "" [" indirizzo "] =>> stringa (0)" "[" indirizzo_2 "] => stringa (0)" "[" shipping_country "] => stringa (2)" IT " [" shipping_state "] => stringa (2) "BG" ["shipping_postcode"] => string (0) "" ["shipping_city"] =>> string (0) "" ["shipping_address"] => string (0) "" ["shipping_address_2"] = > st ring (0) "" ["is_vat_exempt"] => bool (false) ["calculate_shipping"] => bool (false)}? [ "_changed": "WC_Customer": private] => bool (false)}

Come si può vedere, la città è presente, ma il resto sono vuoti. Ho controllato il WP_usermeta e nel pannello di amministrazione del cliente e tutti i dati sono lì.

Qualche idea?

risposta

17

Avendo provato $customer = new WC_Customer(); e global $woocommerce; $customer = $woocommerce->customer; I dati dell'indirizzo erano ancora vuoti anche quando ho effettuato l'accesso come utente non amministratore.

mia soluzione è stata la seguente:

function mwe_get_formatted_shipping_name_and_address($user_id) { 

    $address = ''; 
    $address .= get_user_meta($user_id, 'shipping_first_name', true); 
    $address .= ' '; 
    $address .= get_user_meta($user_id, 'shipping_last_name', true); 
    $address .= "\n"; 
    $address .= get_user_meta($user_id, 'shipping_company', true); 
    $address .= "\n"; 
    $address .= get_user_meta($user_id, 'shipping_address_1', true); 
    $address .= "\n"; 
    $address .= get_user_meta($user_id, 'shipping_address_2', true); 
    $address .= "\n"; 
    $address .= get_user_meta($user_id, 'shipping_city', true); 
    $address .= "\n"; 
    $address .= get_user_meta($user_id, 'shipping_state', true); 
    $address .= "\n"; 
    $address .= get_user_meta($user_id, 'shipping_postcode', true); 
    $address .= "\n"; 
    $address .= get_user_meta($user_id, 'shipping_country', true); 

    return $address; 
} 

... e questo codice funziona indipendentemente dal fatto che si è connessi come amministratore o no.

+1

in realtà è stato in qualche modo il metodo che ho seguito per risolvere questo quindi quindi contrassegno questa soluzione come accettata –

+1

E se la persona che ha acquistato i prodotti nell'ordine fosse un ospite sul sito? Come ottenere quell'informazione ora? Non ci sarà user_id –

+0

Sì, non ne sono sicuro. Forse puoi recuperarlo dal loro indirizzo email o (se sei fortunato) dalla sessione. Potrebbe non essere possibile, ma potrebbe valere la pena sollevare come una nuova domanda. :-) –

25

Se desideri particolari del cliente che il cliente era entrato in fase di ordine, quindi è possibile utilizzare seguente codice

$order = new WC_Order($order_id); 
$billing_address = $order->get_billing_address(); 
$billing_address_html = $order->get_formatted_billing_address(); // for printing or displaying on web page 
$shipping_address = $order->get_shipping_address(); 
$shipping_address_html = $order->get_formatted_shipping_address(); // for printing or displaying on web page 

Oltre a questo, $customer = new WC_Customer($order_id); non si può ottenere i dettagli del cliente

Prima di tutto, new WC_Customer() doesn 't prendere qualsiasi argomento

In secondo luogo, WC_Customer otterrà i dettagli del cliente solo quando l'utente è connesso & lui/lei non è sul lato admin, instea lui/lei dovrebbe essere sul front-end del sito web come 'Il mio account', 'Negozio', 'Carrello', 'Paga' pagina

Spero che queste informazioni saranno utili.

+0

Ma non c'è modo di accedere direttamente alle informazioni memorizzate in wp_usermeta tramite woocommerce? potrebbe essere una possibilità di far uscire l'id utente dall'ID ordine ?. –

+6

È possibile utilizzare questo codice per ottenere l'ID utente dall'ID ordine $ user_id = get_post_meta ($ order_id, '_customer_user', true); –

+0

Ho lo stesso problema dell'OP, ma ottengo comunque un indirizzo vuoto anche quando sono registrato come utente non amministratore. Ho provato '$ cliente = nuovo WC_Customer();' e 'global $ woocommerce; $ cliente = $ woocommerce-> cliente; 'ma entrambi mi lasciano ancora informazioni sull'indirizzo vuoto. –

3

Questo accade perché l'estratto WC_Customer non contiene i dati degli indirizzi di blocco (tra gli altri dati) tranne all'interno di una sessione. Questi dati vengono memorizzati tramite le pagine carrello/checkout, ma di nuovo, solo nella sessione (per quanto riguarda la classe WC_Customer).

Se si dà un'occhiata a come la pagina di checkout ottiene i dati del cliente, si segue per il metodo della classe WC_Checkout get_value, che tira direttamente fuori user meta. Faresti bene a seguire lo stesso modello :-)

3
$customer_id = get_current_user_id(); 
print get_user_meta($customer_id, 'billing_first_name', true); 
+1

Si prega di aggiungere un commento alla vostra risposta –

+0

Questo funziona in quanto otterrà variabili cliente. Semplicemente querys i dettagli del cliente WC. –

0

get ID cliente da oggetto ordine

$order = new WC_Order($order_id); 

// here the customer data 
$customer = get_userdata($order->customer_user); 
echo $customer->display_name; 
3

Stavo cercando qualcosa di simile. Funziona bene. Così ottenere il numero di cellulare nel plug woocommerce come questo -

$customer_id = get_current_user_id(); 
print get_user_meta($customer_id, 'billing_phone', true); 
7

Anche se, questo non può essere consigliabile

Se si desidera ottenere Dettagli cliente. Anche quando l'utente non crea un account, ma crea solo un ordine. Potresti semplicemente interrogarlo, direttamente dal database.

Anche se, ci possono essere problemi di prestazioni, interrogando direttamente, ma questo funziona sicuramente al 100%

È possibile cercare per post_id e meta_keys

global $wpdb; // Get the global $wpdb 
$order_id = {Your Order Id} 

$table = $wpdb->prefix . 'postmeta'; 
$sql = 'SELECT * FROM `'. $table . '` WHERE post_id = '. $order_id; 

     $result = $wpdb->get_results($sql); 
     foreach($result as $res) { 
      if($res->meta_key == '_billing_phone'){ 
        $phone = $res->meta_value;  // get billing phone 
      } 
      if($res->meta_key == '_billing_first_name'){ 
        $firstname = $res->meta_value; // get billing first name 
      } 

      // You can get other values 
      //_billing_last_name 
      // _billing_email 
      // _billing_country 
      // _billing_address_1 
      // _billing_address_2 
      // _billing_postcode 
      // _billing_state 

      // _customer_ip_address 
      // _customer_user_agent 

      // _order_currency 
      // _order_key 
      // _order_total 
      // _order_shipping_tax 
      // _order_tax 

      // _payment_method_title 
      // _payment_method 

      // _shipping_first_name 
      // _shipping_last_name 
      // _shipping_postcode 
      // _shipping_state 
      // _shipping_city 
      // _shipping_address_1 
      // _shipping_address_2 
      // _shipping_company 
      // _shipping_country 
     } 
5

WooCommerce "Ordini" sono solo un tipo di messaggio personalizzato, quindi tutti gli ordini sono memorizzati in wp_posts e le sue informazioni sugli ordini sono archiviate nelle tabelle wp_postmeta.

Se desideri ottenere qualsiasi dettaglio su "Ordine" di WooCommerce, puoi utilizzare il seguente codice.

$order_meta = get_post_meta($order_id); 

Il codice sopra riportato restituisce un array di informazioni "Ordine" di WooCommerce. È possibile utilizzare tali informazioni come mostrato di seguito:

$shipping_first_name = $order_meta['_shipping_first_name'][0]; 

Per visualizzare tutti i dati presenti nella matrice "$ order_meta". È possibile utilizzare il seguente codice:

print("<pre>"); 
print_r($order_meta); 
print("</pre>"); 
3

Un po 'in ritardo, ma ho appena affrontato questo e ho trovato questo post. A seconda di cosa si vuole veramente, è possibile ottenere i dettagli dall'ordine in questo modo:

$field = get_post_meta($order->id, $field_name, true); 

Dove $ field_name è '_billing_address_1' o '_shipping_address_1'or '_first_name'. Puoi google gli altri campi, ma non dimenticare il "_" all'inizio.

Se si desidera recuperare il cliente per questo ordine, e ottenere è campo direttamente, funziona come nella soluzione, a meno che non è necessario per recuperare l'oggetto cliente completo:

$customer_id = (int)$order->user_id; 

$field= get_user_meta($customer_id, $field_name,true) 

; Ora, in questo caso, il $ field_name non inizia con "_" Per esempio: 'first_name', e 'billing_address_1'

3

Forse un'occhiata alla classe di Woocomerce Order?Ad esempio, per ottenere l'indirizzo di posta elettronica del cliente:

$order = new WC_Order($order_id); 
echo $order->get_billing_email(); 

Solo un pensiero ...

0

Questa è una vecchia questione, e non ho trovato una grande risposta qui, ma sono riuscito a capirlo.

$order_meta = get_post_meta($order_id); 
$email   = $order_meta["_shipping_email"][0] ?: $order_meta["_billing_email"][0]; 

mi conosce sa con certezza se e-mail la spedizione fa parte dei metadati, ma se è così avrei preferito esso che l'e-mail di fatturazione - almeno per i miei scopi.

1

E un altro esempio per ottenere i dettagli del cliente dal database:

$order = new WC_Order($order_id); 
$order_detail['status']    = $order->get_status(); 
$order_detail['customer_first_name'] = get_post_meta($order_id, '_billing_first_name', true); 
$order_detail['customer_last_name'] = get_post_meta($order_id, '_billing_last_name', true); 
$order_detail['customer_email']  = get_post_meta($order_id, '_billing_email', true); 
$order_detail['customer_company'] = get_post_meta($order_id, '_billing_company', true); 
$order_detail['customer_address'] = get_post_meta($order_id, '_billing_address_1', true); 
$order_detail['customer_city']  = get_post_meta($order_id, '_billing_city', true); 
$order_detail['customer_state']  = get_post_meta($order_id, '_billing_state', true); 
$order_detail['customer_postcode'] = get_post_meta($order_id, '_billing_postcode', true); 
0

Qui in LoicTheAztec's answer viene mostrato come recuperare queste informazioni.

Solo per Woocommerce V3.0 +

In sostanza, è possibile chiamare

// Get an instance of the WC_Order object 
$order = wc_get_order($order_id); 

Ciò restituirà un array per i dati dell'ordine di fatturazione, tra cui fatturazione e spedizione proprietà. Esploralo con var_dump-it. Ecco un esempio:

$order_billing_data = array(
    "first_name" => $order_data['billing']['first_name'], 
    "last_name" => $order_data['billing']['last_name'], 
    "company" => $order_data['billing']['company'], 
    "address_1" => $order_data['billing']['address_1'], 
    "address_2" => $order_data['billing']['address_2'], 
    "city" => $order_data['billing']['city'], 
    "state" => $order_data['billing']['state'], 
    "postcode" => $order_data['billing']['postcode'], 
    "country" => $order_data['billing']['country'], 
    "email" => $order_data['billing']['email'], 
    "phone" => $order_data['billing']['phone'], 
); 

Saluti.