WordPress: Lieferantenportale integrieren – Bestellungen, Bestätigungen und Kommunikation digitalisieren

Was Du brauchst

Du willst Bestellungen digital bereitstellen.
Lieferanten sollen Termine zurückmelden.
Und Dein Einkauf will endlich alles an einem Ort sehen.
Geht mit WordPress. Ohne große ERP-Integration. Aber mit Verstand.

Datenbasis: Bestellung, Position, Teillieferung

Wir brauchen 3 Ebenen:

  • Bestellung (z. B. 4711)
  • Position (z. B. Pos. 10: 50 Bretter, 20 mm Fichte)
  • Teillieferung (z. B. 30 Bretter am 10.05., 20 am 17.05.)

Die kannst Du als eigene Tabellen modellieren – oder als CPTs mit Meta-Feldern.
Ich zeig’s hier per Custom Tables.

Tabelle anlegen (einmalig)

function ds_Lieferantenportal_tabellen() {
    global $wpdb;

    $sqls = [];

    $sqls[] = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}lp_bestellungen (
        id BIGINT AUTO_INCREMENT PRIMARY KEY,
        bestellnr VARCHAR(50),
        lieferant_id BIGINT,
        erstellt DATETIME DEFAULT CURRENT_TIMESTAMP
    )";

    $sqls[] = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}lp_positionen (
        id BIGINT AUTO_INCREMENT PRIMARY KEY,
        bestellung_id BIGINT,
        artikel VARCHAR(255),
        menge INT,
        einheit VARCHAR(10)
    )";

    $sqls[] = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}lp_teillieferungen (
        id BIGINT AUTO_INCREMENT PRIMARY KEY,
        position_id BIGINT,
        menge INT,
        lieferdatum DATE
    )";

    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    foreach ($sqls as $sql) {
        dbDelta($sql);
    }
}
register_activation_hook(__FILE__, 'ds_lieferantenportal_tabellen');

Rollen: Lieferant vs. Mitarbeiter

Du brauchst zwei Benutzerrollen:

  • Lieferant: darf eigene Liefertermine erfassen
  • Mitarbeiter: sieht alles, kann kommentieren, verwalten
function ds_lieferantenrollen() {
    add_role('lieferant', 'Lieferant', [
        'read' => true,
    ]);

    add_role('mitarbeiter', 'Mitarbeiter', [
        'read' => true,
        'edit_posts' => true,
    ]);
}
register_activation_hook(__FILE__, 'ds_lieferantenrollen');

Dashboard-Ansicht für Lieferanten

Zeig jedem Lieferanten nur seine Bestellungen.

function ds_bestellungen_liste($user_id) {
    global $wpdb;

    $bestellungen = $wpdb->get_results($wpdb->prepare(
        "SELECT * FROM {$wpdb->prefix}lp_bestellungen WHERE lieferant_id = %d",
        $user_id
    ));

    foreach ($bestellungen as $b) {
        echo '<h3>Bestellung: ' . esc_html($b->bestellnr) . '</h3>';
        ds_positionen_liste($b->id);
    }
}

function ds_positionen_liste($bestellung_id) {
    global $wpdb;

    $positionen = $wpdb->get_results($wpdb->prepare(
        "SELECT * FROM {$wpdb->prefix}lp_positionen WHERE bestellung_id = %d",
        $bestellung_id
    ));

    echo '<ul>';
    foreach ($positionen as $p) {
        echo '<li>' . esc_html($p->artikel) . ' - ' . esc_html($p->menge) . ' ' . esc_html($p->einheit);
        echo '<br>Teillieferung erfassen: <input type="date" name="datum_' . $p->id . '"> <input type="number" name="menge_' . $p->id . '">';
        echo '</li>';
    }
    echo '</ul>';
}

Termin speichern

Einfaches Beispiel für ein Formular-Handling.

function ds_teillieferung_speichern() {
    global $wpdb;
    $positionen = $_POST['positionen'] ?? [];

    foreach ($positionen as $pos_id => $daten) {
        if (!empty($daten['datum']) && !empty($daten['menge'])) {
            $wpdb->insert($wpdb->prefix . 'lp_teillieferungen', [
                'position_id' => intval($pos_id),
                'lieferdatum' => sanitize_text_field($daten['datum']),
                'menge'       => intval($daten['menge']),
            ]);
        }
    }
}
add_action('admin_post_ds_lieferung', 'ds_teillieferung_speichern');

Kommunikation: Kommentar pro Position

Du willst Rückfragen oder Hinweise.
Funktioniert mit einer einfachen Kommentartabelle – oder Du verwendest comments mit comment_type = 'lieferkommentar'.

wp_insert_comment([
    'comment_post_ID' => 0,
    'comment_author'  => 'Lieferant Mustermann',
    'comment_content' => 'Kann erst nächste Woche liefern.',
    'comment_type'    => 'lieferkommentar',
    'user_id'         => get_current_user_id(),
]);

Automatische Benachrichtigung an Mitarbeiter

Wenn ein Liefertermin eingeht, willst Du eine Info-Mail.

function ds_benachrichtigung_mail($text) {
    $admins = get_users(['role' => 'mitarbeiter']);

    foreach ($admins as $a) {
        wp_mail($a->user_email, 'Neue Teillieferung eingetragen', $text);
    }
}

Einfach aufrufen nach dem Eintrag.

Fazit: Lieferantenportal in WordPress? Geht.

FeatureStatus
Bestellungen anzeigen
Teillieferung melden
Termin speichern
Kommentare möglich
Rollen und Rechte

Kein fremdes System. Keine monatlichen Kosten.
Du baust’s einmal – und nutzt es jeden Tag.