Obtener una lista de todos los clientes que han comprado algo

4 minutos de lectura

avatar de usuario
Ivan Topic

¿Cómo puedo obtener una lista de clientes que compraron al menos algo y si es probable ordenarlos por número de pedidos? Por lo que he entendido _order_count la clave meta existe y se establece en el número de pedidos realizados como un número entero si han realizado un pedido.

Esta consulta ignora el recuento de pedidos y solo muestra a todos los usuarios.

$args = array(
     'role' => 'customer',
     'number' => -1,
     'order' => 'ASC',
     'orderby' => 'meta_value',
     'meta_query' => array(
          array(
               'key'     => '_order_count',
               'value'   => array(''),
               'compare' => 'NOT IN'
          )
    )
);

$query = new WP_User_Query($args);

Esta es una tabla que mostrará información sobre cuánto ha gastado el usuario y cuántos pedidos ha realizado.

<?php if (! empty($query->get_results())) : ?>

     <table class="table">

          <thead>
                    <tr>
                         <th data-sort="string">Name</th>
                         <th data-sort="string">Email</th>
                         <th data-sort="float">Total spent (<?php echo get_option('woocommerce_currency'); ?>)</th>
                         <th data-sort="int">Order placed</th>
                    </tr>
          </thead>

          <tbody>

          <?php foreach ($query->get_results() as $user) : ?>

               <?php $customer = new WP_User($user->ID); ?>

               <tr>
                    <td><?php echo $user->display_name; ?></td>
                    <td><?php echo $user->user_email; ?></td>
                    <td><?php echo wc_get_customer_total_spent($user->ID); ?></td>
                    <td>
                    <?php 
                    $customer_orders = get_posts(array(
                         'numberposts' => -1,
                         'meta_key'    => '_customer_user',
                         'meta_value'  => $user->ID,
                         'post_type'   => wc_get_order_types(),
                         'post_status' => array('wc-pending', 'wc-processing', 'wc-completed') //array_keys(wc_get_order_statuses()),
                    ));
                    echo count($customer_orders);
                    ?>
                    </td>
               </tr>

          <?php endforeach; ?>

          </tbody>
     </table>

<?php endif; ?>

  • Puedes intentar 'value' => ' ', 'compare' => '!=' (pruebe el valor con un espacio, y sin si no funciona)

    – Mtxz

    12 de septiembre de 2018 a las 0:55


avatar de usuario
LoicTheAztec

Pruebe el siguiente código que usa una consulta SQL muy ligera para obtener los Id. de $clientes. Para el recuento de pedidos de clientes, puede utilizar la función dedicada wc_get_customer_order_count().

<?php
global $wpdb;
$customer_ids = $wpdb->get_col("SELECT DISTINCT meta_value  FROM $wpdb->postmeta
    WHERE meta_key = '_customer_user' AND meta_value > 0");
$currency = ' (' . get_option('woocommerce_currency') . ')';
if (sizeof($customer_ids) > 0) : ?>
<table class="table">
    <thead>
        <tr>
            <th data-sort="string"><?php _e("Name", "woocommerce"); ?></th>
            <th data-sort="string"><?php _e("Email", "woocommerce"); ?></th>
            <th data-sort="float"><?php _e("Total spent", "woocommerce"); echo $currency; ?></th>
            <th data-sort="int"><?php _e("Orders placed", "woocommerce"); ?></th>
        </tr>
    </thead>
    <tbody>
    <?php foreach ($customer_ids as $customer_id) :
        $customer = new WP_User($customer_id); ?>
        <tr>
            <td><?php echo $customer->display_name; ?></td>
            <td><?php echo $customer->user_email; ?></td>
            <td><?php echo wc_get_customer_total_spent($customer_id); ?></td>
            <td><?php echo wc_get_customer_order_count($customer_id); ?></td>
        </tr>
    <?php endforeach; ?>
    </tbody>
</table>
<?php endif; ?>

Probado y funciona.

Usuarios meta_key _order_count y _order_total no existe hasta WC_Customer_Data_Store get_order_count() y get_total_spent() los métodos se han ejecutado una vez para cada cliente. También lo relacionado valores meta también se actualizan cuando esos métodos se ejecutan para un cliente.

Las funciones wc_get_customer_total_spent() y wc_get_customer_order_count() ejecute esos métodos y actualice los metadatos de usuario correspondientes.

¿Ha sido útil esta solución?