WooCommerce fornisce un elenco ordini, una scheda di dettaglio e un pulsante di stampa del browser. Ciò che non fornisce è uno scontrino che compare in cucina nel secondo in cui un cliente paga.
Risposta breve: agganciatevi a woocommerce_order_status_processing, costruite il testo dello scontrino e inviatelo in POST a una stampante raggiungibile da internet. Un plugin lo fa per voi; venti righe in un piccolo plugin proprio lo fanno esattamente come volete. Nessuno dei due richiede un computer acceso in negozio.
Quale via scegliere
| Via | Sforzo | Impaginazione | Sopravvive ai cambi di tema | Adatta a |
|---|---|---|---|---|
| Plugin connettore | Installare e configurare | Impostazioni di template | Sì | La maggior parte dei negozi |
| Hook proprio | ~20 righe | Totale | Sì, se in un plugin | Logica specifica, multi-venditore |
| Polling WP-Cron | Maggiore | Totale | Sì | Negozi con hook inaffidabili |
La via del plugin
Il connettore WooCommerce si installa come qualsiasi estensione: attivatelo, incollate le credenziali API, scegliete la stampante e gli stati d'ordine che avviano la stampa. La documentazione del plugin illustra le impostazioni.
Se il vostro negozio è un negozio normale, fermatevi qui. Il resto riguarda i casi che non lo sono.
La via dell'hook
<?php
/**
* Plugin Name: Stampa ordini al pagamento
* Da mettere in wp-content/plugins/, non nel functions.php del tema:
* un aggiornamento del tema fermerebbe la stampa senza avvisi.
*/
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 il secondo scontrino se lo stato viene applicato due volte
}
$righe = array( 'ORDINE #' . $order->get_order_number(), $order->get_date_created()->date( 'd/m/Y H:i' ), '' );
foreach ( $order->get_items() as $item ) {
$righe[] = $item->get_quantity() . 'x ' . $item->get_name();
}
$righe[] = '';
$righe[] = 'TOTALE: ' . $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, // il cliente non deve aspettare la stampante
'headers' => array(
'Authorization' => MY_API_SID . ':' . MY_API_TOKEN,
'Content-Type' => 'application/json',
),
'body' => wp_json_encode( array(
'printer_msg' => implode( "\n", $righe ),
'origin' => 'woo-' . $order_id,
) ),
)
);
$order->update_meta_data( '_printed_at', current_time( 'mysql' ) );
$order->save();
}
Tre elementi del codice sono deliberati.
'blocking' => false. Senza, la richiesta di acquisto del cliente attende la risposta della API di stampa. Su una connessione lenta è una pagina di ringraziamento visibilmente più lenta, e se la stampante è irraggiungibile può sembrare un errore di acquisto.
Il guardiano _printed_at. Un ordine può entrare in processing più di una volta: un callback di gateway che arriva due volte, un cambio manuale, un plugin che risalva l'ordine. Senza guardiano, ognuno di questi produce un altro scontrino.
Un plugin, non functions.php. Il codice nel tema muore con il tema. Ogni agenzia ha ereditato almeno un sito in cui la stampa si è fermata il giorno del cambio di tema.
Dove WooCommerce morde
Gli stati non sono universali. I negozi con bonifico o contrassegno non passano da processing allo stesso modo. Se i vostri ordini restano in on-hold, agganciate quello stato, oppure usate woocommerce_order_status_changed e decidete nella funzione.
WP-Cron non è un cron. Gira solo quando qualcuno visita il sito. In un negozio a basso traffico, un ordine può attendere un'ora il suo scontrino. Usate un vero cron di sistema che chiami wp-cron.php.
Multi-venditore. Su un marketplace WCFM o Dokan ogni venditore ha bisogno della sua stampante: il printer_uid proviene dai metadati del venditore, non da una costante: vedi la documentazione WCFM.
Codifica dei caratteri. WordPress memorizza volentieri emoji nei nomi dei prodotti. Le stampanti termiche non le stampano, e su alcuni modelli una sequenza inattesa fa cadere la connessione. Traslitterate prima di costruire lo scontrino.
Iniziare
Create un account gratuito e stampate uno scontrino con un semplice curl prima di toccare WooCommerce. Isolare la catena di stampa da quella di WordPress fa risparmiare una quantità sorprendente di debug.
FAQ
Quale hook WooCommerce deve avviare la stampa?
woocommerce_order_status_processing nella maggior parte dei negozi: scatta una volta confermato il pagamento. I negozi con bonifico o contrassegno potrebbero aver bisogno di on-hold, o di woocommerce_order_status_changed con la decisione presa nella funzione.
Si possono stampare gli ordini WooCommerce senza plugin?
Sì. Un piccolo plugin proprio con un'azione sull'hook di stato e una chiamata wp_remote_post all'endpoint di stampa sono una ventina di righe. Va in wp-content/plugins/, mai nel functions.php del tema.
Perché il checkout è più lento da quando stampo?
Perché la chiamata HTTP alla API di stampa blocca la richiesta di checkout. Passate 'blocking' => false a wp_remote_post così il cliente non attende mai una stampante.
Come evito che un ordine si stampi due volte?
Salvate un meta come _printed_at sull'ordine e uscite dalla funzione se è già presente. Gli stati possono essere applicati più volte da callback di gateway o cambi manuali.