web-dev-qa-db-fra.com

Comment obtenir les détails du client de la commande dans WooCommerce?

J'ai une fonction qui fait ceci:

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

Comment puis-je obtenir les détails du client à partir de cela?. J'ai tout essayé dans la documentation, mais d'une manière ou d'une autre, seuls quelques détails sont présents, mais le reste ne va pas, par exemple

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

Est vide.

Faire

var_dump($customer)

Produit:

objet (WC_Customer) # 654 (2) {["_data": protected] => array (14) {["pays"] => string (2) "IT"> ["state"] => string (0) "" ["code postal"] => chaîne (0) "" ["ville"] => chaîne (0) "" ["adresse"] =>> chaîne (0) "" ["adresse_2"] => chaîne (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) ["calculé_shipping "] => bool (false)}? ["_changed": "WC_Customer": private] => bool (false)}

Comme vous pouvez le constater, la ville est présente mais les autres sont vides. J'ai vérifié dans le WP_usermeta et dans le panneau d'administration du client et toutes les données sont là.

Des pensées?

21
Alfonso Pérez

Après avoir essayé $customer = new WC_Customer(); et global $woocommerce; $customer = $woocommerce->customer; J'obtenais toujours des données d'adresse vides même lorsque je me suis connecté en tant qu'utilisateur non administrateur.

Ma solution était la suivante:

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

... et ce code fonctionne que vous soyez connecté en tant qu'administrateur ou non.

22
ban-geoengineering

Si vous souhaitez que les détails du client aient été entrés lors de la commande, vous pouvez utiliser le code suivant

$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

En dehors de cela, $customer = new WC_Customer( $order_id ); ne peut pas vous fournir les détails du client.

Tout d'abord, new WC_Customer() ne prend aucun argument

Deuxièmement, WC_Customer Obtiendra les détails du client uniquement lorsque l'utilisateur est connecté et qu'il/elle n'est pas administrateur, mais qu'il/elle devrait se trouver sur le front-end du site Web, comme "Mon compte", "Boutique", 'Panier', page 'Commander'

J'espère que ces informations vous seront utiles.

29

Peut-être regarder la classe Ordre Woocommerce ? Par exemple, pour obtenir l'adresse électronique du client:

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

Juste une pensée...

14
ColdTuna

Bien que cela puisse ne pas être conseillé

Si vous souhaitez obtenir les détails du client. Même lorsque l’utilisateur ne crée pas de compte mais n’effectue que la commande. Vous pouvez simplement l'interroger directement à partir de la base de données.

Bien que, il peut y avoir des problèmes de performances, interrogeant directement, Mais cela fonctionne sûrement à 100%

Vous pouvez rechercher par post_id et 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
        }
9
Html Tosin
$customer_id = get_current_user_id();
print get_user_meta( $customer_id, 'billing_first_name', true );
6

Les "ordres" de WooCommerce sont juste un type d'article personnalisé. Toutes les commandes sont donc stockées dans wp_posts et leurs informations de commande sont stockées dans des tables wp_postmeta.

Si vous souhaitez obtenir des détails sur "Commande" de WooCommerce, vous pouvez utiliser le code ci-dessous.

$order_meta = get_post_meta($order_id); 

Le code ci-dessus renvoie un tableau d'informations "Commande" de WooCommerce. Vous pouvez utiliser ces informations comme indiqué ci-dessous:

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

Pour afficher toutes les données existantes dans le tableau "$ order_meta". Vous pouvez utiliser le code ci-dessous:

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

Je cherchais quelque chose comme ça. Ça marche bien. Obtenez donc le numéro de téléphone portable dans le plugin woocommerce comme ceci -

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

Un peu tard, mais je viens de traiter avec cela et suis tombé sur ce post. Selon ce que vous voulez vraiment, vous pouvez obtenir les détails de la commande comme ceci:

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

Où $ field_name est '_billing_address_1' ou '_shipping_address_1'ou' _first_name '. Vous pouvez google les autres champs, mais n'oubliez pas le "_" au début.

Si vous souhaitez récupérer le client pour cette commande et obtenir son champ directement, cela fonctionne comme dans votre solution, sauf que vous n'avez pas besoin de récupérer l'objet client complet:

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

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

; Maintenant dans ce cas, le $ field_name ne commence pas par "_" Par exemple: 'first_name' et 'billing_address_1'

4
Pieter van Kampen

Cela se produit parce que l'abrégé WC_Customer ne contient pas de données d'adresses (parmi d'autres) entre elles et ne fait pas partie d'une session. Ces données sont stockées via les pages panier/commande, mais encore une fois, uniquement dans la session (pour ce qui est de la classe WC_Customer).

Si vous regardez comment la page de paiement obtient les données du client, vous suivrez ces informations jusqu'à la méthode de classe WC_Checkout get_value , qui le tire directement de méta utilisateur . Vous feriez bien de suivre le même schéma :-)

4
Josh Levinson

2017-2019 WooCommerce versions 3+ et objets CRUD

1) Vous pouvez utiliser les méthodes getter de WC_Order Et WC_Abstract_Order classes sur l'instance d'objet WC_Order Comme:

// 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) Vous pouvez également utiliser la méthode WC_Orderget_data() , pour obtenir un tableau de données non protégé à partir de métadonnées de commande, comme:

// 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'];

Maintenant, pour obtenir les données du compte utilisateur (à partir d'un ID de commande):

1) Vous pouvez utiliser les méthodes de WC_Customer Classe:

// 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) L'objet 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;
2
LoicTheAztec

Ici dans La réponse de LoicTheAztec est montré comment récupérer cette information.

Uniquement pour Woocommerce v3.0 +

Fondamentalement, vous pouvez appeler

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

Cela retournera un tableau aux données de l'ordre de facturation, y compris les propriétés de facturation et d'expédition. Explorez-le en var_dump-ing. Voici un exemple:

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

Salutations.

2
manuman94

Et un autre exemple pour obtenir les détails du client de la base de données:

$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 );
1
Mostafa Soufi

obtenir l'identifiant client de l'objet de commande

$order = new WC_Order($order_id);

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

C'est une vieille question, et je n'ai pas trouvé de bonne réponse ici, mais j'ai réussi à la comprendre.

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

Je sais savoir avec certitude si un e-mail d'expédition fait partie des métadonnées, mais si c'est le cas, je préférerais le recevoir plutôt que l'e-mail de facturation, du moins pour mes besoins.

0
fwho