Imprimir automáticamente los pedidos de WooCommerce: la guía completa

WooCommerce puede imprimir un pedido en cuanto se paga: con un plugin, un hook o unas líneas de código. Cada vía y lo que cuesta.

WooCommerce trae una lista de pedidos, una ficha de detalle y un botón de impresión del navegador. Lo que no trae es una forma de hacer que salga un ticket de una máquina en la cocina en el segundo en que un cliente paga.

Respuesta corta: engánchate a woocommerce_order_status_processing, construye el texto del ticket y envíalo por POST a una impresora accesible desde internet. Un plugin lo hace por ti; veinte líneas en un pequeño plugin propio lo hacen exactamente como quieres. Ninguno necesita un ordenador encendido en la tienda.

Qué vía elegir

Vía Esfuerzo Maquetación Sobrevive a cambios de tema Ideal para
Plugin conector Instalar y configurar Ajustes de plantilla La mayoría de tiendas
Hook propio ~20 líneas Total Sí, si va en un plugin Lógica específica, multivendedor
Sondeo con WP-Cron Mayor Total Tiendas donde los hooks fallan

La vía del plugin

El conector de WooCommerce se instala como cualquier extensión: actívalo, pega tus credenciales de API, elige la impresora y los estados de pedido que disparan la impresión. La documentación del plugin recorre los ajustes.

Si tu tienda es una tienda normal, para aquí. El resto es para los casos que no lo son.

La vía del hook

<?php
/**
 * Plugin Name: Imprimir pedidos al pagar
 * Ponlo en wp-content/plugins/, no en el functions.php del tema:
 * una actualización o un cambio de tema pararía la impresión en silencio.
 */

add_action( 'woocommerce_order_status_processing', 'my_print_order', 10, 2 );

function my_print_order( $order_id, $order ) {
    if ( $order->get_meta( '_printed_at' ) ) {
        return; // evita el doble ticket si el estado se aplica dos veces
    }

    $lineas = array( 'PEDIDO #' . $order->get_order_number(), $order->get_date_created()->date( 'd/m/Y H:i' ), '' );

    foreach ( $order->get_items() as $item ) {
        $lineas[] = $item->get_quantity() . 'x ' . $item->get_name();
    }

    $lineas[] = '';
    $lineas[] = 'TOTAL: ' . $order->get_total() . ' ' . $order->get_currency();

    wp_remote_post(
        'https://www.expedy.fr/api/v2/printers/' . MY_PRINTER_UID . '/print',
        array(
            'timeout'  => 5,
            'blocking' => false, // que el cliente no espere a la impresora
            'headers'  => array(
                'Authorization' => MY_API_SID . ':' . MY_API_TOKEN,
                'Content-Type'  => 'application/json',
            ),
            'body' => wp_json_encode( array(
                'printer_msg' => implode( "\n", $lineas ),
                'origin'      => 'woo-' . $order_id,
            ) ),
        )
    );

    $order->update_meta_data( '_printed_at', current_time( 'mysql' ) );
    $order->save();
}

Tres cosas del código son deliberadas.

'blocking' => false. Sin ello, la petición de compra del cliente espera a que responda la API. En una conexión lenta es una página de gracias visiblemente más lenta, y si la impresora no responde puede parecer un fallo de compra.

El guardián _printed_at. Un pedido puede entrar en processing más de una vez: un callback de pasarela que llega dos veces, un cambio manual, un plugin que vuelve a guardar el pedido. Sin el guardián, cada uno es otro ticket.

Un plugin, no functions.php. El código del tema muere con el tema. Toda agencia ha heredado al menos un sitio donde la impresión se paró el día que se cambió el tema.

Dónde muerde WooCommerce

Los estados no son universales. Las tiendas con transferencia bancaria o contra reembolso no pasan por processing igual. Si tus pedidos se quedan en on-hold, engancha ese estado, o usa woocommerce_order_status_changed y decide dentro de la función.

WP-Cron no es un cron. Solo se ejecuta cuando alguien visita el sitio. En una tienda de poco tráfico, un pedido puede esperar una hora su ticket. Usa un cron real que llame a wp-cron.php.

Multivendedor. En una marketplace con WCFM o Dokan, cada vendedor necesita su impresora: el printer_uid viene de los metadatos del vendedor, no de una constante: ver la documentación de WCFM.

Codificación. WordPress guarda emojis en los nombres de producto sin problema. Las impresoras térmicas no los imprimen, y en algunos modelos una secuencia inesperada tira la conexión. Transcribe antes de construir el ticket.

Empezar

Crea una cuenta gratuita e imprime un ticket con un curl simple antes de tocar WooCommerce. Aislar la cadena de impresión de la de WordPress ahorra una cantidad sorprendente de depuración.

FAQ

¿Qué hook de WooCommerce debe disparar la impresión?

woocommerce_order_status_processing en la mayoría de tiendas: se dispara una vez confirmado el pago. Las tiendas con transferencia o contra reembolso pueden necesitar on-hold, o woocommerce_order_status_changed con la decisión dentro de la función.

¿Se pueden imprimir pedidos de WooCommerce sin plugin?

Sí. Un pequeño plugin propio con una acción sobre el hook de estado y una llamada wp_remote_post al endpoint de impresión son unas veinte líneas. Ponlo en wp-content/plugins/, nunca en el functions.php del tema.

¿Por qué la compra va más lenta desde que imprimo?

Porque la llamada HTTP a la API bloquea la petición de compra. Pasa 'blocking' => false a wp_remote_post para que el cliente nunca espere a una impresora.

¿Cómo evito que un pedido se imprima dos veces?

Guarda una meta como _printed_at en el pedido y sal de la función si ya está puesta. Los estados pueden aplicarse más de una vez por callbacks de pasarela o cambios manuales.