إذا سبق لك أن تلقيت بريدًا إلكترونيًا مثل: "لم أجد المعلومات على موقعكم، هل يمكنكم مساعدتي؟"، فأنت بالفعل أمام حالة استخدام جيدة لمحادثة مصغرة مدعومة بالذكاء الاصطناعي. الهدف هنا ليس "استبدال" فريق الدعم لديك، بل تقديم رد أولي مفيد بناءً على محتوى موقعك الإلكتروني. بلا ثَبَّتَ المساعد.
الحاجة / حالة الاستخدام
روبوت محادثة "بسيط" يعمل بالذكاء الاصطناعي WordPress يتمثل غرضها الرئيسي في استيعاب الأسئلة المتكررة: ساعات العمل، سياسة الاسترداد، "أين يمكنني العثور على هذا المنتج أو ذاك؟" الملخصات من دليل طويل، أو مساعدة في التنقل ("أبحث عن شرح حول الروابط الدائمة"). في مدونة، لاحظتُ غالبًا أن 80% من الطلبات الواردة تتلخص في 10 أسئلة.
ما يُضيفه الذكاء الاصطناعي هنا: واجهة دردشة بسيطة، بالإضافة إلى مسار AJAX آمن في ووردبريس يُرسل السؤال إلى واجهة برمجة تطبيقات الذكاء الاصطناعي (مثل OpenAI) ويُعيد استجابةً قابلةً للاستخدام. نحرص على تبسيط الأمور قدر الإمكان: لا توجد أدوات خارجية، ولا حزمة تطوير برمجية (SDK)، ولا تبعيات لـ Composer.
في النهاية، ستعرف:
- عرض صورة قطة صغيرة (HTML/CSS/JS) عبر رمز مختصر في ووردبريس.
- أرسل السؤال إلى خادم WordPress الخاص بك (AJAX) باستخدام رمز nonce (رمز مضاد لهجمات CSRF).
- استدعاء واجهة برمجة تطبيقات الذكاء الاصطناعي باستخدام
wp_remote_post()، معالجة الأخطاء/المهلات، وتخزين الاستجابات مؤقتًا باستخدام Transients. - احمِ مفتاح API الخاص بك (المخزن في
wp-config.php) وتجنب عرضه للمتصفح.
ملخص سريع
- يمكنك إضافة ثابت API في
wp-config.php(لا يتماشى مع الموضوع أبداً). - تقوم بإنشاء ملف مو البرنامج المساعد (إضافة "يجب استخدامها") والتي توفر رمزًا مختصرًا
[ai_chatbot]. - الجبهة (JS) تدعو
admin-ajax.phpباستخدام قيمة عشوائية (nonce)، وليس واجهة برمجة تطبيقات الذكاء الاصطناعي (AI API) بشكل مباشر. - يستدعي الخادم واجهة برمجة التطبيقات (API) عبر
wp_remote_post()مهلة قصيرة، ومعالجة أخطاء نظيفة. - تخزين الاستجابات (العابرة) لتقليل التكاليف.
- تم تنظيف الاستجابة قبل العرض (
wp_kses()) للحد من مخاطر XSS.
متى يُستخدم الذكاء الاصطناعي لهذا الغرض؟
استخدم هذا النوع من برامج الدردشة الآلية إذا:
- تتلقى أسئلة متكررة وتريد "إجابة أولية" فورية.
- محتواك غني بالفعل (الأسئلة الشائعة، صفحات "حول"، الأدلة) ويمكن للذكاء الاصطناعي أن يرشد المستخدم.
- أنت تقبل أن الرد قد يكون غير كامل في بعض الأحيان، وتضيف رسالة واضحة ("رد تلقائي").
- أنت تريد برنامج دردشة خفيف الوزن وسهل التحكم، دون الاعتماد على إضافة مبهمة تقوم بحقن نصوص برمجية خارجية في كل مكان.
أوصي به غالبًا لمدونات الدروس التعليمية، ومواقع العرض، أو المجالات المتخصصة التي تكون فيها الأسئلة مستقرة للغاية (مثل "كيفية الحجز"، و"المواعيد النهائية"، و"الأسعار").
متى لا يجب استخدام الذكاء الاصطناعي
تجنب استخدام الذكاء الاصطناعي إذا كان حل ووردبريس التقليدي يؤدي المهمة بشكل أفضل وأبسط وأرخص:
- بحث داخلي ابدأ بتحسين وظيفة البحث (المقتطفات، والتصنيفات، وصفحة "خريطة الموقع"). قد يكون استخدام الذكاء الاصطناعي مكلفًا لمجرد إخبارك "باستخدام وظيفة البحث".
- دعم حساس (الصحة، القانون، المالية): خطر الهلوسة حقيقي. في هذه الحالات، يُعدّ نموذج الاتصال وقاعدة المعرفة أكثر أمانًا.
- قضايا المعاملات (الأوامر، الحسابات): إذا كانت الاستجابة تعتمد على بيانات خاصة، فلا تقم بتجميع محادثة ذكاء اصطناعي "بسيطة". أنت بحاجة إلى مصادقة حقيقية، وصلاحيات، ونموذج تهديد.
- ميزانية ضيقة إذا كان عدد الزيارات منخفضًا، فلا بأس. أما إذا كان لديك 50,000 زيارة يوميًا، فقد ترتفع التكلفة بشكل كبير إذا لم يكن لديك حدٌّ للتخزين المؤقت/معدل الزيارات.
المتطلبات الأساسية
إصدارات مستهدفة : WordPress 6.9.4 (أبريل 2026) و PHP 8.1+.
مفتاح واجهة برمجة تطبيقات الذكاء الاصطناعي أستخدم OpenAI كمثال لأن واجهة برمجة التطبيقات مستقرة وموثقة جيدًا، ولكن البنية ستكون هي نفسها مع Anthropic/Mistral/Google.
شرح سريع: واجهات برمجة التطبيقات (API) ومكالمات HTTP
- API هي واجهة تسمح لك بطلب شيء ما من خدمة (هنا: "أجب عن هذا السؤال"). من الناحية التقنية، أنت ترسل طلب HTTP (غالبًا في سأعين) مع JSON، وستتلقى JSON في المقابل.
في ووردبريس، يتم ذلك بشكل صحيح عبر واجهة برمجة تطبيقات HTTP: wp_remote_post() (و wp_remote_get()هذه هي الطريقة الموصى بها لأنها تتعامل مع النقل (cURL، التدفقات)، والوكلاء، وتتكامل مع WordPress.
المصدر الرسمي: واجهة برمجة تطبيقات HTTP الخاصة بـ WordPress.
مكان تخزين مفتاح API (مطلوب)
ستقوم بتخزين المفتاح في wp-config.phpليس في ملف القالب، وبالتأكيد ليس في جافا سكريبت. إذا وصل مفتاحك إلى المتصفح، فسيتم نسخه في غضون 30 ثانية واستخدامه على حسابك.
أضف هذا إلى wp-config.php (ويفضل أن يكون ذلك قبل عبارة "هذا كل شيء، توقف عن التحرير!"):
define('BPCAB_OPENAI_API_KEY', 'VOTRE_CLE_ICI');
التكاليف كل رسالة تُرسل إلى واجهة برمجة التطبيقات (API) تُكلّف مبلغًا من المال (لكل رمز مميز). حتى لو كان المبلغ "بضعة سنتات"، فإنه يتراكم. لذلك، سنُطبّق التخزين المؤقت وحدود معدل الإرسال على جانب الخادم.
أين يتم لصق الكود
- الخيار الموصى به : A مو البرنامج المساعد (تكلفة تلقائيا). طريق :
wp-content/mu-plugins/. - البديل : إضافة مخصصة كلاسيكية في
wp-content/plugins/. - للإجتناب :
functions.phpفيما يتعلق بالثيم (خاصة إذا قمت بتغيير الثيمات، أو إذا قام برنامج الإنشاء بتحديث الملفات).
الوثائق الرسمية لـ mu-plugins: المكونات الإضافية التي يجب استخدامها.
بنية الحل
إليكم ملخص الأخبار، بلغة بسيطة:
- يفتح الزائر صفحة تحتوي على
[ai_chatbot]. - يعرض الكود المختصر واجهة المستخدم (نافذة صغيرة) + يقوم بتحميل ملف جافا سكريبت.
- عندما يرسل المستخدم رسالة، يقوم جافا سكريبت بإرسال طلب POST إلى
admin-ajax.phpمع:- الرسالة
- رمز التحقق من ووردبريس (استعلام مضاد للتزوير)
- يستقبل ووردبريس الطلب عبر خطاف AJAX، ويتحقق من صحة قيمة nonce، ويطبق حدًا أقصى لعدد الطلبات، ثم يستدعي واجهة برمجة تطبيقات الذكاء الاصطناعي عبر
wp_remote_post(). - يقوم ووردبريس بتنظيف الاستجابة وتخزينها مؤقتًا، ثم يرسل JSON مرة أخرى إلى المتصفح.
- يعرض المتصفح الإجابة.
لماذا نستخدم تقنية AJAX في ووردبريس (بدلاً من استدعاء واجهة برمجة تطبيقات الذكاء الاصطناعي باستخدام جافا سكريبت)؟
لأن مفتاحك يجب أن يبقى على جانب الخادم. إذا قمت باستدعاء OpenAI مباشرةً من المتصفح، فسوف تكشف المفتاح... وتفقد السيطرة (تكلفة، إساءة استخدام، استخراج بيانات).
الكود الكامل - خطوة بخطوة
سنقوم ببناء إضافة mu التي:
- أضف رمزًا مختصرًا
[ai_chatbot] - يتم تضمين ملفات CSS/JS بشكل صحيح
- يقوم بإنشاء إجراء AJAX للمستخدمين المسجلين وغير المسجلين
- يستدعي واجهة برمجة تطبيقات OpenAI
- يخزن الإجابات مؤقتًا
الخطوة 1 - إنشاء المكون الإضافي mu
أنشئ المجلد wp-content/mu-plugins/ إذا لم يكن موجودًا، فأنشئ الملف:
wp-content/mu-plugins/bpcab-ai-chatbot.php
<?php
/**
* Plugin Name: BPCAB — Chatbot IA simple (sans plugin)
* Description: Ajoute un chatbot IA minimal via shortcode, avec appel serveur (wp_remote_post), cache transient, et sécurité de base.
* Author: Vous
* Version: 1.0.0
*/
if (!defined('ABSPATH')) {
exit;
}
define('BPCAB_CHATBOT_VERSION', '1.0.0');
/**
* Petit helper : récupère l'IP (approx) pour rate limiting.
* Attention : derrière un proxy/CDN, l'IP peut être celle du proxy si mal configuré.
*/
function bpcab_get_client_ip(): string {
$keys = array('HTTP_CF_CONNECTING_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR');
foreach ($keys as $key) {
if (!empty($_SERVER[$key])) {
$ip = sanitize_text_field(wp_unslash($_SERVER[$key]));
// X-Forwarded-For peut contenir plusieurs IP : on prend la première.
if (str_contains($ip, ',')) {
$parts = explode(',', $ip);
$ip = trim($parts[0]);
}
return $ip;
}
}
return '0.0.0.0';
}
الخطوة 2 - تحميل الكود المختصر + CSS/JS
Un رمز قصير هو وسم بين قوسين (على سبيل المثال) [ai_chatbot]) الذي يستبدله ووردبريس بـ HTML. وهذا مناسب مع Divi 5 و Elementor و Avada: فجميعها تعرف كيفية إدراج رمز مختصر (وحدة "Code"، أداة "Shortcode"، إلخ).
/**
* Enqueue des assets uniquement si le shortcode est présent sur la page.
*/
function bpcab_maybe_enqueue_assets(): void {
if (!is_singular()) {
return;
}
global $post;
if (!$post instanceof WP_Post) {
return;
}
if (!has_shortcode($post->post_content, 'ai_chatbot')) {
return;
}
$handle = 'bpcab-ai-chatbot';
wp_register_style(
$handle,
plugins_url('bpcab-ai-chatbot.css', __FILE__),
array(),
BPCAB_CHATBOT_VERSION
);
wp_register_script(
$handle,
plugins_url('bpcab-ai-chatbot.js', __FILE__),
array(),
BPCAB_CHATBOT_VERSION,
true
);
wp_enqueue_style($handle);
wp_enqueue_script($handle);
// Données côté JS (sans clé API !)
wp_localize_script($handle, 'BPCAB_CHATBOT', array(
'ajaxUrl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('bpcab_chatbot_nonce'),
'maxLen' => 400,
));
}
add_action('wp_enqueue_scripts', 'bpcab_maybe_enqueue_assets');
/**
* Shortcode [ai_chatbot]
*/
function bpcab_ai_chatbot_shortcode(): string {
// HTML volontairement simple, facile à styliser.
ob_start();
?>
<div class="bpcab-chatbot" data-bpcab-chatbot="1">
<div class="bpcab-chatbot__header">
<strong>Assistant</strong>
<span class="bpcab-chatbot__status" aria-live="polite">Prêt</span>
</div>
<div class="bpcab-chatbot__messages" role="log" aria-live="polite"></div>
<form class="bpcab-chatbot__form">
<input class="bpcab-chatbot__input" type="text" name="message" placeholder="Posez votre question…" autocomplete="off" />
<button class="bpcab-chatbot__send" type="submit">Envoyer</button>
</form>
<p class="bpcab-chatbot__hint">
<em>Réponse automatique. Ne partagez pas d’informations sensibles.</em>
</p>
</div>
<?php
return (string) ob_get_clean();
}
add_shortcode('ai_chatbot', 'bpcab_ai_chatbot_shortcode');
من الأخطاء الشائعة لصق هذا الكود في الملف الخاطئ (مقتطف من أداة البناء، أو إضافة مقتطفات تُنفذ متأخرًا جدًا). باستخدام إضافة mu، تتجنب العديد من المفاجآت.
الخطوة 3 - إنشاء ملفات CSS/JS
في نفس الملف mu-plugins، يخلق:
bpcab-ai-chatbot.cssbpcab-ai-chatbot.js
الحد الأدنى من CSS (يمكنك تعديله ليناسب القالب/أداة الإنشاء):
.bpcab-chatbot{
max-width: 520px;
border: 1px solid rgba(0,0,0,.12);
border-radius: 12px;
overflow: hidden;
background: #fff;
}
.bpcab-chatbot__header{
display:flex;
justify-content: space-between;
align-items:center;
padding: 12px 14px;
background: #111827;
color: #fff;
}
.bpcab-chatbot__messages{
padding: 12px 14px;
min-height: 220px;
max-height: 360px;
overflow:auto;
background: #f9fafb;
}
.bpcab-chatbot__msg{
margin: 0 0 10px 0;
padding: 10px 12px;
border-radius: 10px;
line-height: 1.35;
}
.bpcab-chatbot__msg--user{
background: #dbeafe;
}
.bpcab-chatbot__msg--bot{
background: #fff;
border: 1px solid rgba(0,0,0,.08);
}
.bpcab-chatbot__form{
display:flex;
gap: 8px;
padding: 12px 14px;
border-top: 1px solid rgba(0,0,0,.08);
background: #fff;
}
.bpcab-chatbot__input{
flex:1;
padding: 10px 12px;
border: 1px solid rgba(0,0,0,.18);
border-radius: 10px;
}
.bpcab-chatbot__send{
padding: 10px 14px;
border-radius: 10px;
border: 0;
background: #111827;
color: #fff;
cursor: pointer;
}
.bpcab-chatbot__hint{
padding: 0 14px 14px 14px;
margin: 0;
color: #6b7280;
font-size: 13px;
}
جافا سكريبت بسيطة : إرسال رسائل AJAX إلى ووردبريس، وعرض الرسائل، وإدارة الحالة.
(function () {
function qs(root, sel) { return root.querySelector(sel); }
function addMsg(messagesEl, text, who) {
var p = document.createElement('p');
p.className = 'bpcab-chatbot__msg bpcab-chatbot__msg--' + who;
p.textContent = text;
messagesEl.appendChild(p);
messagesEl.scrollTop = messagesEl.scrollHeight;
}
function setStatus(root, text) {
var s = qs(root, '.bpcab-chatbot__status');
if (s) s.textContent = text;
}
function initChatbot(root) {
var form = qs(root, '.bpcab-chatbot__form');
var input = qs(root, '.bpcab-chatbot__input');
var messages = qs(root, '.bpcab-chatbot__messages');
if (!form || !input || !messages) return;
addMsg(messages, "Bonjour ! Posez votre question, je vais essayer de vous orienter.", "bot");
form.addEventListener('submit', function (e) {
e.preventDefault();
var msg = (input.value || '').trim();
if (!msg) return;
if (msg.length > (window.BPCAB_CHATBOT?.maxLen || 400)) {
addMsg(messages, "Message trop long. Essayez de faire plus court.", "bot");
return;
}
addMsg(messages, msg, "user");
input.value = '';
setStatus(root, 'Réflexion…');
var data = new FormData();
data.append('action', 'bpcab_chatbot_ask');
data.append('nonce', window.BPCAB_CHATBOT?.nonce || '');
data.append('message', msg);
fetch(window.BPCAB_CHATBOT?.ajaxUrl || '', {
method: 'POST',
credentials: 'same-origin',
body: data
})
.then(function (r) { return r.json(); })
.then(function (payload) {
if (!payload || !payload.success) {
var err = payload?.data?.message || "Erreur côté serveur.";
addMsg(messages, err, "bot");
setStatus(root, 'Erreur');
return;
}
addMsg(messages, payload.data.answer, "bot");
setStatus(root, 'Prêt');
})
.catch(function () {
addMsg(messages, "Impossible de contacter le serveur. Réessayez.", "bot");
setStatus(root, 'Hors ligne');
});
});
}
document.addEventListener('DOMContentLoaded', function () {
document.querySelectorAll('[data-bpcab-chatbot="1"]').forEach(initChatbot);
});
})();
خطأ شائع: "لا يتم تحميل جافا سكريبت". في 90% من الحالات، يكون هذا هو المسار الخاطئ. plugins_url()أو ذاكرة تخزين مؤقتة (إضافة/شبكة توصيل محتوى) تُقدّم إصدارًا قديمًا. غيّر الإصدار. BPCAB_CHATBOT_VERSION لفرض إعادة التحميل، أو مسح ذاكرة التخزين المؤقت.
الخطوة 4 — نقطة نهاية AJAX + nonce + حد المعدل
Un صنارة صيد ووردبريس هي نقطة انطلاق. وهناك نوعان:
- عمل : "افعل شيئًا هنا" (على سبيل المثال)
wp_enqueue_scripts). - مرشحات : "قم بتعديل هذه القيمة" (على سبيل المثال)
the_content).
هنا، نستخدم إجراءات AJAX: wp_ajax_* (متصل) و wp_ajax_nopriv_* (غير متصل).
/**
* Rate limit très simple : X requêtes par minute par IP.
* Ce n'est pas une protection parfaite, mais ça évite les abus basiques.
*/
function bpcab_rate_limit_or_die(string $ip, int $limit = 10, int $window_seconds = 60): void {
$key = 'bpcab_rl_' . md5($ip);
$hits = (int) get_transient($key);
if ($hits >= $limit) {
wp_send_json_error(array(
'message' => 'Trop de requêtes. Attendez une minute et réessayez.'
), 429);
}
set_transient($key, $hits + 1, $window_seconds);
}
/**
* Handler AJAX : reçoit la question et renvoie une réponse IA.
*/
function bpcab_ajax_chatbot_ask(): void {
// Vérification nonce (anti-CSRF)
$nonce = isset($_POST['nonce']) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : '';
if (!wp_verify_nonce($nonce, 'bpcab_chatbot_nonce')) {
wp_send_json_error(array('message' => 'Requête refusée (nonce invalide).'), 403);
}
$ip = bpcab_get_client_ip();
bpcab_rate_limit_or_die($ip, 10, 60);
$message = isset($_POST['message']) ? (string) wp_unslash($_POST['message']) : '';
$message = trim($message);
if ($message === '') {
wp_send_json_error(array('message' => 'Message vide.'), 400);
}
if (mb_strlen($message) > 400) {
wp_send_json_error(array('message' => 'Message trop long (max 400 caractères).'), 400);
}
$answer = bpcab_get_ai_answer($message);
if (is_wp_error($answer)) {
wp_send_json_error(array(
'message' => $answer->get_error_message()
), 500);
}
wp_send_json_success(array(
'answer' => $answer,
));
}
add_action('wp_ajax_bpcab_chatbot_ask', 'bpcab_ajax_chatbot_ask');
add_action('wp_ajax_nopriv_bpcab_chatbot_ask', 'bpcab_ajax_chatbot_ask');
الخطوة 5 - استدعاء OpenAI عبر wp_remote_post() + ذاكرة التخزين المؤقت
سوف نقوم بما يلي:
- قم بإنشاء مفتاح تخزين مؤقت بناءً على السؤال (التجزئة).
- قم بتعيين مدة صلاحية (على سبيل المثال، 24 ساعة) لتجنب دفع ثمن نفس الإجابة مرة أخرى.
- أضف مهلة قصيرة (على سبيل المثال، 20 ثانية) لمنع PHP من "التوقف".
- قم بتنظيف الاستجابة (يُسمح بمجموعة فرعية محدودة جدًا من HTML).
/**
* Appelle l'API IA (OpenAI) et renvoie une réponse texte.
* IMPORTANT : la clé API doit être définie dans wp-config.php via BPCAB_OPENAI_API_KEY
*/
function bpcab_get_ai_answer(string $user_message) {
if (!defined('BPCAB_OPENAI_API_KEY') || BPCAB_OPENAI_API_KEY === '') {
return new WP_Error('bpcab_missing_key', 'Clé API manquante. Ajoutez BPCAB_OPENAI_API_KEY dans wp-config.php.');
}
// Cache : même question => même réponse pendant 24h
$cache_key = 'bpcab_ai_' . md5(mb_strtolower(trim($user_message)));
$cached = get_transient($cache_key);
if (is_string($cached) && $cached !== '') {
return $cached;
}
/**
* Prompt système : court, orienté "site".
* Ici, on ne fait PAS encore de RAG (recherche dans vos contenus).
* On limite la responsabilité : pas de conseils médicaux/juridiques.
*/
$system = "Vous êtes un assistant pour un site WordPress. Répondez en français, de façon courte et pratique. "
. "Si la question demande des infos sensibles (santé/juridique/finance), refusez et conseillez de contacter le propriétaire du site. "
. "Si vous ne savez pas, dites-le et proposez une piste (ex: consulter la page FAQ).";
/**
* API OpenAI (Chat Completions style Responses API selon évolution).
* En avril 2026, l'API a évolué plusieurs fois. Le principe reste :
* - endpoint HTTPS
* - JSON en entrée
* - JSON en sortie
*
* Si votre compte OpenAI recommande un endpoint différent, adaptez l'URL et le parsing.
* Référez-vous à la doc officielle.
*/
$endpoint = 'https://api.openai.com/v1/chat/completions';
$body = array(
'model' => 'gpt-4.1-mini',
'temperature' => 0.2,
'messages' => array(
array('role' => 'system', 'content' => $system),
array('role' => 'user', 'content' => $user_message),
),
);
$args = array(
'headers' => array(
'Authorization' => 'Bearer ' . BPCAB_OPENAI_API_KEY,
'Content-Type' => 'application/json',
),
'timeout' => 20,
'body' => wp_json_encode($body),
);
$response = wp_remote_post($endpoint, $args);
if (is_wp_error($response)) {
return new WP_Error('bpcab_http_error', 'Erreur HTTP : ' . $response->get_error_message());
}
$code = (int) wp_remote_retrieve_response_code($response);
$raw = (string) wp_remote_retrieve_body($response);
if ($code < 200 || $code >= 300) {
// On évite d'afficher tout le raw (peut contenir des détails techniques).
return new WP_Error('bpcab_api_error', 'API IA indisponible (code ' . $code . '). Vérifiez votre clé/quota.');
}
$data = json_decode($raw, true);
if (!is_array($data)) {
return new WP_Error('bpcab_json_error', 'Réponse API illisible (JSON invalide).');
}
// Parsing "chat.completions"
$text = $data['choices'][0]['message']['content'] ?? '';
$text = is_string($text) ? trim($text) : '';
if ($text === '') {
return new WP_Error('bpcab_empty_answer', 'Réponse vide de l’API IA.');
}
/**
* Assainissement :
* - on autorise un peu de HTML basique (liens, strong, em, br)
* - on supprime le reste
*/
$allowed = array(
'a' => array(
'href' => true,
'target' => true,
'rel' => true,
),
'strong' => array(),
'em' => array(),
'br' => array(),
);
$safe = wp_kses($text, $allowed);
// Cache 24h
set_transient($cache_key, $safe, DAY_IN_SECONDS);
return $safe;
}
خطأان ألاحظهما كثيراً:
- نسيان الفاصلة المنقوطة في
wp-config.phpأو في إضافة mu: النتيجة، شاشة بيضاء (خطأ فادح). تفعيلWP_DEBUGفي مرحلة الإعداد، وليس في مرحلة الإنتاج. - انسخ درسًا تعليميًا قديمًا والتي تستخدم بنية API قديمة أو نموذجًا عفا عليه الزمن. هنا، لديك قاعدة بيانات WordPress 6.9.4 + PHP 8.1، ولا تقوم بتعديل نقطة النهاية إلا إذا غيّرت OpenAI توصياتها.
الكود المجمع بالكامل
الملف الكامل موجود أدناه مو البرنامج المساعدستحتاج أيضًا إلى إنشاء ملفات CSS/JS (الموضحة أعلاه). لا تضع المفتاح في هذا الملف.
<?php
/**
* Plugin Name: BPCAB — Chatbot IA simple (sans plugin)
* Description: Chatbot IA minimal via shortcode, AJAX WordPress, appel OpenAI avec wp_remote_post(), cache transient, sécurité de base.
* Author: Vous
* Version: 1.0.0
*/
if (!defined('ABSPATH')) {
exit;
}
define('BPCAB_CHATBOT_VERSION', '1.0.0');
function bpcab_get_client_ip(): string {
$keys = array('HTTP_CF_CONNECTING_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR');
foreach ($keys as $key) {
if (!empty($_SERVER[$key])) {
$ip = sanitize_text_field(wp_unslash($_SERVER[$key]));
if (str_contains($ip, ',')) {
$parts = explode(',', $ip);
$ip = trim($parts[0]);
}
return $ip;
}
}
return '0.0.0.0';
}
function bpcab_maybe_enqueue_assets(): void {
if (!is_singular()) {
return;
}
global $post;
if (!$post instanceof WP_Post) {
return;
}
if (!has_shortcode($post->post_content, 'ai_chatbot')) {
return;
}
$handle = 'bpcab-ai-chatbot';
wp_register_style(
$handle,
plugins_url('bpcab-ai-chatbot.css', __FILE__),
array(),
BPCAB_CHATBOT_VERSION
);
wp_register_script(
$handle,
plugins_url('bpcab-ai-chatbot.js', __FILE__),
array(),
BPCAB_CHATBOT_VERSION,
true
);
wp_enqueue_style($handle);
wp_enqueue_script($handle);
wp_localize_script($handle, 'BPCAB_CHATBOT', array(
'ajaxUrl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('bpcab_chatbot_nonce'),
'maxLen' => 400,
));
}
add_action('wp_enqueue_scripts', 'bpcab_maybe_enqueue_assets');
function bpcab_ai_chatbot_shortcode(): string {
ob_start();
?>
<div class="bpcab-chatbot" data-bpcab-chatbot="1">
<div class="bpcab-chatbot__header">
<strong>Assistant</strong>
<span class="bpcab-chatbot__status" aria-live="polite">Prêt</span>
</div>
<div class="bpcab-chatbot__messages" role="log" aria-live="polite"></div>
<form class="bpcab-chatbot__form">
<input class="bpcab-chatbot__input" type="text" name="message" placeholder="Posez votre question…" autocomplete="off" />
<button class="bpcab-chatbot__send" type="submit">Envoyer</button>
</form>
<p class="bpcab-chatbot__hint">
<em>Réponse automatique. Ne partagez pas d’informations sensibles.</em>
</p>
</div>
<?php
return (string) ob_get_clean();
}
add_shortcode('ai_chatbot', 'bpcab_ai_chatbot_shortcode');
function bpcab_rate_limit_or_die(string $ip, int $limit = 10, int $window_seconds = 60): void {
$key = 'bpcab_rl_' . md5($ip);
$hits = (int) get_transient($key);
if ($hits >= $limit) {
wp_send_json_error(array(
'message' => 'Trop de requêtes. Attendez une minute et réessayez.'
), 429);
}
set_transient($key, $hits + 1, $window_seconds);
}
function bpcab_get_ai_answer(string $user_message) {
if (!defined('BPCAB_OPENAI_API_KEY') || BPCAB_OPENAI_API_KEY === '') {
return new WP_Error('bpcab_missing_key', 'Clé API manquante. Ajoutez BPCAB_OPENAI_API_KEY dans wp-config.php.');
}
$cache_key = 'bpcab_ai_' . md5(mb_strtolower(trim($user_message)));
$cached = get_transient($cache_key);
if (is_string($cached) && $cached !== '') {
return $cached;
}
$system = "Vous êtes un assistant pour un site WordPress. Répondez en français, de façon courte et pratique. "
. "Si la question demande des infos sensibles (santé/juridique/finance), refusez et conseillez de contacter le propriétaire du site. "
. "Si vous ne savez pas, dites-le et proposez une piste (ex: consulter la page FAQ).";
$endpoint = 'https://api.openai.com/v1/chat/completions';
$body = array(
'model' => 'gpt-4.1-mini',
'temperature' => 0.2,
'messages' => array(
array('role' => 'system', 'content' => $system),
array('role' => 'user', 'content' => $user_message),
),
);
$args = array(
'headers' => array(
'Authorization' => 'Bearer ' . BPCAB_OPENAI_API_KEY,
'Content-Type' => 'application/json',
),
'timeout' => 20,
'body' => wp_json_encode($body),
);
$response = wp_remote_post($endpoint, $args);
if (is_wp_error($response)) {
return new WP_Error('bpcab_http_error', 'Erreur HTTP : ' . $response->get_error_message());
}
$code = (int) wp_remote_retrieve_response_code($response);
$raw = (string) wp_remote_retrieve_body($response);
if ($code < 200 || $code >= 300) {
return new WP_Error('bpcab_api_error', 'API IA indisponible (code ' . $code . '). Vérifiez votre clé/quota.');
}
$data = json_decode($raw, true);
if (!is_array($data)) {
return new WP_Error('bpcab_json_error', 'Réponse API illisible (JSON invalide).');
}
$text = $data['choices'][0]['message']['content'] ?? '';
$text = is_string($text) ? trim($text) : '';
if ($text === '') {
return new WP_Error('bpcab_empty_answer', 'Réponse vide de l’API IA.');
}
$allowed = array(
'a' => array('href' => true, 'target' => true, 'rel' => true),
'strong' => array(),
'em' => array(),
'br' => array(),
);
$safe = wp_kses($text, $allowed);
set_transient($cache_key, $safe, DAY_IN_SECONDS);
return $safe;
}
function bpcab_ajax_chatbot_ask(): void {
$nonce = isset($_POST['nonce']) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : '';
if (!wp_verify_nonce($nonce, 'bpcab_chatbot_nonce')) {
wp_send_json_error(array('message' => 'Requête refusée (nonce invalide).'), 403);
}
$ip = bpcab_get_client_ip();
bpcab_rate_limit_or_die($ip, 10, 60);
$message = isset($_POST['message']) ? (string) wp_unslash($_POST['message']) : '';
$message = trim($message);
if ($message === '') {
wp_send_json_error(array('message' => 'Message vide.'), 400);
}
if (mb_strlen($message) > 400) {
wp_send_json_error(array('message' => 'Message trop long (max 400 caractères).'), 400);
}
$answer = bpcab_get_ai_answer($message);
if (is_wp_error($answer)) {
wp_send_json_error(array(
'message' => $answer->get_error_message()
), 500);
}
wp_send_json_success(array('answer' => $answer));
}
add_action('wp_ajax_bpcab_chatbot_ask', 'bpcab_ajax_chatbot_ask');
add_action('wp_ajax_nopriv_bpcab_chatbot_ask', 'bpcab_ajax_chatbot_ask');
شرح الكود
لماذا إضافة mu؟
يتم تحميل إضافة mu تلقائيًا، دون تفعيل، وهي أقل عرضة للمشاكل من مجرد إضافة جزء من التعليمات البرمجية إلى قالب. حسب تجربتي، عندما يقوم مبتدئ بوضع التعليمات البرمجية في functions.php ثم يقوم بتغيير المظهر (أو تحديث المظهر الرئيسي)، فيختفي برنامج الدردشة الآلي.
Pourquoi wp_localize_script()
نستخدمه هنا للتحويل إلى جافا سكريبت:
- عنوان URL الخاص بتقنية AJAX (
admin-ajax.php) - سفارة
- حد أقصى للطول
هذا يتجنب "تضمين" عنوان URL بشكل ثابت، ويعمل حتى إذا تم تثبيت WordPress في مجلد فرعي.
دكتور: wp_localize_script ().
نونس: ما يحميه فعلياً
يمنع رمز التحقق (nonce) في ووردبريس المواقع الأخرى من إرسال طلبات نيابةً عنك عبر متصفح زوارك (هجوم CSRF). وهو لا يغني عن نظام المصادقة، ولكنه يُعدّ شرطًا أساسيًا لروبوتات الدردشة العامة.
دكتور: ووردبريس نونسيس.
بيانات ذاكرة التخزين المؤقت: لماذا هي ضرورية
ال العابرون هذه عبارة عن ذاكرة تخزين مؤقتة تعتمد على مفتاح/قيمة مع تاريخ انتهاء صلاحية. إذا سأل زائر "ما هي ساعات عملكم؟" 200 مرة في الشهر، فلن ترغب في دفع تكلفة 200 استدعاء للذكاء الاصطناعي. ستدفع تكلفة استدعاء واحد فقط، ثم تُقدّم الإجابة من ذاكرة التخزين المؤقتة.
دكتور: بيانات واجهة برمجة التطبيقات العابرة.
تنظيف الاستجابة
قد تُعيد واجهة برمجة تطبيقات الذكاء الاصطناعي نصًا غير متوقع (أو حتى HTML). إذا قمتَ بحقن هذا النص مباشرةً في DOM، فإنك تُعرّض النظام لثغرات XSS. إليك التفاصيل:
- نحن لا نسمح إلا
a,strong,em,br - تم حذف كل شيء آخر
الوظيفة المستخدمة: wp_kses()دكتور: wp_kses().
تكاليف واجهة برمجة التطبيقات وتحسينها
تختلف الأسعار الدقيقة باختلاف الطراز والعقد. إليك أهم ما يجب مراعاته عند تقدير التكلفة:
- عدد الرسائل شهرياً
- متوسط طول الأسئلة والأجوبة (الرموز)
- معدل نجاح الوصول إلى ذاكرة التخزين المؤقت (عدد الأسئلة المتطابقة التي تتكرر)
تقدير "في الموقع" (من حيث الحجم)
في روبوت محادثة بسيط "للتوجيه"، ألاحظ غالبًا ما يلي:
- السؤال: من 20 إلى 60 رمزًا
- الإجابة: من 60 إلى 200 رمزًا
- المجموع: من 100 إلى 300 رمز لكل تفاعل
إذا كان لديك 2000 تفاعل شهريًا، فهذا يعني ما بين 200,000 و600,000 رمز مميز شهريًا. اعتمادًا على النموذج، قد يكون هذا معقولًا... أو لا. يُحدث التخزين المؤقت ونموذج "النموذج المصغر" فرقًا كبيرًا.
تحسينات فورية
- ذاكرة تخزين مؤقتة لمدة 24 ساعة (موجود بالفعل). للحصول على أسئلة وأجوبة مستقرة، يمكنك زيادة الفاصل الزمني إلى 7 أيام.
- إجابات أقصر أضف إلى السؤال "أجب في 5 جمل كحد أقصى".
- درجة حرارة منخفضة : عدد أقل من الاختلافات، وعدد أكبر من عمليات الوصول إلى ذاكرة التخزين المؤقت.
- حدد الطول الرسائل موجودة بالفعل على جانبي جافا سكريبت وبي إتش بي. دائماً ما يكون هناك حاجز مزدوج.
المتغيرات المتقدمة وحالات الاستخدام
الخيار 1 - إضافة "سياق الموقع" (بدون RAG)
دون الحاجة إلى البحث في مقالاتك، يمكنك تقديم نبذة تعريفية موجزة (مثل ساعات العمل، أو رابط صفحة الأسئلة الشائعة). وهذا مفيد لموقعك الإلكتروني الذي يعرض خدماتك.
// Exemple : ajoutez ceci avant $body dans bpcab_get_ai_answer()
$site_context = "Contexte du site :n"
. "- FAQ : https://example.com/faq/n"
. "- Contact : https://example.com/contact/n"
. "- Horaires : lun-ven 9h-18hn";
$body['messages'] = array(
array('role' => 'system', 'content' => $system . "nn" . $site_context),
array('role' => 'user', 'content' => $user_message),
);
الخيار الثاني - وضع "ملخص المقال" عبر سمة رمز مختصر
يمكنك السماح [ai_chatbot mode="resume"] وأرسل مقتطف الصفحة الحالية إلى الذكاء الاصطناعي. ملاحظة: كلما زاد عدد الرموز، زادت التكلفة.
// Exemple (incomplet) : détecter un attribut et injecter le contenu
function bpcab_ai_chatbot_shortcode($atts = array()): string {
$atts = shortcode_atts(array('mode' => 'chat'), $atts, 'ai_chatbot');
// ... même HTML qu'avant, mais vous pourriez ajouter data-mode
// <div data-mode="chat"> etc.
// Ce snippet est volontairement partiel : il faut adapter le JS pour envoyer le mode.
return '...';
}
دعني أوضح: هذا المقتطف غير مكتمل. لكي يعمل، يجب تعديل كود جافا سكريبت أيضًا (إرسال). mode) ومعالج AJAX (تغيير الرسالة وفقًا للوضع).
البديل 3 - تكامل Divi 5 / Elementor / Avada
- ديفي 5 أضف وحدة "كود" أو "رمز مختصر" والصقها
[ai_chatbot]إذا قام Divi بتصغير/دمج الملفات، فقم بمسح ذاكرة التخزين المؤقت الثابتة الخاصة به إذا لم يتم تحديث CSS/JS. - Elementor أداة "الرمز المختصر" →
[ai_chatbot]إذا كنت تستخدم ميزة تحسين الأصول في Elementor، فتأكد من عدم تأجيل تنفيذ البرنامج النصي بشكل مفرط (وإلا...).DOMContentLoadedيمكن أن يحدث ذلك قبل الحقن: في هذه الحالة، قم أيضًا بالتهيئة علىelementor/frontend/init). - فتح عنصر "Shortcode" في Fusion Builder. إذا كنت تستخدم التخزين المؤقت لـ Avada، فقم بمسحه بعد إضافة ملفات CSS/JS.
السلامة وأفضل الممارسات
لا تكشف مفتاح API من جانب العميل
قاعدة بسيطة: يبقى المفتاح في مكانه wp-config.phpلا ينبغي للمتصفح أن يراه أبدًا. حتى لو كان "مخفيًا" في حزمة جافا سكريبت، فإنه لا يزال قابلاً للاسترداد.
التحقق من صحة الإدخالات وتقييدها
- الحد الأقصى للطول من جانب جافا سكريبت (تجربة المستخدم) + من جانب PHP (الأمان).
- رفض الرسائل الفارغة.
- تحديد معدل الطلبات حسب عنوان IP (مُفعّل بالفعل). وللحصول على مزيد من الخيارات، يمكنك أيضاً تحديد المعدل حسب الجلسة/ملف تعريف الارتباط.
تنظيف المخارج
اعرض الاستجابة كنص (كما هو الحال في جافا سكريبت مع textContentأو تنظيفها بشكل مكثف إذا كنت تسمح باستخدام HTML. هنا، نقوم بالأمرين معًا: ننظفها من جانب الخادم ونعرضها كنص من جانب العميل. هذا إجراء احترازي متعمد.
اللائحة العامة لحماية البيانات: البيانات المرسلة إلى طرف ثالث
إذا أدخل الزائر بيانات شخصية، فقد ترسلها إلى مزود خدمة (OpenAI). لذا، خطط وفقًا لذلك.
- رسالة واضحة ("لا تشارك المعلومات الحساسة.")
- ذكر ذلك في سياسة الخصوصية الخاصة بك
- إعدادات المورد (الاحتفاظ، إلغاء الاشتراك، إلخ) وفقًا لعقدك
لا تقم بالاختبار في بيئة الإنتاج بدون نسخة احتياطية.
يؤدي وجود خطأ في PHP في إضافة mu إلى تعطيل الموقع بالكامل (لأنها تُحمّل تلقائيًا). لذا، يُنصح بالعمل على نسخة تجريبية أولًا. في حال الحاجة للعمل على بيئة الإنتاج، احتفظ بإمكانية الوصول عبر FTP/SSH لحذف الملف في حال ظهور شاشة بيضاء.
كيفية الاختبار والتصحيح
قم بتمكين السجلات بشكل صحيح
في بيئة الاختبار، قم بتمكين ما يلي:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
دكتور: تصحيح الأخطاء في ووردبريس.
تحقق من طلب AJAX
- افتح أدوات مطوري المتصفح ← علامة تبويب الشبكة ← ثم قم بتصفية النتائج
admin-ajax.php. - تحقق من حالة HTTP (200/403/429/500) واستجابة JSON.
- إذا رأيت صفحة HTML بدلاً من JSON، فغالبًا ما يكون ذلك خطأً فادحًا في PHP (أو مكونًا إضافيًا أمنيًا يقوم بالاعتراض).
اختبار واجهة برمجة تطبيقات الذكاء الاصطناعي "في تجربة أولية"
قبل دمج جافا سكريبت، يمكنك الاتصال bpcab_get_ai_answer() في سياق إداري (مؤقتًا) وسجّل الاستجابة. لا تترك هذا الكود في مكانه.
إذا لم ينجح الأمر
| عرض | السبب المحتمل | التحقق | الحلول |
|---|---|---|---|
| لا يظهر أي شيء على الصفحة | الرمز المختصر مفقود أو غير مُفسَّر | تأكد من أن الصفحة تحتوي على [ai_chatbot] (ليس في كتلة "كود" تتجاوز الأقواس) |
استخدم كتلة "الرمز المختصر" (Elementor) / وحدة الرمز المختصر (Divi/Avada) |
| تظهر نافذة الدردشة لكن الزر لا يستجيب | لم يتم تحميل جافا سكريبت (ذاكرة التخزين المؤقت، المسار، تعارض) | أدوات المطورين ← وحدة التحكم (الأخطاء) + الشبكة (ملف جافا سكريبت 404؟) | الاختيار plugins_url()مسح ذاكرة التخزين المؤقت، زيادة BPCAB_CHATBOT_VERSION |
| الرد: "لا يوجد شيء غير صالح" | قيمة nonce منتهية الصلاحية، أو ذاكرة تخزين مؤقتة للصفحة مُفرطة، أو أن جافا سكريبت تتلقى قيمة nonce قديمة | انظر إلى القيمة BPCAB_CHATBOT.nonce في وحدة التحكم |
قم بتقليل حجم ذاكرة التخزين المؤقت للصفحات التي تحتوي على دردشة، أو أعد إنشاء رمز التحقق عند التحميل (نهج أكثر تقدماً). |
| خطأ 429 "عدد كبير جدًا من الطلبات" | حدود معدل صارمة للغاية أو اختبارات متكررة | يمكن إعادة إنتاج المشكلة في وضع التصفح الخاص / باستخدام عنوان IP مختلف | قم بزيادة نطاق/حد الوصول، أو قصر الوصول على المستخدمين المسجلين. |
| خطأ "واجهة برمجة تطبيقات الذكاء الاصطناعي غير متاحة (الرمز 401/403)" | مفتاح غير صالح، لم يتم تحميل المفتاح، الأذونات | الاختيار BPCAB_OPENAI_API_KEY في wp-config.php (بدون مسافات) |
أعد إنشاء المفتاح، وتحقق من الفواتير/الحصة من جانب المورد. |
| خطأ "بيانات JSON غير صالحة" | استجابة واجهة برمجة التطبيقات المقتطعة (الوكيل، جدار حماية تطبيقات الويب)، أو نقطة النهاية المتغيرة | تسجيل الدخول $raw في مرحلة الإعداد (لاحظ البيانات) |
اضبط نقطة النهاية/التنسيق وفقًا للوثائق الرسمية، وقم بزيادة مهلة الانتظار إذا لزم الأمر. |
| شاشة بيضاء بعد إضافة المكون الإضافي mu | خطأ في PHP (أقواس، فاصلة منقوطة)، إصدار PHP قديم جدًا | تشاور wp-content/debug.log أو سجلات الخادم |
صحّح بناء الجملة، وتأكد من استخدام PHP 8.1 أو أحدث، واحذف الملف عبر بروتوكول نقل الملفات (FTP) إذا لزم الأمر. |
مشاكل واقعية وحلول سريعة
- تم لصق الكود في المكان الخطأ إذا وضعته في قسم "الرمز المخصص" في أداة الإنشاء، فقد يتم تصفيته/معالجته. استخدم إضافة mu-plugin بدلاً من ذلك.
- خطاف غير لائق إذا قمت بالاستعلام عن جافا سكريبت على
initقد تُخاطر بتحميله مبكرًا جدًا/بشكل غير صحيح. هنا نستخدمwp_enqueue_scripts. - تعارض في ذاكرة التخزين المؤقت بعض ذاكرات التخزين المؤقت تخزن كود HTML الذي يحتوي على قيمة nonce. والنتيجة: قيمة nonce قديمة للجميع. الحل: استبعاد الصفحة من ذاكرة التخزين المؤقت، أو إنشاء مسار يُعيد قيمة nonce "حديثة" (حل متقدم).
- روابط ثابتة ليس الأمر ذا صلة مباشرة، لكنني رأيت مواقع حيث
admin_url()يتم تصفية هذا الطلب بواسطة إضافة أمان غير مُهيأة بشكل صحيح. إذا لم يستجب AJAX، فاختبر عنوان URL./wp-admin/admin-ajax.phpمباشرة في المتصفح.
الموارد
- واجهة برمجة تطبيقات HTTP الخاصة بـ WordPress (wp_remote_post)
- واجهة برمجة تطبيقات البيانات المؤقتة (ذاكرة التخزين المؤقت)
- الأرقام العشوائية (الأمان)
- wp_kses() (التنظيف)
- تصحيح أخطاء ووردبريس (WP_DEBUG)
- وثائق واجهة برمجة تطبيقات OpenAI
- PHP mbstring (mb_strlen)
- مستودع ووردبريس الرسمي (wordpress-develop)
الأسئلة الشائعة
هل يُعتبر الأمر "خالياً من الإضافات" حقاً إذا أضفت إضافة mu-plugin؟
أنت لا تقوم بتثبيت إضافة خارجية من موقع wordpress.org، ولكنك تقنياً تضيف كوداً على شكل إضافة. هذا مقصود: إنها الطريقة الأمثل للحفاظ على استقلالية الكود عن القالب.
هل يمكنني وضع الكود في functions.php ?
نعم، لكنني لا أنصح بذلك. فأنت تخاطر بفقدان برنامج الدردشة الآلي عند تغيير المظهر، وقد يُعقّد مُنشئ المظهر عملية تصحيح الأخطاء. إذا كنت مُصرّاً على ذلك، فاستخدم مظهراً فرعياً.
لماذا استخدام admin-ajax.php بدلاً من واجهة برمجة تطبيقات REST؟
كلاهما يعمل. بالنسبة للمبتدئين، يُعدّ إعداد ووردبريس بتقنية AJAX سريعًا. إذا كنت ترغب في أسلوب أكثر حداثة، فانتقل إلى مسار REST. register_rest_route() وأذونات الاستدعاء. النواة (استدعاء wp_remote_post()(ذاكرة التخزين المؤقت، والأمان) تبقى كما هي.
يتعطل رمز التحقق (nonce) مع إضافة التخزين المؤقت الخاصة بي: ماذا أفعل؟
يمكنك استبعاد الصفحة من ذاكرة التخزين المؤقت (حل بسيط)، أو إنشاء نقطة نهاية تُعيد قيمة عشوائية (nonce) عند الطلب، ثم تحديث جافا سكريبت لاسترجاعها. في المواقع التي تعتمد بشكل كبير على ذاكرة التخزين المؤقت (شبكة توصيل محتوى قوية)، يُعد هذا أسلوبًا تقليديًا.
كيف يمكنني حصر عمل برنامج الدردشة الآلي في صفحات معينة؟
يمنحك الكود المختصر هذه الميزة بالفعل: ما عليك سوى إضافته حيثما تحتاج إليه. ولا يستعلم الكود عن ملفات جافا سكريبت/سي إس إس إلا إذا كان الكود المختصر موجودًا.
كيف يمكننا منع الذكاء الاصطناعي من التلفظ بالهراء؟
لا يمكنك ضمان ذلك بنسبة 100%. قلل المخاطرة:
- إجابات قصيرة
- درجة حرارة منخفضة
- الرسالة واضحة: "إذا كنت لا تعرف، فقل ذلك".
- إعادة التوجيه إلى صفحة الأسئلة الشائعة/معلومات الاتصال
هل يمكنني عرض روابط قابلة للنقر في الرد؟
نعم، ولكن افعل ذلك بحذر. في هذا الدرس التعليمي، سنقوم بالتنظيف باستخدام wp_kses() بالترخيص aمن جانب جافا سكريبت، نعرض باستخدام textContent (لذا لا حاجة إلى HTML). إذا كنت تريد روابط قابلة للنقر، فأنت بحاجة إلى عرضها باستخدام HTML (innerHTML) واتباع مزيد من الحذر (التعقيم الصارم، والإضافة التلقائية لـ rel="noopener nofollow").
هل هو متوافق مع Divi 5 / Elementor / Avada؟
نعم: استخدم وحدة/أداة "الرمز المختصر" والصقها [ai_chatbot]الكود مستقل عن القالب. المشاكل الوحيدة التي قد تظهر عادةً هي تلك المتعلقة بالتخزين المؤقت/التصغير: حذف الملفات بعد إضافتها.
لماذا تحددها بـ 400 حرف؟
لتجنب المطالبات الضخمة، وتقليل التكاليف، والحد من إساءة الاستخدام، يمكنك زيادة عدد المطالبات، ولكن افعل ذلك مع إدراك كامل للعواقب (الرموز المميزة، زمن الاستجابة، الفوترة).
كيفية تغيير نموذج الذكاء الاصطناعي؟
غيّر القيمة model في $bodyاحتفظ بنموذج "مصغر" لروبوت الدردشة الإرشادي. إذا قمت بتوسيع نطاقه، فراقب التكاليف وزمن الاستجابة.
أتلقى رسالة الخطأ التالية: "خطأ HTTP: خطأ cURL 28"
انتهى الوقت. تحقق من:
- يُسمح بالوصول إلى الشبكة من خادم الاستضافة (جدار الحماية).
- DNS
- زيادة
timeout(مثلاً، 30) إذا كان خادمك بطيئًا
إذا كنت تستخدم خطة استضافة مشتركة مغلقة، فهذا أمر شائع.