Bidirektionaler Abgleich von Produktdaten: Access-Frontend mit WooCommerce-Backend koppeln

Warum ich Access und Woo zusammenbringe

Viele KMUs pflegen ihre Produktdaten in Access.
Weil es einfach ist, weil es da ist, weil es lÀuft.
Gleichzeitig soll WooCommerce im Frontend aktuelle Infos zeigen – und neue Daten (BestĂ€nde, Preise) zurĂŒckspielen.
Ich zeige Dir, wie ich den bidirektionalen Sync gelöst habe: robust, nachvollziehbar, ohne Bauchschmerzen.

Architektur im Überblick

SchichtFunktion
Access FrontendPflege von Artikeln, Preisen, Lager
WooCommerce APIREST-Zugriff auf Produkte, Lager, Preise
PHP HooksEingehende Daten aus Woo validieren
SQLite / JSONZwischenspeicher fĂŒr Sync-Deltas (optional)
VBA SchedulerSync-Intervalle & Konfliktlösung

1. Artikel aus WooCommerce abrufen

Ich ziehe die Artikel nicht direkt aus der Datenbank, sondern per REST-API.
Das ist sicherer und unabhÀngig vom Hosting.

REST-Aufruf in VBA

Function LadeWooProdukteJson() As String
    Dim http As Object
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

    http.Open "GET", "https://deinshop.de/wp-json/wc/v3/products?per_page=100", False
    http.SetRequestHeader "Authorization", "Basic " & Base64BenutzerPW()
    http.Send

    If http.Status = 200 Then
        LadeWooProdukteJson = http.ResponseText
    Else
        LadeWooProdukteJson = ""
    End If
End Function

Parser: JSON nach Tabelle

Nutze VBA-JSON (JsonConverter.bas) fĂŒr das Parsen.
Beispiel: Produktname, SKU, Preis, Lager

Sub ImportiereProdukte()
    Dim js As Object, itm As Variant
    Set js = JsonConverter.ParseJson(LadeWooProdukteJson)
    
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("tblWooProdukte", dbOpenDynaset)

    For Each itm In js
        rs.AddNew
        rs!woo_id = itm("id")
        rs!name = itm("name")
        rs!sku = itm("sku")
        rs!preis = itm("price")
        rs!bestand = itm("stock_quantity")
        rs.Update
    Next
End Sub

2. Daten aus Access nach WooCommerce schreiben

Du willst nicht immer alles hochladen – nur geĂ€nderte Daten.
Ich nutze eine Tabelle tblSyncStatus, in der der letzte Sync-Zeitpunkt pro Artikel steht.

Preis/Lager per REST aktualisieren

Sub UpdateWooPreisBestand(wooID As Long, preis As Double, bestand As Long)
    Dim http As Object
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

    Dim payload As String
    payload = "{""regular_price"":""" & preis & """,""stock_quantity"":" & bestand & "}"

    http.Open "PUT", "https://deinshop.de/wp-json/wc/v3/products/" & wooID, False
    http.SetRequestHeader "Authorization", "Basic " & Base64BenutzerPW()
    http.SetRequestHeader "Content-Type", "application/json"
    http.Send payload

    If http.Status <> 200 Then MsgBox "Fehler beim Sync: " & http.ResponseText
End Sub

3. WooCommerce-Änderungen empfangen (z. B. neue Produkte)

Woo kann bei Ereignissen HTTP-Requests senden („Webhooks“).

Beispiel: Neuer Artikel angelegt

add_action('woocommerce_new_product', function($id) {
    $post = get_post($id);
    $product = wc_get_product($id);

    $data = [
        'id' => $id,
        'sku' => $product->get_sku(),
        'name' => $product->get_name(),
        'price' => $product->get_price(),
        'qty' => $product->get_stock_quantity()
    ];

    wp_remote_post("https://access-sync.de/api/newproduct.php", [
        'body' => json_encode($data),
        'headers' => ['Content-Type' => 'application/json']
    ]);
});

Der newproduct.php-Endpunkt schreibt dann z. B. in eine CSV oder SQLite, die Access regelmĂ€ĂŸig ausliest.

4. Konfliktlösung und Sync-Matrix

Ich fĂŒhre in Access eine einfache tblSyncMatrix:

ArtikelNrWooIDGeÀndert AccessGeÀndert WooStatus
47111872024-05-10 12:312024-05-10 12:28Konflikt
47121882024-05-10 12:20NULLUpload
4713189NULL2024-05-10 12:30Download

Regel:
Wenn beide geĂ€ndert: manuelle PrĂŒfung
Sonst automatisch synchronisieren

5. Basisauth sicher speichern

Zugangsdaten nicht im Klartext

Function Base64BenutzerPW() As String
    Dim s As String
    s = LadeToken() ' DPAPI-verschlĂŒsselter String
    Base64BenutzerPW = EncodeBase64(s)
End Function

Funktion EncodeBase64() findest Du in vielen VBA-Snippets.
Die Zugangsdaten (Benutzer:Passwort) speichere ich verschlĂŒsselt per DPAPI, wie hier beschrieben.

6. Automatisieren im TagesgeschÀft

Workflow in VBA

Sub TĂ€glicherSync()
    ImportiereProdukte
    PrĂŒfeUndLadeÄnderungenVonWoo
    PrĂŒfeUndLadeÄnderungenVonAccess
    KonflikteKennzeichnen
    KonflikteAnzeigenOderLösen
End Sub

Trigger

  • Bei DB-Start (Autoexec)
  • Geplant ĂŒber Windows-Taskplaner (MSACCESS.exe /x TĂ€glicherSync)

Das asynchrone Fazit

Access und WooCommerce lassen sich sauber verbinden – ohne teure Middleware.
Wichtig ist ein klarer Sync-Plan:
Was darf hoch, was runter, und was nicht automatisch?
Mit REST, DPAPI und etwas Disziplin lĂ€uft das stabil – auch ĂŒber Jahre.

Kategorien:

Keine Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert