Agar siz qachondir "Saytingizdagi ma'lumotni topa olmadim, menga yordam bera olasizmi?" kabi elektron pochta xabarini olgan bo'lsangiz, sizda AI mini-chatidan foydalanish uchun yaxshi holat allaqachon mavjud. Bu yerdagi maqsad qo'llab-quvvatlash guruhingizni "almashtirish" emas, balki veb-saytingiz tarkibiga asoslangan foydali dastlabki javob berishdir. Sans o'rnatish ulash.
Ehtiyoj / Foydalanish holati
"Oddiy" AI chatbot yoqilgan WordPress Uning asosiy maqsadi takroriy savollarni o'zlashtirishdir: ish vaqti, pulni qaytarish siyosati, "falonchi buyumni qaerdan topish mumkin", xulosalar uzoq qo'llanma yoki navigatsiya yordami ("Men doimiy havolalar bo'yicha qo'llanma qidiryapman"). Blogda men tez-tez kiruvchi so'rovlarning 80% 10 ta savolga qisqartirilishini ko'rganman.
Bu yerda sun'iy intellekt nimani taqdim etadi: minimalist chat interfeysi + savolni AI API ga (masalan, OpenAI) yuboradigan va foydalanishga yaroqli javobni qaytaradigan xavfsiz WordPress AJAX yo'nalishi. Biz ataylab hamma narsani soddalashtirmoqdamiz: uchinchi tomon vidjetlari, SDK, Composer bog'liqliklari yo'q.
Oxir-oqibat, siz quyidagilarni bilib olasiz:
- WordPress qisqa kodi orqali kichik mushukni (HTML/CSS/JS) ko'rsatish.
- Savolni WordPress serveringizga (AJAX) nonce (anti-CSRF token) yordamida yuboring.
- AI API ni chaqirish
wp_remote_post(), xatolar/vaqtinchalik vaqt tugashlarini boshqarish va Transients yordamida kesh javoblarini qayta ishlash. - API kalitingizni himoya qiling (saqlangan)
wp-config.php) va uni brauzerga oshkor qilishdan saqlaning.
Tez xulosa
- Siz API doimiysini qo'shasiz
wp-config.php(hech qachon mavzu bo'yicha emas). - Siz yaratasiz mu-plagin ("mustah-use" plagini) qisqa kodni taqdim etadi
[ai_chatbot]. - Old (JS) qo'ng'iroqlar
admin-ajax.phpto'g'ridan-to'g'ri AI API bilan emas, balki nonce bilan. - Server API ni quyidagi orqali chaqiradi
wp_remote_post(), qisqa vaqt tugashi, xatolarni toza boshqarish. - Xarajatlarni kamaytirish uchun javoblar keshi (o'tish davri).
- Ko'rsatishdan oldin javob tozalandi (
wp_kses()) XSS xavflarini cheklash uchun.
Buning uchun qachon AI dan foydalanish kerak
Ushbu turdagi chatbotdan foydalaning, agar:
- Siz takroriy savollar olasiz va darhol "birinchi javob"ni xohlaysiz.
- Sizning kontentingiz allaqachon boy (FAQ, “Haqida” sahifalari, qoʻllanmalar) va AI foydalanuvchiga yoʻl-yoʻriq koʻrsatishi mumkin.
- Siz javob ba'zan nomukammal bo'lishi mumkinligini qabul qilasiz va aniq xabar ("avtomatik javob") qo'shasiz.
- Sizga hamma joyda tashqi skriptlarni joylashtiradigan shaffof bo'lmagan plaginga tayanmasdan, yengil, boshqariladigan chatbot kerak.
Men uni ko'pincha o'quv qo'llanmalari bloglari, ko'rgazma saytlari yoki savollar juda barqaror bo'lgan joylar (masalan, "qanday buyurtma berish kerak", "muddat", "narxlar") uchun tavsiya qilaman.
Qachon AI dan foydalanmaslik kerak
Agar klassik WordPress yechimi yaxshiroq, sodda va arzonroq ish qilsa, sun'iy intellektdan qoching:
- Ichki tadqiqot Qidiruv funksiyasini yaxshilashdan boshlang (parchalar, toifalar, "Sayt xaritasi" sahifasi). Sun'iy intellekt sizga "qidiruv funksiyasidan foydalanish"ni aytishi qimmatga tushishi mumkin.
- Sezgir qo'llab-quvvatlash (Sog'liqni saqlash, huquqiy, moliya): Gallyutsinatsiya xavfi realdir. Bunday hollarda aloqa shakli + bilim bazasi xavfsizroqdir.
- Tranzaksiya bilan bog'liq muammolar (buyruqlar, hisoblar): agar javob shaxsiy ma'lumotlarga bog'liq bo'lsa, "oddiy" AI chatini uyushtirmang. Sizga haqiqiy autentifikatsiya, ruxsatnomalar va tahdid modeli kerak.
- qattiq byudjet Agar trafik kam bo'lsa, muammo yo'q. Agar kuniga 50 000 marta tashrif buyursangiz, kesh/tezlik chegarasi bo'lmasa, narx keskin oshishi mumkin.
qo'ymaydi
Maqsadli versiyalar WordPress 6.9.4 (2026-yil aprel) va PHP 8.1+.
AI API kaliti Men OpenAI dan misol sifatida foydalanmoqdaman, chunki API barqaror va yaxshi hujjatlashtirilgan, ammo arxitektura Anthropic/Mistral/Google bilan bir xil bo'ladi.
Tez tushunish: API va HTTP chaqiruvlari
mashxurlikka API bu sizga xizmatdan biror narsa so'rash imkonini beruvchi interfeys (bu yerda: "bu savolga javob bering"). Texnik jihatdan, siz HTTP so'rovini yuborasiz (ko'pincha POST) JSON bilan va siz buning evaziga JSON olasiz.
WordPressda bu HTTP API orqali to'g'ri bajariladi: wp_remote_post() (va wp_remote_get()Bu tavsiya etilgan usul, chunki u transport (cURL, oqimlar), proksi-serverlarni boshqaradi va WordPress bilan integratsiyalashadi.
Rasmiy manba: WordPress HTTP API'si.
API kalitini qayerda saqlash kerak (majburiy)
Siz kalitni saqlaysiz wp-config.phpMavzu faylida emas, ayniqsa JavaScriptda emas. Agar kalitingiz brauzerda topilsa, u 30 soniyada nusxalanadi va sizning hisobingizdan ishlatiladi.
Buni qo'shing wp-config.php (ideal holda, “Bo‘ldi, tahrirlashni to‘xtating!” qatoridan oldin):
define('BPCAB_OPENAI_API_KEY', 'VOTRE_CLE_ICI');
xarajatlar APIga yuborilgan har bir xabar uchun pul kerak bo'ladi (har bir token uchun). Agar u "bir necha sent" bo'lsa ham, u qo'shilishi mumkin. Shuning uchun biz server tomonida keshlash va tezlik chegarasini joriy qilamiz.
Kodni qayerga joylashtirish kerak
- Tavsiya etilgan variant : a mu-plagin (zaryad avtomatik). Yo'l:
wp-content/mu-plugins/. - muqobil : klassik maxsus plagin
wp-content/plugins/. - Qoching :
functions.phpmavzuning (ayniqsa, agar siz mavzularni o'zgartirsangiz yoki quruvchi fayllarni yangilasa).
Rasmiy mu-plaginlar hujjatlari: Foydalanish shart bo'lgan plaginlar.
Yechim arxitekturasi
Mana, oddiy tilda tasma:
- Mehmon quyidagi sahifani ochadi
[ai_chatbot]. - Qisqa kod foydalanuvchi interfeysini (kichik oyna) ko'rsatadi + JS yuklaydi.
- Foydalanuvchi xabar yuborganda, JS POST so'rovini yuboradi
admin-ajax.phpbilan:- xabar
- WordPress nonce (soxtalashtirilgan so'rovga qarshi)
- WordPress so'rovni AJAX kancasi orqali qabul qiladi, nonce ni tasdiqlaydi, tezlik chegarasini qo'llaydi va keyin AI API ni chaqiradi
wp_remote_post(). - WordPress javobni dezinfektsiya qiladi, uni keshlaydi (vaqtinchalik), keyin JSONni brauzerga qaytaradi.
- Brauzer javobni ko'rsatadi.
Nima uchun WordPress AJAX dan foydalanish kerak (va JS da AI API ni chaqirmaslik kerak)?
Chunki kalitingiz server tomonida qolishi kerak. Agar siz OpenAI ni to'g'ridan-to'g'ri brauzerdan chaqirsangiz, kalitni fosh qilasiz... va siz nazoratni yo'qotasiz (xarajat, suiiste'mol qilish, qirib tashlash).
To'liq kod - bosqichma-bosqich
Biz quyidagi mu-plaginni yaratmoqchimiz:
- qisqa kod qo'shish
[ai_chatbot] - CSS/JS navbatni to'g'ri joylashtirish
- tizimga kirgan va tizimdan chiqqan foydalanuvchilar uchun AJAX amalini yaratadi
- OpenAI API ni chaqiradi
- javoblarni saqlaydi
1-qadam — mu-plaginni yarating
Jildni yarating wp-content/mu-plugins/ Agar u mavjud bo'lmasa, faylni yarating:
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-qadam — Shortcode + CSS/JS yuklanmoqda
Un Shortcodes qavslar orasidagi tegdir (masalan, [ai_chatbot]) WordPress HTML bilan almashtiradi. Bu Divi 5, Elementor va Avada bilan qulay: ularning barchasi qisqa kodni qanday kiritishni bilishadi ("Kod" moduli, "Qisqa kod" vidjeti va boshqalar).
/**
* 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');
Keng tarqalgan xato bu kodni noto'g'ri faylga (builder snippet yoki juda kech ishlaydigan snippet plagini) joylashtirishdir. Mu-plagin yordamida siz ko'plab kutilmagan hodisalardan qochasiz.
3-qadam — CSS/JS fayllarini yarating
Xuddi shu faylda mu-plugins, yaratish:
bpcab-ai-chatbot.cssbpcab-ai-chatbot.js
Minimal CSS (Siz uni mavzu/quruvchiga moslashtirishingiz mumkin):
.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;
}
Minimal JS WordPress’ga AJAX orqali xabarlarni yuborish, xabarlarni ko‘rsatish, holatni boshqarish.
(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);
});
})();
Keng tarqalgan xato: “JS yuklanmayapti.” 90% hollarda bu noto'g'ri yo'l. plugins_url(), yoki eski versiyani taqdim etayotgan kesh (plagin/CDN). Versiyani o'zgartiring BPCAB_CHATBOT_VERSION Majburiy qayta yuklash yoki keshni tozalash uchun.
4-qadam — AJAX so'nggi nuqtasi + nonce + tezlik chegarasi
Un qayrilma qoziq WordPress kirish nuqtasidir. Uning ikki turi mavjud:
- harakat : “bu yerda biror narsa qil” (masalan,
wp_enqueue_scripts). - filtri : “ushbu qiymatni oʻzgartirish” (masalan,
the_content).
Bu yerda biz AJAX amallaridan foydalanamiz: wp_ajax_* (ulangan) va wp_ajax_nopriv_* (ulanmagan).
/**
* 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-qadam — wp_remote_post() + kesh vaqtinchalik funksiyasi orqali OpenAI chaqiruvi
Biz quyidagilarni qilmoqchimiz:
- Savolga (xesh) asoslangan holda kesh kalitini yarating.
- Xuddi shu javob uchun qayta pul to'lamaslik uchun TTL (masalan, 24 soat) ni o'rnating.
- PHP "o'chib qolishi"ning oldini olish uchun qisqa vaqt oralig'ini (masalan, 20 soniya) qo'shing.
- Javobni tozalang (HTMLning juda cheklangan kichik to'plamiga ruxsat beriladi).
/**
* 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;
}
Men tez-tez ko'radigan ikkita xato:
- Nuqtali vergulni unutish yilda
wp-config.phpyoki mu-plaginda: natija, oq ekran (halokatli xato). Faollashtirish.WP_DEBUGSahnalashtirishda, ishlab chiqarishda emas. - Eski qo'llanmani nusxalash eski API tuzilmasidan yoki eskirgan modeldan foydalanadi. Bu yerda sizda WordPress 6.9.4 + PHP 8.1 bazasi mavjud va siz faqat OpenAI o'z tavsiyasini o'zgartirgan taqdirdagina oxirgi nuqtani moslashtirasiz.
To'liq yig'ilgan kod
Quyida to'liq fayl keltirilgan mu-plaginShuningdek, siz CSS/JS fayllarini yaratishingiz kerak bo'ladi (yuqorida ko'rsatilgan). Kalitni ushbu faylga qo'ymang.
<?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');
Kodning izohi
Nima uchun mu-plagin?
Mu-plagin avtomatik ravishda, faollashtirmasdan yuklanadi va mavzuga joylashtirilgan parchaga qaraganda kamroq "mo'rt". Mening tajribamda, yangi boshlovchi kodni kiritganda functions.php va keyin mavzuni o'zgartiradi (yoki ota-ona mavzusini yangilaydi), chatbot yo'qoladi.
pourquoi wp_localize_script()
Biz uni JS ga o'tish uchun ishlatamiz:
- AJAX URL manzili (
admin-ajax.php) - nuncio
- uzunlik chegarasi
Bu URLni "qattiq kodlash"dan qochadi va WordPress pastki papkaga o'rnatilgan bo'lsa ham ishlaydi.
Hujjat: wp_localize_script ().
Nonce: aslida nimani himoya qiladi
WordPress nonce boshqa saytning sizning nomingizdan tashrif buyuruvchi brauzeringiz orqali so'rovlar yuborishiga to'sqinlik qiladi (CSRF hujumi). Bu autentifikatsiya tizimining o'rnini bosmaydi, ammo ommaviy chatbot uchun bu minimal talabdir.
Hujjat: WordPress Nonces.
Kesh o'tish davri: nima uchun bu juda muhim
Les vaqtinchalik Bular amal qilish muddati tugagan kalit/qiymat keshlari. Agar tashrif buyuruvchi oyiga 200 marta "Ish vaqtingiz qancha?" deb so'rasa, siz 200 ta sun'iy intellekt qo'ng'irog'i uchun pul to'lamoqchi emassiz. Siz bitta qo'ng'iroq uchun pul to'laysiz, keyin keshdan javob olasiz.
Hujjat: API o'tish davri.
Javobni tozalash
AI API kutilmagan matnni (yoki hatto HTMLni) qaytarishi mumkin. Agar siz buni to'g'ridan-to'g'ri DOMga kiritsangiz, XSS zaifliklariga yo'l ochasiz. Bu yerda:
- biz faqat ruxsat beramiz
a,strong,em,br - qolgan hamma narsa o'chiriladi
Foydalanilgan funksiya: wp_kses()Hujjat: wp_kses().
API xarajatlari va optimallashtirish
Aniq narxlar modelga va shartnomangizga bog'liq. Baholash uchun quyidagilar muhim:
- oyiga xabarlar soni
- savol va javoblarning o'rtacha uzunligi (jetonlar)
- keshga tegish darajasi (nechta bir xil savollar takrorlangan)
"Joyida" taxminiy baho (kattalik tartibida)
Oddiy "orientatsiya" chatbotida men ko'pincha quyidagilarni kuzataman:
- Savol: 20 dan 60 tagacha tokenlar
- Javob: 60 dan 200 gacha tokenlar
- Jami: har bir o'zaro ta'sir uchun 100 dan 300 gacha token
Agar sizda oyiga 2000 ta o'zaro ta'sir bo'lsa, bu oyiga 200 000 dan 600 000 gacha tokenlarga teng. Modelga qarab, bu oqilona bo'lishi mumkin... yoki yo'q. Keshlash va "mini" model katta farq qiladi.
Darhol optimallashtirish
- 24 soatlik kesh (allaqachon mavjud). Barqaror FAQ uchun siz intervalni 7 kungacha oshirishingiz mumkin.
- Qisqa javoblar : so'rovga “maksimal 5 ta jumlada javob bering” qo'shing.
- Past harorat : kamroq o'zgarishlar, ko'proq keshga tegish.
- Uzunlikni cheklang JS va PHP tomonlarida xabarlar (allaqachon mavjud). Har doim ikki tomonlama to'siq.
Murakkab variantlar va foydalanish holatlari
1-variant — “sayt konteksti”ni qo‘shish (RAGsiz)
Maqolalaringizni qidirmasdan, siz qisqacha statik kontekstni taqdim etishingiz mumkin (masalan, ish vaqtingiz, FAQ URL manzilingiz). Bu ko'rgazma veb-sayti uchun foydalidir.
// 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),
);
2-variant — qisqa kod atributi orqali “Maqola xulosasi” rejimi
Siz ruxsat berishingiz mumkin [ai_chatbot mode="resume"] va joriy sahifa ekstraktini AIga yuboring. Izoh: ko'proq tokenlar = yuqori narx.
// 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 '...';
}
Aniqlik kiritib qo'yay: bu parcha to'liq emas. Uning ishlashi uchun JS ni ham o'zgartirish kerak (yuborish) mode) va AJAX ishlov beruvchisi (rejimga qarab so'rovni o'zgartiring).
Variant 3 - Divi 5 / Elementor / Avada integratsiyasi
- 5-bo'lim "Kod" yoki "Qisqa kod" modulini qo'shing va joylashtiring
[ai_chatbot]Agar Divi minifikatsiya qilsa/birlashtirsa, CSS/JS yangilanmasa, uning statik keshini tozalang. - Elementor “Qisqa kod” vidjeti →
[ai_chatbot]Agar siz Elementor aktivlarini optimallashtirishdan foydalanayotgan bo'lsangiz, skript agressiv ravishda kechiktirilmaganligini tekshiring (aks holdaDOMContentLoadedin'ektsiyadan oldin sodir bo'lishi mumkin: bu holda, shuningdek, ishga tushiringelementor/frontend/init). - Avada Fusion Builder dasturida “Shortcode” elementi. Agar sizda Avada keshi bo'lsa, CSS/JS fayllarini qo'shgandan so'ng tozalang.
Xavfsizlik va eng yaxshi amaliyotlar
API kalitini mijoz tomonida hech qachon oshkor qilmang
Oddiy qoida: kalit ichkarida qoladi wp-config.phpBrauzer uni hech qachon ko'rmasligi kerak. JS paketida "yashirin" bo'lsa ham, uni qayta tiklash mumkin.
Kiritishlarni tasdiqlash va cheklash
- JS tomonidagi maksimal uzunlik (UX) + PHP tomonida (xavfsizlik).
- Bo'sh xabarlarni rad etish.
- IP-manzil bo'yicha tezlik chegarasi (allaqachon mavjud). Bundan tashqari, sessiya/cookie-fayllar bo'yicha ham cheklashingiz mumkin.
Chiqishlarni tozalang
Javobni matn sifatida ko'rsatish (JSdagi kabi) textContent) yoki agar siz HTML ga ruxsat bersangiz, kuchli dezinfektsiya qilish. Bu yerda biz ikkalasini ham qilamiz: server tomonida dezinfektsiya qilamiz va mijoz tomonida matn sifatida ko'rsatamiz. Bu ataylab "paranoid".
GDPR: ma'lumotlar uchinchi tomonga yuboriladi
Agar tashrif buyuruvchi shaxsiy ma'lumotlarni kiritsa, siz uni xizmat ko'rsatuvchi provayderga (OpenAI) yuborayotgan bo'lishingiz mumkin. Shunga muvofiq rejalashtiring:
- aniq xabar ("Maxfiy ma'lumotlarni ulashmang.")
- maxfiylik siyosatingizda eslatma
- Shartnomangizga muvofiq yetkazib beruvchi sozlamalari (saqlab qolish, rad etish va boshqalar)
Zaxira nusxasisiz ishlab chiqarishda sinovdan o'tkazmang.
PHP xatosi bo'lgan mu-plagin butun saytni ishdan chiqaradi (chunki u avtomatik ravishda yuklanadi). Avval bosqichma-bosqich nusxa ustida ishlang. Agar siz ishlab chiqarishda ishlashingiz kerak bo'lsa, oq ekran paydo bo'lgan taqdirda faylni o'chirish uchun FTP/SSH kirishini saqlang.
Qanday qilib sinovdan o'tkazish va disk raskadrovka qilish kerak
Jurnallarni to'g'ri yoqing
Sinov muhitida quyidagilarni yoqing:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Hujjat: WordPressda nosozliklarni tuzatish.
AJAX so'rovini tekshiring
- Brauzerning DevTools → Tarmoq yorlig'ini oching → filtrni yoqing
admin-ajax.php. - HTTP holatini (200/403/429/500) va JSON javobini tekshiring.
- Agar siz JSON o'rniga HTML sahifasini ko'rsangiz, bu ko'pincha halokatli PHP xatosi (yoki to'sqinlik qilayotgan xavfsizlik plagini).
AI API'sini "quruq muddatda" sinovdan o'tkazish
JS ni integratsiya qilishdan oldin, siz qo'ng'iroq qilishingiz mumkin bpcab_get_ai_answer() administrator kontekstida (vaqtinchalik) va javobni qayd eting. Ushbu kodni joyida qoldirmang.
Agar bu ishlamasa
| alomat | Ehtimoliy sabab | tekshiruv | qaror |
|---|---|---|---|
| Sahifada hech narsa ko'rsatilmaydi | Qisqa kod yo'q yoki talqin qilinmagan | Sahifada quyidagilar borligini tekshiring [ai_chatbot] (qavslardan qochib ketadigan "Kod" blokida emas) |
“Qisqa kod” blokidan (Elementor) / Qisqa kod modulidan (Divi/Avada) foydalaning |
| Chat oynasi paydo bo'ladi, lekin tugma javob bermayapti | JavaScript yuklanmadi (kesh, yo'l, ziddiyat) | DevTools → Konsol (xatolar) + Tarmoq (JS fayli 404?) | Tekshirish plugins_url()keshni tozalash, oshirish BPCAB_CHATBOT_VERSION |
| Javob “yaroqsiz” | Muddati o'tgan nonce, tajovuzkor sahifa keshi yoki JS eski nonce qabul qilmoqda | Qiymatga qarang BPCAB_CHATBOT.nonce konsolda |
Chat sahifalaridagi keshni kamaytiring yoki yuklamada nonce ni qayta yarating (yanada ilg'or yondashuv) |
| 429-xato "Juda ko'p so'rovlar" | Juda qattiq yoki takroriy sinovlar o'tkaziladigan stavka chegaralari | Shaxsiy brauzerda/boshqa IP manzilda nusxalash | Oyna/chegarani oshiring yoki tizimga kirgan foydalanuvchilarni cheklang |
| Xato "AI API mavjud emas (kod 401/403)" | Noto'g'ri kalit, kalit yuklanmagan, ruxsatnomalar | Tekshirish BPCAB_OPENAI_API_KEY yilda wp-config.php (bo'sh joysiz) |
Kalitni qayta yarating, yetkazib beruvchi tomonidagi to'lov/kvotani tekshiring |
| "JSON noto'g'ri" xatosi | Qisqartirilgan API javobi (proksi, WAF) yoki o'zgartirilgan oxirgi nuqta | Tizimga kirish $raw sahnalashtirishda (ma'lumotlarga e'tibor bering) |
Rasmiy hujjatlarga muvofiq yakuniy nuqta/formatni sozlang, agar kerak bo'lsa, vaqtni oshiring |
| Mu-plagin qo'shilgandan so'ng oq ekran | PHP xatosi (qavs, nuqta-vergul), PHP versiyasi juda eski | Consult wp-content/debug.log yoki server jurnallari |
Sintaksisni to'g'rilang, PHP 8.1+ ni tekshiring, agar kerak bo'lsa, faylni FTP orqali o'chiring |
Haqiqiy muammolar va tezkor yechimlar
- Kod noto'g'ri joyga joylashtirildi Agar siz uni konstruktorning "Maxsus kod" bo'limiga joylashtirgan bo'lsangiz, u filtrlangan/qochib ketgan bo'lishi mumkin. Buning o'rniga mu-plagindan foydalaning.
- Noto'g'ri ilmoq : agar siz JS ga so'rov yuborsangiz
initSiz uni juda erta/noto'g'ri yuklash xavfiga duch kelasiz. Bu yerda biz foydalanamizwp_enqueue_scripts. - Kesh mojarosi Ba'zi keshlar nonce ni o'z ichiga olgan HTMLni keshlaydi. Natija: hamma uchun eskirgan nonce. Yechim: sahifani keshdan chiqarib tashlang yoki "yangi" nonce (rivojlangan variant) qaytaradigan marshrutni amalga oshiring.
- Doimiy To'g'ridan-to'g'ri bog'liq emas, lekin men saytlarni ko'rganman
admin_url()noto'g'ri sozlangan xavfsizlik plagini tomonidan filtrlanmoqda. Agar AJAX javob bermasa, URL manzilini sinab ko'ring/wp-admin/admin-ajax.phpto'g'ridan-to'g'ri brauzerda.
resurslari
- WordPress HTTP API (wp_remote_post)
- Transients API (kesh)
- Xavfsizlik (nons)
- wp_kses() (sanitariya)
- WordPress nosozliklarini tuzatish (WP_DEBUG)
- OpenAI API hujjatlari
- PHP mbstring (mb_strlen)
- Rasmiy WordPress ombori (wordpress-develop)
FAQ
Agar mu-plagin qo'shsam, bu haqiqatan ham "plaginsiz" bo'ladimi?
Siz wordpress.org saytidan uchinchi tomon plaginini o'rnatmayapsiz, lekin texnik jihatdan kodni plagin shaklida qo'shmoqdasiz. Bu ataylab qilingan: bu kodni mavzudan mustaqil saqlashning eng toza usuli.
Kodni qo'ysam bo'ladimi functions.php ?
Ha, lekin men buni tavsiya qilmayman. Mavzularni o'zgartirganingizda chatbotni yo'qotish xavfi tug'iladi va mavzu quruvchisi nosozliklarni tuzatishni murakkablashtirishi mumkin. Agar baribir buni qilsangiz, bolalar mavzusidan foydalaning.
Nima uchun foydalanish kerak admin-ajax.php REST API o'rniga?
Ikkalasi ham ishlaydi. Yangi boshlovchi uchun AJAX WordPressni o'rnatish juda oson. Agar sizga zamonaviyroq yondashuv kerak bo'lsa, REST yo'nalishiga o'ting. register_rest_route() va qayta qo'ng'iroq qilish ruxsatnomalari. Asosiy (qo'ng'iroq) wp_remote_post()(kesh, xavfsizlik) o'zgarishsiz qoladi.
Nonce mening keshlash plaginim bilan uzilib qoladi: nima qilishim kerak?
Sahifani keshdan chiqarib tashlang (oddiy yechim) yoki so'rov bo'yicha nonce qaytaradigan oxirgi nuqtani amalga oshiring, so'ngra uni olish uchun JSni yangilang. Kuchli keshlangan saytlarda (agressiv CDN) bu klassik yondashuv.
Chatbotni ma'lum sahifalar bilan qanday cheklashim mumkin?
Qisqa kod sizga allaqachon ushbu boshqaruvni beradi: siz uni faqat kerakli joyga qo'shasiz. Va kod faqat qisqa kod mavjud bo'lgandagina JS/CSS ga so'rov yuboradi.
Sun'iy intellektning bema'ni gaplarni tarqatishiga qanday yo'l qo'ymasligimiz mumkin?
Bunga 100% kafolat bera olmaysiz. Xavfni kamaytiring:
- qisqa javoblar
- past harorat
- Xabar aniq: "Agar bilmasangiz, ayting".
- Tez-tez so'raladigan savollar/kontaktingizga yo'naltirish
Javobda bosish mumkin bo'lgan havolalarni ko'rsata olamanmi?
Ha, lekin buni ehtiyotkorlik bilan bajaring. Ushbu qo'llanmada biz quyidagilarni tozalaymiz wp_kses() vakolat berish orqali aJS tomonida biz quyidagilarni ko'rsatamiz textContent (shuning uchun HTML yo'q). Agar siz bosiladigan havolalarni xohlasangiz, ularni HTML formatida ko'rsatishingiz kerak (innerHTML) va qo'shimcha ehtiyot choralarini ko'rish (qat'iy sanitariya, avtomatik ravishda qo'shilish) rel="noopener nofollow").
Divi 5 / Elementor / Avada bilan mos keladimi?
Ha: “Qisqa kod” moduli/vidjetidan foydalaning va joylashtiring [ai_chatbot]Kod mavzudan mustaqil. Odatda faqat keshlash/minifikatsiyadan kelib chiqadigan muammolar: fayllarni qo'shgandan keyin tozalash.
Nima uchun uni 400 ta belgi bilan cheklayapsiz?
Katta miqdordagi so'rovlardan qochish, xarajatlarni kamaytirish va suiiste'mollikni cheklash uchun siz so'rovlar sonini ko'paytirishingiz mumkin, ammo buni oqibatlari (tokenlar, kechikish, to'lov) haqida to'liq xabardor bo'lgan holda amalga oshiring.
Sun'iy intellekt modelini qanday o'zgartirish mumkin?
Qiymatni o'zgartiring model yilda $bodyYo'riqnoma chatboti uchun "mini" modelni saqlang. Agar siz masshtabni kengaytirsangiz, xarajatlar va kechikishni kuzatib boring.
Men “HTTP xatosi: cURL xatosi 28” xabarini olaman
Bu vaqt tugadi. Tekshiring:
- Xosting serveridan (xavfsizlik devori) tarmoqqa kirishga ruxsat berilgan
- DNS
- kattalashtirish; ko'paytirish
timeout(masalan, 30) agar serveringiz sekin ishlayotgan bo'lsa
Agar siz qulflangan umumiy hosting rejasida bo'lsangiz, bu keng tarqalgan.