Chatbot-Power für WordPress & WooCommerce – Mit KI zu mehr Kundenservice
In einer Zeit, in der schnelle und präzise Antworten über Produkte, Varianten und FAQs entscheidend sind, gewinnt ein KI-basierter Chatbot immer mehr an Bedeutung. Insbesondere für WordPress-Blogs und WooCommerce-Shops bietet ein solcher Chatbot enorme Vorteile – von der Entlastung des Kundenservices bis zur Steigerung der Kundenzufriedenheit. In diesem Artikel erfährst du, wie du einen Chatbot entwickeln kannst, der speziell auf deine Website und deinen Shop zugeschnitten ist, und welche Best Practices du dabei beachten solltest.
Warum ein Chatbot für WordPress und WooCommerce?
Kunden haben oft viele Fragen:
- Produktvarianten: Welche Ausprägungen, Farben oder Größen sind verfügbar?
- FAQ: Wie lauten die Antworten zu Versand, Rückgabe, Garantie oder Bezahlung?
- Allgemeine Informationen: Was bietet der Blog und welche Besonderheiten weist der Shop auf?
Ein Chatbot kann diese Fragen rund um die Uhr beantworten – und zwar auf Basis von Inhalten, die direkt aus deiner Website stammen. Dadurch erhalten Kunden schnell und unkompliziert Antworten, ohne lange in FAQ-Listen oder Produktbeschreibungen suchen zu müssen.
Technische Umsetzung: Backend & Frontend
Backend mit PHP, JSON und Sicherheitsmaßnahmen
Im Kern läuft der Chatbot über ein PHP-Backend, das über die OpenAI API generative Antworten bereitstellt. Die Kommunikation erfolgt dabei per JSON, sodass der gesamte Konversationsverlauf, inklusive eines initialen Systemprompts, stets verfügbar ist.
Wichtige Aspekte:
- Systemprompt mit PDF/TXT-Inhalt:
Beim Start des Chats wird ein Systemprompt gesetzt, der alle wichtigen Informationen aus deiner Website enthält. Dabei kannst du auf den IntelliExport AI Data Preparation Tool zurückgreifen. Dieses Tool extrahiert PDF- oder TXT-Inhalte aus deiner WordPress-/WooCommerce-Installation und bereitet sie so auf, dass sie direkt als Kontext für den Chatbot genutzt werden können. - Session-Management:
PHP-Sessions sorgen dafür, dass jeder Nutzer einen eigenen Konversationsverlauf erhält. So bleibt die Kommunikation zwischen verschiedenen Besuchern isoliert. - Input-Validierung und Timeout:
Um Missbrauch zu verhindern, wird die Benutzereingabe auf maximal 50 Wörter begrenzt – sowohl im Frontend als auch im Backend. Während der Verarbeitung wird der Senden-Button deaktiviert, um Mehrfachanfragen zu vermeiden. - Sicherheitsmaßnahmen:
CSRF-Token und HTTP-Referer-Checks stellen sicher, dass nur legitime Anfragen von deiner Domain verarbeitet werden. - Logging:
Jede Frage und Antwort wird mit einem Zeitstempel in einer Logdatei gespeichert, sodass du jederzeit nachvollziehen kannst, wie der Chatbot genutzt wird und wo Optimierungsbedarf besteht. - API-Key-Verwaltung:
Es empfiehlt sich, für diese Anwendung einen eigenen API-Key anzulegen. So kannst du die Nutzung besser überwachen und den Zugang gezielt absichern.
Frontend mit Bootstrap und AJAX
Das Frontend setzt auf ein modernes, responsives Design mithilfe von Bootstrap. Hier einige Highlights:
- Chatblasen-Design:
- Bot-Antworten: Blasses Blau, linksbündig
- Benutzerfragen: Blasses Rot, rechtsbündig
Dank Flexbox bleibt das Layout übersichtlich und benutzerfreundlich.
- AJAX-Fetch:
Die Kommunikation zwischen Frontend und Backend erfolgt asynchron via Fetch API. Das sorgt für eine flüssige Nutzererfahrung, bei der neue Nachrichten dynamisch in den Chat geladen werden. - Eingabefeld & Senden-Button:
Das Eingabefeld begrenzt die Texteingabe automatisch auf 50 Wörter, und der Senden-Button wird während der Bearbeitung vor erneuten Klicks geschützt.
Best Practices: Sicherheit und Performance
- Eingabeschranken und Timeout:
Beschränke die Eingaben auf maximal 50 Wörter und sorge dafür, dass der Senden-Button während der Anfrage deaktiviert wird. Dies verhindert Spam und Überlastung des Systems. - Sicherheitsprüfungen:
Verwende CSRF-Token und prüfe den HTTP-Referer, um sicherzustellen, dass Anfragen nur von deiner eigenen Domain stammen. So schützt du deinen Chatbot vor Missbrauch. - Eigenständiger API-Key:
Lege einen neuen API-Key speziell für deinen Chatbot an. Dies ermöglicht es dir, die Nutzung zu überwachen und bei Bedarf den Zugang einzuschränken. - Logging:
Führe ein detailliertes Log, in dem jede Frage und Antwort mit Zeitstempel festgehalten wird. Dies hilft dir, das Verhalten des Chatbots zu analysieren und kontinuierlich zu optimieren. - Integration des IntelliExport AI Data Preparation Tools:
Mit diesem Tool (GitHub-Link) kannst du automatisch Inhalte aus deinen PDF- oder TXT-Dateien extrahieren. So hast du immer aktuelle und relevante Informationen im Systemprompt, die deinem Chatbot als Basis für Antworten dienen.
Ein KI-basierter Chatbot, der nahtlos in deinen WordPress-Blog und WooCommerce-Shop integriert ist, bietet einen echten Mehrwert: Er beantwortet Fragen zu Produkten, Varianten und FAQs in Echtzeit und verbessert so die Kundenzufriedenheit erheblich. Mit durchdachten Sicherheitsmaßnahmen, einer klaren Eingabebegrenzung und dem Einsatz von Tools wie dem IntelliExport AI Data Preparation Tool hast du alle Zutaten, um einen leistungsstarken und sicheren Chatbot zu entwickeln.
Das Backend
<?php
session_start();
header('Content-Type: application/json');
// Allowed Domain: Passe hier deine Domain an (ohne http(s)://)
$allowedDomain = 'example.com';
// Überprüfe den Referer, ob die Anfrage von deiner Domain kommt
if (!isset($_SERVER['HTTP_REFERER'])) {
echo json_encode(['error' => 'Keine gültige Referer-Information.']);
exit;
} else {
$referrerHost = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
if ($referrerHost !== $allowedDomain && $referrerHost !== "www.$allowedDomain") {
echo json_encode(['error' => 'Unberechtigter Zugriff.']);
exit;
}
}
// CSRF Token: Erstelle einen Token in der Session, falls nicht vorhanden
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// Lese den JSON-Input
$inputJSON = file_get_contents('php://input');
$input = json_decode($inputJSON, true);
// Prüfe, ob "user_input" und "csrf_token" vorhanden sind
if (!$input || !isset($input['user_input']) || !isset($input['csrf_token'])) {
echo json_encode(['error' => 'Ungültige Anfrage.']);
exit;
}
// Überprüfe den CSRF Token
if ($input['csrf_token'] !== $_SESSION['csrf_token']) {
echo json_encode(['error' => 'Ungültiger CSRF Token.']);
exit;
}
$userInput = trim($input['user_input']);
// Input-Limitierung: max. 50 Wörter
if (str_word_count($userInput) > 50) {
echo json_encode(['error' => 'Die Eingabe überschreitet 50 Wörter.']);
exit;
}
// Logging einrichten: Pfad zur Logdatei (Passe den Pfad an)
$logFile = '/pfad/zu/deinem/chat_log.txt';
// Logge die Benutzeranfrage mit Zeitstempel
$logEntry = "[" . date('Y-m-d H:i:s') . "] Benutzer: " . $userInput . "\n";
file_put_contents($logFile, $logEntry, FILE_APPEND);
// Initialisiere den Konversationsverlauf (Systemprompt mit TXT-Inhalt) falls noch nicht vorhanden
if (!isset($_SESSION['conversation'])) {
$txtFilePath = '/pfad/zu/deiner/datei.txt'; // Passe hier den Pfad an
if (file_exists($txtFilePath)) {
$txtContent = file_get_contents($txtFilePath);
} else {
echo json_encode(['error' => 'TXT-Datei nicht gefunden.']);
exit;
}
// Optional: Text kürzen, um Token-Limits zu berücksichtigen (z. B. 2000 Zeichen)
$maxCharacters = 2000;
$txtContent = substr($txtContent, 0, $maxCharacters);
$systemPrompt = "Du bist ein hilfreicher Assistent. Hier sind wichtige Informationen aus unserem Dokument:\n" . $txtContent;
$_SESSION['conversation'] = [
[
"role" => "system",
"content" => $systemPrompt
]
];
}
// Füge die Benutzernachricht zum Konversationsverlauf hinzu
$_SESSION['conversation'][] = [
"role" => "user",
"content" => $userInput
];
// OpenAI API-Konfiguration
$apiKey = 'YOUR_OPENAI_API_KEY';
$apiUrl = 'https://api.openai.com/v1/chat/completions';
$data = [
"model" => "gpt-3.5-turbo", // oder "gpt-4", wenn verfügbar
"messages" => $_SESSION['conversation'],
"temperature" => 0.7
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer ' . $apiKey
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$response = curl_exec($ch);
if (curl_errno($ch)) {
$error_msg = curl_error($ch);
echo json_encode(['error' => 'cURL-Fehler: ' . $error_msg]);
curl_close($ch);
exit;
}
curl_close($ch);
$responseData = json_decode($response, true);
if (isset($responseData['choices'][0]['message']['content'])) {
$assistantReply = $responseData['choices'][0]['message']['content'];
$_SESSION['conversation'][] = [
"role" => "assistant",
"content" => $assistantReply
];
// Logge die Antwort des Assistenten mit Zeitstempel
$logEntry = "[" . date('Y-m-d H:i:s') . "] Assistent: " . $assistantReply . "\n";
file_put_contents($logFile, $logEntry, FILE_APPEND);
echo json_encode(['reply' => $assistantReply]);
} else {
echo json_encode(['error' => 'Keine Antwort erhalten.']);
}
?>
Das Frontend
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Chatbot Frontend</title>
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- CSRF Token aus der Session (diese Seite sollte als PHP ausgeliefert werden, damit der Token gesetzt wird) -->
<meta name="csrf-token" content="<?php session_start(); echo $_SESSION['csrf_token']; ?>">
<style>
.chat-container {
display: flex;
flex-direction: column;
height: 70vh;
overflow-y: auto;
margin-bottom: 1rem;
padding: 1rem;
border: 1px solid #ddd;
border-radius: 5px;
background: #f8f9fa;
}
.chat-bubble {
padding: 10px 15px;
border-radius: 20px;
margin: 5px;
max-width: 75%;
word-wrap: break-word;
}
/* Bot (links, blasses Blau) */
.chat-bubble.bot {
background-color: #cce5ff;
align-self: flex-start;
}
/* User (rechts, blasses Rot) */
.chat-bubble.user {
background-color: #f8d7da;
align-self: flex-end;
}
</style>
</head>
<body>
<div class="container my-3">
<!-- Chatverlauf -->
<div id="chatContainer" class="chat-container"></div>
<!-- Eingabefeld und Senden-Button -->
<div class="input-group">
<input type="text" id="userInput" class="form-control" placeholder="Deine Frage (max. 50 Wörter)..." aria-label="Deine Frage">
<button class="btn btn-primary" id="sendButton">Senden</button>
</div>
</div>
<script>
let isProcessing = false;
const sendButton = document.getElementById('sendButton');
const userInputField = document.getElementById('userInput');
const chatContainer = document.getElementById('chatContainer');
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
// Begrenze das Eingabefeld auf 50 Wörter
userInputField.addEventListener('input', function() {
let words = this.value.trim().split(/\s+/);
if (words.length > 50) {
this.value = words.slice(0, 50).join(" ");
}
});
// Eventlistener für Senden-Button und Enter-Taste
sendButton.addEventListener('click', sendMessage);
userInputField.addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
sendMessage();
}
});
function sendMessage() {
if (isProcessing) return; // Verhindert Mehrfachklicks
const message = userInputField.value.trim();
if (message === "") return;
// Zeige die User-Nachricht im Chat (rechts)
appendMessage(message, 'user');
userInputField.value = "";
// Deaktiviere den Button während der Verarbeitung
isProcessing = true;
sendButton.disabled = true;
// Sende die Nachricht per AJAX an das Backend
fetch('path/to/your/backend.php', { // Passe den Pfad zu deinem PHP-Backend an
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
user_input: message,
csrf_token: csrfToken
})
})
.then(response => response.json())
.then(data => {
if (data.reply) {
appendMessage(data.reply, 'bot');
} else {
appendMessage("Fehler: " + (data.error || "Unbekannter Fehler"), 'bot');
}
isProcessing = false;
sendButton.disabled = false;
})
.catch(error => {
appendMessage("Fehler: " + error, 'bot');
isProcessing = false;
sendButton.disabled = false;
});
}
function appendMessage(text, sender) {
const bubble = document.createElement('div');
bubble.classList.add('chat-bubble', sender);
bubble.textContent = text;
chatContainer.appendChild(bubble);
chatContainer.scrollTop = chatContainer.scrollHeight;
}
</script>
</body>
</html>
0 Kommentare