Как получить информацию о клиенте из заказа в 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)

Выдает:

object (WC_Customer) # 654 (2) {[ "_data": protected] = > array (14) {[ "country" ] = > string (2) "IT" > [ "state" ] = > string (0) "[" post"] = > 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 и в панели администратора клиента, и все данные есть.

Любые мысли?

Ответы

Ответ 1

Пробовав $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;
}

... и этот код работает независимо от того, зарегистрирован ли вы как администратор или нет.

Ответ 2

Если вы хотите получить информацию о клиенте, которую клиент ввел при заказе, вы можете использовать следующий код

$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 получит информацию о клиенте только тогда, когда пользователь войдет в систему, и он/она не находится на стороне администратора, вместо этого он должен находиться на веб-интерфейсе, например "Моя учетная запись", "Магазин", Страница "Корзина", "Оформить заказ"

Надеемся, что эта информация будет полезна.

Ответ 3

Может быть, посмотрите на класс Woocomerce Order? Например, чтобы получить адрес электронной почты клиента:

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

Просто мысль...

Ответ 4

Хотя это может быть нецелесообразно

Если вы хотите получить данные клиента. Даже когда Пользователь не создает аккаунт, а только делает Заказ. Вы можете просто запросить его прямо из базы данных.

Хотя могут быть проблемы с производительностью, если запрашивать напрямую, но это, безусловно, работает на 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

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

Ответ 6

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>");

Ответ 7

Это происходит из-за того, что абзац WC_Customer не хранит данные адреса удержания (среди других данных) отдельно от сеанса. Эти данные хранятся на страницах корзины/проверки, но снова - только в сеансе (насколько это касается класса WC_Customer).

Если вы посмотрите, как страница проверки получает данные клиента, вы будете следовать этому методу класса WC_Checkout get_value, который вытаскивает его непосредственно из пользователя meta. Вам следовало бы следовать той же схеме: -)

Ответ 8

Я смотрел что-то вроде этого. Это работает хорошо. Так что получите мобильный номер в плагине woocommerce, как это -

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

Ответ 9

Немного поздно, но я только что разобрался с этим и наткнулся на этот пост. В зависимости от того, что вы действительно хотите, вы можете получить детали из этого порядка:

$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"

Ответ 10

2017-2019 WooCommerce versions 3+ и CRUD Objects

1) Вы можете использовать методы получения из классов WC_Order и WC_Abstract_Order в экземпляре объекта WC_Order, например:

// Get an instance of the WC_Order Object from the Order ID (if required)
$order = wc_get_order( $order_id );

// Get the Customer ID (User ID)
$customer_id    = $order->get_customer_id(); // Or $order->get_user_id();

// Get the Customer billing email
$billing_email  = $order->get_billing_email();

// Get the Customer billing phone
$billing_phone  = $order->get_billing_phone();

// Customer billing information details
$billing_first_name = $order->get_billing_first_name();
$billing_last_name  = $order->get_billing_last_name();
$billing_company    = $order->get_billing_company();
$billing_address_1  = $order->get_billing_address_1();
$billing_address_2  = $order->get_billing_address_2();
$billing_city       = $order->get_billing_city();
$billing_state      = $order->get_billing_state();
$billing_postcode   = $order->get_billing_postcode();
$billing_country    = $order->get_billing_country();

// Customer shipping information details
$shipping_first_name = $order->get_shipping_first_name();
$shipping_last_name  = $order->get_shipping_last_name();
$shipping_company    = $order->get_shipping_company();
$shipping_address_1  = $order->get_shipping_address_1();
$shipping_address_2  = $order->get_shipping_address_2();
$shipping_city       = $order->get_shipping_city();
$shipping_state      = $order->get_shipping_state();
$shipping_postcode   = $order->get_shipping_postcode();
$shipping_country    = $order->get_shipping_country();

2) Вы также можете использовать метод WC_Order get_data(), чтобы получить массив незащищенных данных из метаданных заказа, например:

// Get an instance of the WC_Order Object from the Order ID (if required)
$order = wc_get_order( $order_id );

// Get the order meta data in an unprotected array
$data  = $order->get_data(); // The Order data

$order_id        = $data['id'];
$order_parent_id = $data['parent_id'];

// Get the Customer ID (User ID)
$customer_id     = $data['customer_id'];

## BILLING INFORMATION:

$billing_email      = $data['billing']['email'];
$billing_phone      = $order_data['billing']['phone'];

