WordPress als Kundenportal, Access als Backoffice: So funktioniert die Architektur in der Praxis

Warum diese Kombination?

Access ist bei vielen KMU das Herzstück.
Rechnungen, Stammdaten, Kalkulation, alles lokal.
Aber Kunden wollen online zugreifen – auf Dokumente, Aufträge, Daten.

WordPress ist schnell aufgesetzt.
Benutzerverwaltung, Login, Rollen – alles da.
Und: mobil nutzbar.

Ich nutze WordPress als Frontend.
Und Access bleibt das Backoffice.

Architektur im Überblick

KomponenteAufgabe
WordPressKundenportal mit Login
MySQLWeb-Datenhaltung (Kopie)
AccessDatenpflege, Businesslogik
ODBC / RESTBrücke zwischen beiden Welten

Du pflegst alles in Access.
Der Kunde sieht nur das, was Du ihm freigibst – in WordPress.

Datenfluss: Von Access nach WordPress

Ziel: Access schiebt selektive Daten in die WordPress-MySQL.

Beispiel in VBA:

Sub KundeExportieren(kundeID As Long)
    Dim dbWeb As DAO.Database
    Set dbWeb = OpenDatabase("", False, False, _
        "ODBC;Driver={MySQL ODBC 8.0 Driver};Server=wp-db;Database=wordpress;UID=apiuser;PWD=geheim;")

    dbWeb.Execute "DELETE FROM wp_kundendaten WHERE kunde_id = " & kundeID

    dbWeb.Execute "INSERT INTO wp_kundendaten (kunde_id, name, status) " & _
        "SELECT ID, Firma, Status FROM tblKunde WHERE ID = " & kundeID

    dbWeb.Close
End Sub

Wichtig: Nur Freigabe-Felder schreiben. Kein Wildwuchs.
Und: Nur lesend übergeben, nicht bidirektional.

WordPress: Daten anzeigen ohne Admin-Zugang

Custom Post Types brauchst Du nicht.
Ich arbeite mit Shortcodes und wpdb.

Beispiel in functions.php:

add_shortcode('kundendaten', 'zeige_kundendaten');

function zeige_kundendaten() {
    global $wpdb;
    $user_id = get_current_user_id();
    $kunde_id = get_user_meta($user_id, 'access_kunde_id', true);

    $daten = $wpdb->get_results("SELECT * FROM wp_kundendaten WHERE kunde_id = $kunde_id");

    foreach ($daten as $zeile) {
        echo "<p><strong>Firma:</strong> " . esc_html($zeile->name) . "</p>";
        echo "<p><strong>Status:</strong> " . esc_html($zeile->status) . "</p>";
    }
}

Der Kunde sieht nur seine Daten.
Kein wp-admin nötig.

Authentifizierung und Rechte

Ich weise jedem WordPress-User eine access_kunde_id zu.
Das ist der Schlüssel in beide Richtungen.

In Access steht:

SELECT * FROM tblKunde WHERE ID = [Formulare]![frmBenutzer]![KundeID]

In WordPress prüfe ich:
Darf dieser Nutzer diese kunde_id sehen?

Synchronisierung und Automatisierung

Ich arbeite mit Aufgabenplanung.
Beispiel: nächtlicher Export über Access:

Sub Nachtsync()
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT ID FROM tblKunde WHERE SichtbarWeb = TRUE")

    Do While Not rs.EOF
        Call KundeExportieren(rs!ID)
        rs.MoveNext
    Loop
    rs.Close
End Sub

Der Taskplaner startet Access:

msaccess.exe "C:\DeineDB.accdb" /x Nachtsync

Keine manuelle Pflege.
Keine Zwischenhändler.

Zugriff vom Kunden: Einfach, responsiv, rollenbasiert

Ich nutze das Plugin MemberPress oder User Role Editor.
Damit steuere ich, wer was sieht.
Und welche Seiten für wen sichtbar sind.

Wenn der Kunde neue Daten braucht:
In Access markieren, exportieren, WordPress zeigt’s an.

Alternative: REST-API statt MySQL-ODBC

Du kannst auch direkt die WordPress-REST-API nutzen.
Ich mache das bei kleinen Datenmengen:

Function HoleWPToken()
    Dim http As Object
    Set http = CreateObject("MSXML2.XMLHTTP")

    http.Open "POST", "https://portal.de/wp-json/jwt-auth/v1/token", False
    http.setRequestHeader "Content-Type", "application/json"
    http.Send "{""username"":""apiuser"",""password"":""geheim""}"

    Debug.Print http.responseText
End Function

Oder Daten als JSON übergeben.
Mehr Aufwand, aber flexibler.

Was ich nicht mache

  • Kein Schreiben direkt von WordPress in Access
  • Kein Vollzugriff auf Access von außen
  • Keine direkten MySQL-Verbindungen aus Access über Internet ohne VPN

Klare Trennung, saubere Übergabe.

Access bleibt Herr der Daten.
WordPress zeigt, was gesehen werden soll.
Die Technik dazwischen hält sich raus.
Und der Kunde merkt davon nichts.

Kategorien:

Keine Antworten

Schreibe einen Kommentar

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

To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (Find out more about Webmentions.)