Mostrar el historial de pedidos del cliente en el detalle de un pedido en WooCommerce

Cuando estás gestionando pedidos en WooCommerce, a veces necesitas más contexto: por ejemplo, ¿este cliente ya compró antes? ¿cuántos pedidos tiene? ¿suele cancelar? Tener esa información a la vista te puede ayudar a tomar mejores decisiones.

En este artículo te muestro cómo agregar un metabox en el panel de administración de un pedido, que muestre todos los otros pedidos del mismo cliente, con los datos más importantes: ID (con link), número de pedido, fecha, estado y total. Todo esto sin plugins, solo con un poco de código.

 

Qué vamos a lograr

Al final de este artículo, cuando entres al detalle de un pedido hecho por un cliente registrado, verás en la barra lateral derecha un bloque como este:

|----------------------------------------------------------|
| ID    | Nº Pedido | Fecha      | Estado      | Total     |
|-------|-----------|------------|-------------|-----------|
| #123  | 123       | 2024-12-10 | Completado  | $50.00    |
| #100  | 100       | 2024-10-02 | Cancelado   | $30.00    |
| #91   | 91        | 2024-09-15 | Procesando  | $75.99    |

 

El snippet

Pega este código en el archivo functions.phpde tu tema hijo o en un plugin personalizado:

<?php
add_action( 'add_meta_boxes', 'addCustomerOrderHistoryMetabox' );

function addCustomerOrderHistoryMetabox() {
    add_meta_box(
        'customer_order_history',
        'Historial de pedidos del cliente',
        'renderCustomerOrderHistoryMetabox',
        'shop_order',
        'side',
        'default'
    );
}

function renderCustomerOrderHistoryMetabox( $post ) {
    $order      = wc_get_order( $post->ID );
    $customerId = $order->get_customer_id();

    if ( ! $customerId ) {
        echo '<p>Este pedido no tiene un cliente asignado.</p>';
        return;
    }

    $customerOrders = wc_get_orders( [
        'customer_id' => $customerId,
        'exclude'     => [ $order->get_id() ],
        'limit'       => -1,
        'orderby'     => 'date',
        'order'       => 'DESC',
        'return'      => 'ids'
    ] );

    if ( empty( $customerOrders ) ) {
        echo '<p>Este cliente no tiene otros pedidos.</p>';
        return;
    }

    echo '<table style="width: 100%; font-size: 12px;">';
    echo '<thead><tr>
            <th>ID</th>
            <th>Nº Pedido</th>
            <th>Fecha</th>
            <th>Estado</th>
            <th>Total</th>
          </tr></thead><tbody>';

    foreach ( $customerOrders as $orderId ) {
        $pastOrder     = wc_get_order( $orderId );
        $orderLink     = get_edit_post_link( $pastOrder->get_id() );
        $orderIdHtml   = '<a href="' . esc_url( $orderLink ) . '">#' . esc_html( $pastOrder->get_id() ) . '</a>';
        $orderNumber   = $pastOrder->get_order_number();
        $orderDate     = $pastOrder->get_date_created() ? $pastOrder->get_date_created()->date( 'Y-m-d' ) : '-';
        $orderStatus   = wc_get_order_status_name( $pastOrder->get_status() );
        $orderTotal    = $pastOrder->get_formatted_order_total();

        echo '<tr>
                <td>' . $orderIdHtml . '</td>
                <td>' . esc_html( $orderNumber ) . '</td>
                <td>' . esc_html( $orderDate ) . '</td>
                <td>' . esc_html( $orderStatus ) . '</td>
                <td>' . $orderTotal . '</td>
              </tr>';
    }

    echo '</tbody></table>';
}

 

Explicación del código

  • add_meta_box: Creamos un nuevo metabox en el panel de edición de pedidos.
  • get_customer_id(): Obtenemos el ID del usuario que hizo el pedido actual (si es un cliente registrado).
  • wc_get_orders(): Traemos todos los pedidos del mismo cliente, excluyendo el pedido que estamos viendo.
  • get_order_number(): Muestra el número de pedido real, que puede ser distinto al ID si usas plugins como Sequential Order Numbers.
  • get_edit_post_link(): Nos da el enlace directo para editar el pedido desde el admin.
  • get_date_created(): Recupera la fecha en que se creó el pedido (formateada para mostrar en la tabla).
  • wc_get_order_status_name(): Convierte el estado del pedido (como completed, processing) en un nombre legible como “Completado” o “En proceso”.
  • get_formatted_order_total(): Muestra el total del pedido con la moneda y el formato adecuado.
  • Tabla HTML: Usamos una tabla simple para presentar la información ordenadamente sin recargar el admin.

 

Resultado final

Este metabox te da una visión instantánea del comportamiento del cliente directamente desde el pedido. Asi puedes saber si es un comprador habitual, si ha tenido problemas antes o si está haciendo su primera compra.

Es una mejora pequeña pero muy útil para tiendas donde el seguimiento del cliente es importante (por ejemplo, productos personalizados, soporte, devoluciones, etc.).

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to Top
0
Would love your thoughts, please comment.x
()
x