У меня есть функция, которая делает это:
$order = new WC_Order($order_id); $customer = new WC_Customer( $order_id );
Как я могу получить информацию о клиенте от этого ?. Я пробовал все в документах, но каким-то образом присутствуют только некоторые детали, но, тем не менее,
$data['Address'] = $customer->get_address() . ' ' . $customer->get_address_2(); $data['ZipCode'] = $customer->get_postcode();
на$data['Address'] = $customer->get_address() . ' ' . $customer->get_address_2(); $data['ZipCode'] = $customer->get_postcode();
Пусто.
дела
var_dump($customer)
Производит:
объект (WC_Customer) # 654 (2) {["_data": protected] => array (14) {["country"] => string (2) "IT"> ["state"] => string (0) "" ["postcode"] => string (0) "" ["city"] => string (0) "" ["address"] =>> string (0) "" ["address_2"] => string (0) "" ["shipping_country"] => string (2) "IT" ["shipping_state"] => string (2) "BG" ["shipping_postcode"] => string (0) "" ["shipping_city" ] =>> string (0) "" ["shipping_address"] => string (0) "" ["shipping_address_2"] => string (0) "" ["is_vat_exempt"] => bool (false) ["calculate_shipping "] => bool (false)}? ["_changed": "WC_Customer": private] => bool (false)}
Как вы можете видеть, город присутствует, но остальные пусты. Я проверил в WP_usermeta и в панели администратора клиента, и все данные есть.
Есть предположения?
Попробовав $customer = new WC_Customer();
и global $woocommerce; $customer = $woocommerce->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; }
… и этот код работает независимо от того, вошли ли вы в систему как администратор или нет.
Если вы хотите получить информацию о клиенте, которую клиент ввел при заказе, вы можете использовать следующий код
$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
будет получать информацию о клиенте только при WC_Customer
пользователя в систему, и он / она не находится на стороне администратора, вместо этого он должен находиться на интерфейсе веб-сайта, например «Моя учетная запись», «Магазин», «Корзина», Оформить заказ
Надеюсь, что эта информация будет полезна.
Хотя это, возможно, нецелесообразно
Если вы хотите получить информацию о клиенте. Даже если пользователь не создает учетную запись, но делает только заказ. Вы можете просто запросить его непосредственно из базы данных.
Хотя, возможно, проблемы с производительностью, запросы напрямую, но это, безусловно, работает на 100%
Вы можете выполнять поиск по сообщениям и
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 }
WooCommerce «Заказы» – это просто персонализированный тип сообщений, поэтому все заказы хранятся в wp_posts и его информации о заказе, хранящейся в таблицах wp_postmeta.
Если вы хотите получить какие-либо подробности «Заказ» WooCommerce, вы можете использовать нижеприведенный код.
$order_meta = get_post_meta($order_id);
Вышеупомянутый код возвращает массив информации о заказе WooCommerce. Вы можете использовать эту информацию, как показано ниже:
$shipping_first_name = $order_meta['_shipping_first_name'][0];
Для просмотра всех данных существует массив $ order_meta. Вы можете использовать код ниже:
print("<pre>"); print_r($order_meta); print("</pre>");
Это происходит из-за того, что абзац WC_Customer не хранит данные удержания (среди других данных) отдельно от сеанса. Эти данные хранятся через страницы корзины / проверки, но снова – только в сеансе (насколько это касается класса WC_Customer).
Если вы посмотрите, как страница проверки получает данные клиента, вы будете следовать ей в методе класса get_value
, который вытаскивает его непосредственно из пользовательской мета . Вам следовало бы следовать той же схеме 🙂
$customer_id = get_current_user_id(); print get_user_meta( $customer_id, 'billing_first_name', true );
Я смотрел что-то вроде этого. Это работает хорошо. Так что получите мобильный номер в плагине woocommerce, как это –
$customer_id = get_current_user_id(); print get_user_meta( $customer_id, 'billing_phone', true );
Немного поздно, но я только что разобрался с этим и наткнулся на этот пост. В зависимости от того, что вы действительно хотите, вы можете получить детали из этого порядка:
$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»
Может быть, посмотрите на класс заказа Woocomerce ? Например, чтобы получить адрес электронной почты клиента:
$order = new WC_Order($order_id); echo $order->get_billing_email();
Просто мысль…
И еще один пример, чтобы получить детали клиентов из базы данных:
$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 );
получить идентификатор клиента из объекта заказа
$order = new WC_Order($order_id); // here the customer data $customer = get_userdata($order->customer_user); echo $customer->display_name;
Это старый вопрос, и я не нашел здесь большого ответа, но мне это удалось разобраться.
$order_meta = get_post_meta( $order_id ); $email = $order_meta["_shipping_email"][0] ?: $order_meta["_billing_email"][0];
Я знаю, что знаю, что отправка электронной почты является частью метаданных, но если это так, я бы предпочел бы ее, чем платежный адрес электронной почты – по крайней мере, для моих целей.