2014-04-03 218 views
16

我有做這樣的功能:從這個如何從WooCommerce的訂單中獲取客戶詳細信息?

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

我怎樣才能得到客戶的詳細資料? 我在文檔都試過了,但不知何故,只是一些細節是存在的,但其餘的arent,例如

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

是空的。

否則

var_dump($customer) 

產地:

對象(WC_Customer)#654(2){[ 「_data」:保護] =>陣列(14){[ 「國」] = > string(2)「IT」> [「state」] => string(0)「」[「postcode」] => string(0)「」[「city」] => string(0)「」[「地址「] =>字符串(0)」「[」address_2「] =>字符串(0)」「[」shipping_country「] =>字符串(2)」IT「 [」shipping_state「] => string(2 )「BG」[「shipping_postcode」] =>字符串(0)「」[「shipping_city」] =>>字符串(0)「」[「shipping_address」] =>字符串(0)「」[「shipping_address_2」] = > st ring(0)「」 [「is_vat_exempt」] => bool(false)[「calculated_shipping」] => bool(false)}? [ 「_changed」: 「WC_Customer」:私人] =>布爾(假)}

正如你所看到的,城市是存在的,但其餘的都是空的。我檢查了WP_usermeta和客戶的管理面板中的所有數據。

有什麼想法?

回答

17

嘗試過$customer = new WC_Customer();global $woocommerce; $customer = $woocommerce->customer;即使我以非管理員用戶身份登錄,我仍然收到空地址數據。

我的解決辦法如下:

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; 
} 

...這代碼工作,無論您登錄爲管理員或沒有。

+1

實際上,這是我遵循的方法來解決這個問題,因此我將此解決方案標記爲已接受 –

+1

如果訂單中購買產品的人是該網站上的訪客,該怎麼辦?如何獲取該信息?將不會有user_id –

+0

是的,我不確定這一點。也許你可以從他們的電子郵件地址或(如果你幸運的話)從會話中檢索它。不可能,但可能值得提出作爲一個新問題。 :-) –

25

如果你想客戶詳細信息的客戶已經進入訂貨時,那麼你可以使用下面的代碼

$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 

除此之外,$customer = new WC_Customer($order_id);不能讓你的客戶的詳細信息

首先,new WC_Customer()沒有按的不接受任何理由

其次,WC_Customer僅在用戶登錄時纔會收到客戶的詳細信息&他/她不在管理員端,instea他/她應該在網站的前端,如「我的帳戶」,「商店」,「購物車」,「結帳」頁面

希望這些信息會有用。

+0

但是沒有辦法通過woocommerce直接訪問存儲在wp_usermeta中的信息?是否有可能將用戶ID從訂單ID中刪除? –

+6

您可以使用此代碼從訂單ID獲取用戶標識$ user_id = get_post_meta($ order_id,'_customer_user',true); –

+0

我與OP有同樣的問題,但即使以非管理員用戶身份登錄,我仍然會收到空地址。我已經嘗試過'$ customer = new WC_Customer();'''global $ woocommerce; $ customer = $ woocommerce-> customer;'但是兩者仍然留下空白的地址信息。 –

3

發生這種情況的原因是WC_Customer摘要不包含會話內的保留地址數據(以及其他數據)。這些數據通過購物車/結帳頁面存儲,但是隻有在會話中(就WC_Customer類而言)。

如果你看一看結賬頁面如何得到客戶資料,你會遵循它的WC_Checkout類方法get_value,直接拉出來的user meta。你會做得很好,從訂單對象遵循相同的模式:-)

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

請在您的回答中添加評論 –

+0

這可以起到客戶變量的作用。它只是查詢WC客戶的詳細信息。 –

0

得到客戶的ID

$order = new WC_Order($order_id); 

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

我一直在尋找這樣的事情。它運作良好。 因此,獲得的手機號碼在woocommerce插件這樣的 -

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

雖然,如果你想獲得客戶詳細信息,這可能是不可取

。即使用戶沒有創建帳戶但只是發出訂單。你可以直接從數據庫中查詢它。

雖然,可能會有性能問題,直接查詢,但是這肯定工程100%

您可以通過post_id搜索和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「訂單」只是一個自定義後的類型,因此所有訂單都存儲在wp_posts中,並將其訂單信息存儲到wp_postmeta表中。

如果您想獲得WooCommerce「Order」的任何詳細信息,那麼您可以使用下面的代碼。

$order_meta = get_post_meta($order_id); 

上面的代碼返回WooCommerce「Order」信息的數組。您可以使用這些信息,如下圖所示:

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

要查看「$ order_meta」數組中存在的所有數據。你可以使用下面的代碼:

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

有點晚了,但我剛剛處理了這個,並遇到了這篇文章。 取決於你真正想要的,你可以從訂單的詳細信息如下:

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

其中$ field_name是「_billing_address_1」或「_shipping_address_1'or‘_first_name’。您可以谷歌其他領域,但不要忘記在開始的「_」。

如果你要檢索的客戶此訂單,並得到它的直接還田,它可以作爲您的解決方案,除非你不需要檢索完整的客戶對象:

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

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

; 現在,在這種情況下,$ FIELD_NAME不是以「_」 例如:「FIRST_NAME」和「billing_address_1」

3

也許看Woocomerce Order類?例如,要獲得客戶的電子郵件地址:

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

只是一個想法...

0

這是一個老問題了,我在這裏沒有找到一個偉大的答案,但還是設法弄明白。

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

我知道肯定知道,如果航運電子郵件是元數據的一部分,但即便如此,我寧願把它比結算電子郵件 - 我的目的,至少。

1

而另一個例子,從數據庫中獲取客戶詳細信息:

$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

在這裏,在LoicTheAztec's answer顯示如何檢索這些信息。

僅限Woocommerce V3.0 +

基本上,你可以叫

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

這將返回一個數組到計費訂單數據,包括計費和運輸性質。通過var_dump來探索它。這裏有一個例子:

$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'], 
); 

問候。

相關問題