Wenn du regelmäßig WooCommerce-Shops entwickelst oder anpasst, kommst du an einem Thema nicht vorbei: Hooks. WooCommerce bringt über 1.000 Actions und Filter mit – und genau das macht es so flexibel. Ich zeige dir die zehn, die in fast jedem meiner Projekte auftauchen, und wie du sie sinnvoll einsetzt, ohne den Core oder ein Template anzufassen.
Was sind Actions und Filter?
WordPress – und damit WooCommerce – basiert auf zwei Hook-Typen. Actions lassen dich an bestimmten Stellen eigenen Code ausführen. Filter ermöglichen es, Daten abzufangen und zu verändern, bevor sie ausgegeben oder gespeichert werden.
Der Unterschied klingt subtil, ist in der Praxis aber entscheidend: Bei einer Action tust du etwas. Bei einem Filter veränderst du etwas und gibst es zurück.
Das Schöne daran: Ich muss nie WooCommerce-Core-Dateien anfassen. Alles läuft über das functions.php meines Child-Themes oder ein eigenes Plugin – und bleibt damit update-sicher.
Die 10 wichtigsten WooCommerce Hooks
1. woocommerce_before_add_to_cart_button (Action)
Wird direkt vor dem „In den Warenkorb“-Button auf der Produktseite ausgeführt. Ich nutze diesen Hook für Hinweise, Custom-Felder oder Badges – zum Beispiel einen Lagerbestand-Hinweis oder eine Versandkosteninfo.
add_action( 'woocommerce_before_add_to_cart_button', function() {
echo '<p class="stock-hint">Nur noch wenige verfügbar</p>';
} );2. woocommerce_after_add_to_cart_button (Action)
Direkt nach dem Button – ideal für Vertrauens-Badges, Liefer-Hinweise oder Ratenzahlungsinfos.
add_action( 'woocommerce_after_add_to_cart_button', function() {
echo '<p class="delivery-note">Lieferung in 2–3 Werktagen</p>';
} );
3. woocommerce_thankyou (Action)
Wird nach erfolgreicher Bestellung auf der Danke-Seite ausgelöst und übergibt die Order-ID. Ich verwende ihn für Tracking-Pixel oder individuelle Nachrichten je nach Produkt.
add_action( 'woocommerce_thankyou', function( $order_id ) {
$order = wc_get_order( $order_id );
echo '<p>Danke, ' . esc_html( $order->get_billing_first_name() ) . '!</p>';
} );
4. woocommerce_checkout_fields (Filter)
Gibt alle Checkout-Felder als Array zurück. Felder lassen sich hinzufügen, entfernen oder umbenennen – ohne Plugin. Das Firmenfeld zum Beispiel ist bei B2C-Shops oft störend:
add_filter( 'woocommerce_checkout_fields', function( $fields ) {
unset( $fields['billing']['billing_company'] );
return $fields;
} );
5. woocommerce_product_query (Action)
Greift direkt in die WP_Query für Produktarchive ein. Nützlich zum Ausblenden bestimmter Kategorien oder für Custom-Sortierungen.
add_action( 'woocommerce_product_query', function( $query ) {
$query->set( 'orderby', 'date' );
$query->set( 'order', 'DESC' );
} );
6. woocommerce_cart_item_price (Filter)
Ändert die angezeigte Preis-HTML im Warenkorb. Ich nutze ihn, wenn ich neben dem Preis noch zusätzliche Infos ausgeben möchte.
add_filter( 'woocommerce_cart_item_price', function( $price_html, $cart_item, $cart_item_key ) {
return $price_html . '<small> inkl. MwSt.</small>';
}, 10, 3 );
7. woocommerce_email_order_meta (Action)
Fügt der Bestellbestätigungs-Mail eigene Inhalte hinzu – zum Beispiel Custom-Fields oder Hinweise je nach Bestellart.
add_action( 'woocommerce_email_order_meta', function( $order, $sent_to_admin, $plain_text ) {
if ( $plain_text ) {
return;
}
echo '<p>Vielen Dank für deine Bestellung!</p>';
}, 10, 3 );
8. woocommerce_single_product_summary (Action)
Steuert via Priorität, welche Elemente im Produkt-Summary-Bereich wo erscheinen. Sehr mächtig für Layout-Anpassungen – ich kann bestehende Hooks entfernen und an anderer Stelle neu einhängen.
// Preis nach oben verschieben (Standard-Priorität ist 10)
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
add_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 5 );
9. woocommerce_add_to_cart_validation (Filter)
Validiert, bevor ein Produkt in den Warenkorb gelegt wird. Gibt der Filter false zurück, wird der Artikel nicht hinzugefügt und eine Fehlermeldung erscheint.
add_filter( 'woocommerce_add_to_cart_validation', function( $passed, $product_id, $quantity ) {
if ( $quantity > 5 ) {
wc_add_notice( 'Maximal 5 Stück pro Bestellung.', 'error' );
return false;
}
return $passed;
}, 10, 3 );
10. woocommerce_order_status_changed (Action)
Feuert bei jeder Statusänderung einer Bestellung und übergibt Order-ID, alten und neuen Status. Ideal für Automationen – ich nutze ihn zum Beispiel, um bei abgeschlossenen Bestellungen eine externe API zu informieren.
add_action( 'woocommerce_order_status_changed', function( $order_id, $old_status, $new_status ) {
if ( 'completed' !== $new_status ) {
return;
}
$order = wc_get_order( $order_id );
// API-Call oder sonstige Logik hier
}, 10, 3 );
Wo gehört der Code hin?
Kurze Antwort: nie in die functions.php des Parent-Themes. Ich arbeite stattdessen mit zwei Ansätzen:
- Child-Theme functions.php – für kleinere, themespezifische Anpassungen.
- Eigenes Must-Use Plugin – für alles, was theme-unabhängig bleiben soll. Ich lege dafür ein ls-customer-Plugin an. So bleibt der Code beim Theme-Wechsel erhalten und geht nicht verloren.
Fazit
WooCommerce-Hooks sind das mächtigste Werkzeug, das ich bei der Shop-Entwicklung habe. Statt Templates zu überschreiben oder den Core anzufassen, hänge ich mich sauber in den vorhandenen Hook-Apparat ein – update-sicher und wartbar. Die zehn hier gezeigten Hooks decken einen Großteil der typischen Anpassungen ab. Die vollständige Referenz findest du in der offiziellen WooCommerce-Dokumentation.