WooCommerce-Bestellungen automatisch drucken: der komplette Guide

WooCommerce kann eine Bestellung drucken, sobald sie bezahlt ist: per Plugin, Hook oder ein paar Zeilen Code. Jeder Weg und sein Preis.

WooCommerce liefert eine Bestellliste, eine Detailseite und einen Browser-Druckknopf. Was es nicht liefert, ist ein Bon, der in der Küche erscheint, sobald ein Kunde bezahlt.

Kurze Antwort: Hängen Sie sich an woocommerce_order_status_processing, bauen Sie den Bon-Text und schicken Sie ihn per POST an einen aus dem Internet erreichbaren Drucker. Ein Plugin erledigt das für Sie; zwanzig Zeilen in einem kleinen eigenen Plugin erledigen es genau so, wie Sie wollen. Beides ohne Rechner im Laden.

Welcher Weg

Weg Aufwand Layout Übersteht Theme-Wechsel Geeignet für
Konnektor-Plugin Installieren, konfigurieren Vorlagenoptionen Ja Die meisten Shops
Eigener Hook ~20 Zeilen Vollständig Ja, wenn im Plugin Eigene Logik, Multi-Vendor
WP-Cron-Polling Höher Vollständig Ja Shops mit unzuverlässigen Hooks

Der Plugin-Weg

Der WooCommerce-Konnektor installiert sich wie jede Erweiterung: aktivieren, API-Zugangsdaten einfügen, Drucker und auslösende Bestellstatus wählen. Die Plugin-Dokumentation führt durch die Einstellungen.

Ist Ihr Shop ein normaler Shop, hören Sie hier auf. Der Rest gilt den Fällen, die es nicht sind.

Der Hook-Weg

<?php
/**
 * Plugin Name: Bestellungen bei Zahlung drucken
 * Nach wp-content/plugins/, nicht in die functions.php des Themes:
 * ein Theme-Update würde den Druck stillschweigend stoppen.
 */

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; // verhindert den zweiten Bon, wenn der Status doppelt gesetzt wird
    }

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

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

    $zeilen[] = '';
    $zeilen[] = 'SUMME: ' . $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, // der Kunde soll nicht auf den Drucker warten
            'headers'  => array(
                'Authorization' => MY_API_SID . ':' . MY_API_TOKEN,
                'Content-Type'  => 'application/json',
            ),
            'body' => wp_json_encode( array(
                'printer_msg' => implode( "\n", $zeilen ),
                'origin'      => 'woo-' . $order_id,
            ) ),
        )
    );

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

Drei Dinge im Code sind Absicht.

'blocking' => false. Sonst wartet die Checkout-Anfrage des Kunden auf die Antwort der Druck-API. Bei langsamer Verbindung ist das eine sichtbar trägere Dankeseite, und bei unerreichbarem Drucker sieht es wie ein Checkout-Fehler aus.

Der _printed_at-Wächter. Eine Bestellung kann mehrfach in processing gehen: ein doppelt eintreffender Gateway-Callback, eine manuelle Statusänderung, ein Plugin, das die Bestellung erneut speichert. Ohne Wächter ist jedes davon ein weiterer Bon.

Ein Plugin, nicht functions.php. Code im Theme stirbt mit dem Theme. Jede Agentur hat mindestens eine Site geerbt, bei der der Druck am Tag des Theme-Wechsels aufhörte.

Wo WooCommerce zubeißt

Status sind nicht universell. Shops mit Vorkasse oder Nachnahme durchlaufen processing anders. Bleiben Ihre Bestellungen auf on-hold, hängen Sie sich dort ein, oder an woocommerce_order_status_changed und entscheiden in der Funktion.

WP-Cron ist kein Cron. Es läuft nur, wenn jemand die Seite besucht. In einem Shop mit wenig Traffic kann eine Bestellung eine Stunde auf ihren Bon warten. Nutzen Sie einen echten System-Cron auf wp-cron.php.

Multi-Vendor. Auf einem WCFM- oder Dokan-Marktplatz braucht jeder Händler seinen Drucker: die printer_uid kommt aus den Vendor-Metadaten statt aus einer Konstante: siehe die WCFM-Dokumentation.

Zeichenkodierung. WordPress speichert bereitwillig Emoji in Produktnamen. Thermodrucker drucken sie nicht, und bei manchen Modellen reißt eine unerwartete Bytefolge die Verbindung ab. Vor dem Bau des Bons transliterieren.

Loslegen

Kostenloses Konto anlegen und einen Bon mit einem einfachen curl drucken, bevor Sie WooCommerce überhaupt anfassen. Die Druckkette getrennt von der WordPress-Kette zu prüfen spart erstaunlich viel Fehlersuche.

FAQ

Welcher WooCommerce-Hook soll den Druck auslösen?

In den meisten Shops woocommerce_order_status_processing: Er feuert, sobald die Zahlung bestätigt ist. Shops mit Vorkasse oder Nachnahme brauchen eher on-hold oder woocommerce_order_status_changed mit der Entscheidung in der Funktion.

Kann man WooCommerce-Bestellungen ohne Plugin drucken?

Ja. Ein kleines eigenes Plugin mit einer Action auf dem Status-Hook und einem wp_remote_post an den Druck-Endpunkt sind rund zwanzig Zeilen. Nach wp-content/plugins/, nie in die functions.php des Themes.

Warum ist der Checkout langsamer, seit gedruckt wird?

Weil der HTTP-Aufruf an die Druck-API die Checkout-Anfrage blockiert. Übergeben Sie 'blocking' => false an wp_remote_post, damit der Kunde nie auf einen Drucker wartet.

Wie verhindere ich, dass eine Bestellung zweimal gedruckt wird?

Setzen Sie ein Meta-Flag wie _printed_at auf der Bestellung und steigen Sie früh aus, wenn es schon gesetzt ist. Statuswechsel können durch Gateway-Callbacks oder manuelle Änderungen mehrfach passieren.