$billing_first_name = $data['billing']['first_name'];
$billing_last_name  = $data['billing']['last_name'];
$billing_company    = $data['billing']['company'];
$billing_address_1  = $data['billing']['address_1'];
$billing_address_2  = $data['billing']['address_2'];
$billing_city       = $data['billing']['city'];
$billing_state      = $data['billing']['state'];
$billing_postcode   = $data['billing']['postcode'];
$billing_country    = $data['billing']['country'];

## SHIPPING INFORMATION:

$shipping_first_name = $data['shipping']['first_name'];
$shipping_last_name  = $data['shipping']['last_name'];
$shipping_company    = $data['shipping']['company'];
$shipping_address_1  = $data['shipping']['address_1'];
$shipping_address_2  = $data['shipping']['address_2'];
$shipping_city       = $data['shipping']['city'];
$shipping_state      = $data['shipping']['state'];
$shipping_postcode   = $data['shipping']['postcode'];
$shipping_country    = $data['shipping']['country'];

Теперь, чтобы получить данные учетной записи пользователя (из идентификатора заказа):

1) Вы можете использовать методы из WC_Customer класса:

// Get the user ID from an Order ID
$user_id = get_post_meta( $order_id, '_customer_user', true );

// Get an instance of the WC_Customer Object from the user ID
$customer = new WC_Customer( $user_id );

$username     = $customer->get_username(); // Get username
$user_email   = $customer->get_email(); // Get account email
$first_name   = $customer->get_first_name();
$last_name    = $customer->get_last_name();
$display_name = $customer->get_display_name();

// Customer billing information details (from account)
$billing_first_name = $customer->get_billing_first_name();
$billing_last_name  = $customer->get_billing_last_name();
$billing_company    = $customer->get_billing_company();
$billing_address_1  = $customer->get_billing_address_1();
$billing_address_2  = $customer->get_billing_address_2();
$billing_city       = $customer->get_billing_city();
$billing_state      = $customer->get_billing_state();
$billing_postcode   = $customer->get_billing_postcode();
$billing_country    = $customer->get_billing_country();

// Customer shipping information details (from account)
$shipping_first_name = $customer->get_shipping_first_name();
$shipping_last_name  = $customer->get_shipping_last_name();
$shipping_company    = $customer->get_shipping_company();
$shipping_address_1  = $customer->get_shipping_address_1();
$shipping_address_2  = $customer->get_shipping_address_2();
$shipping_city       = $customer->get_shipping_city();
$shipping_state      = $customer->get_shipping_state();
$shipping_postcode   = $customer->get_shipping_postcode();
$shipping_country    = $customer->get_shipping_country();

2) Объект WP_User (Wordpress):

// Get the user ID from an Order ID
$user_id = get_post_meta( $order_id, '_customer_user', true );

// Get the WP_User instance Object
$user = new WP_User( $user_id );

$username     = $user->username; // Get username
$user_email   = $user->email; // Get account email
$first_name   = $user->first_name;
$last_name    = $user->last_name;
$display_name = $user->display_name;

// Customer billing information details (from account)
$billing_first_name = $user->billing_first_name;
$billing_last_name  = $user->billing_last_name;
$billing_company    = $user->billing_company;
$billing_address_1  = $user->billing_address_1;
$billing_address_2  = $user->billing_address_2;
$billing_city       = $user->billing_city;
$billing_state      = $user->billing_state;
$billing_postcode   = $user->billing_postcode;
$billing_country    = $user->billing_country;

// Customer shipping information details (from account)
$shipping_first_name = $user->shipping_first_name;
$shipping_last_name  = $user->shipping_last_name;
$shipping_company    = $user->shipping_company;
$shipping_address_1  = $user->shipping_address_1;
$shipping_address_2  = $user->shipping_address_2;
$shipping_city       = $user->shipping_city;
$shipping_state      = $user->shipping_state;
$shipping_postcode   = $user->shipping_postcode;
$shipping_country    = $user->shipping_country;

Ответ 11

Здесь в ответ LoicTheAztec показано, как получить эту информацию.

Только для Woocommerce v3.0 +

В принципе, вы можете позвонить

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

Это вернет массив в данные заказа биллинга, включая свойства биллинга и доставки. Исследуйте его var_dump-it. Вот пример:

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

Привет.

Ответ 12

И еще один пример, чтобы получить детали клиента из базы данных:

$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 );

Ответ 13

получить идентификатор клиента из объекта заказа

$order = new WC_Order($order_id);

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

Ответ 14

Это старый вопрос, и я не нашел здесь большого ответа, но сумел разобраться в этом.

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

Я знаю, что знаю, что отправка электронной почты является частью метаданных, но если это так, я бы предпочел использовать ее, а не электронную почту для выставления счетов - по крайней мере, для моих целей.