Skip to content

[Feature] Batch-Endpoints für WooCommerce Stock-Sync — 100× weniger Requests pro Lauf #263

@Avatarsia

Description

@Avatarsia

TL;DR

Der WooCommerce-Lagerbestands-Sync sendet aktuell zwei Einzel-Requests pro Artikel
(SKU-Suche + Update). Bei 1.000 Artikeln sind das 2.000 HTTP-Roundtrips pro Sync-Lauf.
WooCommerce bietet offiziell products/batch- und products/variations/batch-Endpoints,
die bis zu 100 Artikel in einem Request aktualisieren. Umstellung reduziert die
Request-Menge um Faktor ~100 und macht den Sync deutlich robuster gegen Timeouts und
Hoster-Rate-Limits.


Detaillierte Analyse (LLM-generiert, Claude Opus 4.7)

Problem

In www/pages/shopimporter_woocommerce.php, Methode ImportSendListLager (~Zeile 476–543),
aktualisiert der Lagerbestands-Sync jeden Artikel einzeln über zwei sequenzielle HTTP-Calls:

  1. GET /wc/v3/products?sku=<sku> — SKU-zu-ID-Auflösung
  2. PUT /wc/v3/products/{id} bzw. PUT /wc/v3/products/{parent_id}/variations/{id} — Update

Bei n Artikeln ergibt das 2n Roundtrips gegen den WooCommerce-Shop.

Kein Retry-Mechanismus, kein Batching. Ein einzelner Timeout oder ein 429-Response
bricht den gesamten Sync-Lauf ab — der restliche Lagerbestand bleibt stale.

Auswirkung

Shop-Größe Requests Ø 300 ms/Request Laufzeit
100 Artikel 200 ~1 Min
1.000 Artikel 2.000 ~10 Min
5.000 Artikel 10.000 ~50 Min
  • Mittlere Hoster begrenzen oft auf 60–300 Requests/min → bei 1.000 Artikeln
    ist ein Rate-Limit-Abbruch nahezu sicher.
  • Abbruch mittendrin: Rest-Bestand bleibt stale bis zum nächsten Cron-Lauf —
    potenziell Überverkäufe bei gleichzeitig eingehendem Bestellvolumen.
  • Kein partielles Weiterführen nach Fehler — immer kompletter Neustart nötig.

Vorgeschlagene Lösung

Die WooCommerce REST API v3 bietet offizielle Batch-Endpoints
(Doku: https://woocommerce.github.io/woocommerce-rest-api-docs/#batch-update-products):

POST /wc/v3/products/batch
{
  "update": [
    { "id": 123, "stock_quantity": 42, "manage_stock": true },
    { "id": 456, "stock_quantity": 7,  "manage_stock": true },
    ...
  ]
}

Analog für Varianten:

POST /wc/v3/products/{parent_id}/variations/batch
{
  "update": [ { "id": 789, "stock_quantity": 15 }, ... ]
}

WooCommerce verarbeitet bis zu 100 Items pro Batch (konfigurierbares Default).

Umsetzungsschritte

  1. SKU→ID-Auflösung vorverlegen: Statt pro Artikel ein GET products?sku=...
    abzusetzen, einmalig alle relevanten Produkte mit Pagination abrufen und eine
    lokale SKU-zu-ID-Map aufbauen. Spart die Hälfte aller Requests.

  2. Artikel in 100er-Chunks aufteilen (einfache array_chunk-Schleife).

  3. Pro Chunk einen POST .../batch-Request absetzen statt 100 Einzel-PUTs.

  4. Partial-Error-Handling: Der Batch-Response enthält pro Item Success/Error.
    Nur fehlgeschlagene Items loggen, erfolgreiche als erledigt markieren — kein
    Abbruch des Gesamtlaufs.

Vorteile

  • Geschwindigkeit: ~100× weniger Requests (2.000 → 20 bei 1.000 Artikeln).
  • Resilienz: Ein Batch-Fehler verliert max. 100 Items statt den kompletten Sync.
  • Rate-Limit-freundlich: Drastisch weniger Roundtrips → 429-Risiko minimal.
  • Keine neuen Abhängigkeiten: Batch-Endpoints sind in wc/v3 seit WooCommerce 3.x
    stabil und bereits in der verwendeten API-Version enthalten.

Abgrenzung zu bestehenden Issues

Betrifft

  • www/pages/shopimporter_woocommerce.php — Methode ImportSendListLager, ggf.
    neue private Helper-Methoden für Batch-Chunking und SKU-Map-Aufbau.

Umgebung

  • OpenXE 1.12
  • WooCommerce 10.x (Batch-Endpoints seit WC 3.x stabil)
  • WordPress 6.x

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions