إذا رغبت يوماً في عرض ملخص "TL;DR" واضح في أعلى مقالاتك دون قضاء 10 دقائق في كتابته لكل منشور، فإن الذكاء الاصطناعي قادر على القيام بذلك نيابةً عنك. WordPress يوفر لك الإصدار 6.9.4 بالفعل كل ما تحتاجه لدمجه بشكل صحيح.
تكمن المشكلة في أن 90% من المقتطفات البرمجية التي تجدها على الإنترنت ستكون عديمة الفائدة تمامًا بحلول عام 2026: مفاتيح واجهة برمجة تطبيقات مُضمّنة في الكود، واستدعاءات من جانب المتصفح (مفتاح مكشوف)، وعدم وجود تخزين مؤقت، وخطافات مُختارة بشكل سيئ تُطلق 20 طلبًا للذكاء الاصطناعي في الصفحة الواحدة. هنا، نفعل العكس تمامًا: ملخص مُولّد من جانب الخادم، ومُخزّن مؤقتًا، ومُخزّن في البيانات الوصفية، ويُعرض أينما تريد.
الحاجة / حالة الاستخدام
يُحقق الملخص التلقائي غرضين عمليين للغاية: تحسين سهولة القراءة (حيث يفهم الزوار فورًا موضوع المقال) وزيادة معدل الاحتفاظ بالزائرين (حيث تُقلل "المعاينة" الجيدة من معدل الارتداد). وقد رأيتُ هذا الأسلوب يُجدي نفعًا في كثير من الأحيان في المدونات الطويلة جدًا (كالدروس التعليمية، والوصفات المفصلة، والمقارنات) حيث تكون المقدمة بالضرورة مُطوّلة.
الحالات النموذجية:
- مدونات SEO : مربع "ملخص في 4 نقاط" في أعلى المقال.
- موقع إعلامي : نسخة مختصرة لصفحات الفئات أو بطاقات العناصر.
- الوثائق / قاعدة المعرفة ملخص + نقاط رئيسية للمساعدة في المسح الضوئي.
- النشرة الإخبارية : أعد استخدام الملخص كعنصر جذب في البريد الإلكتروني.
في النهاية، ستعرف:
- تشغيل عملية إنشاء ملخص (يدويًا من لوحة التحكم أو تلقائيًا عند التسجيل)،
- استدعاء واجهة برمجة تطبيقات الذكاء الاصطناعي عبر
wp_remote_post(), - التخزين المؤقت (البيانات المؤقتة) وتخزين النتيجة (بيانات ما بعد المعالجة).
- عرض الملخص عبر رمز مختصر (متوافق مع Gutenberg و Divi 5 و Elementor و Avada)،
- تصحيح الأخطاء الكلاسيكية (المهلة، الحصة، JSON غير صالح، الربط مبكرًا جدًا).
ملخص سريع
- يتم إنشاء الملخص الجانب الخلفي (PHP) عبر
wp_remote_post(): لا يتم الكشف عن مفتاح API مطلقًا. - والنتيجة هي مخزنة في بيانات ما بعد النشر et مخزنة مؤقتًا مع المتشردين لتجنب الدفع مرتين.
- يُتيح لك زر في المحرر القيام بما يلي: إنشاء / إعادة إنشاء الملخص، بدون آليات تلقائية خطيرة.
- رمز مختصر
[ai_summary]يعرض الملخص في Gutenberg أو Divi 5 أو Elementor أو Avada. - يقوم الكود بمعالجة الأخطاء (انقضاء المهلة، أخطاء HTTP 401/429/500) وتنظيف المخرجات باستخدام
wp_kses_post().
متى يُستخدم الذكاء الاصطناعي لهذا الغرض؟
استخدم الذكاء الاصطناعي إذا كان محتواك طويلاً، أو يتطلب تلخيصاً متكرراً، أو إذا كان لديك عدة مؤلفين وترغب في الحصول على ملخص متسق. كما أنه مفيد إذا كنت تعيد نشر مقالات وتريد ملخصاً "محدثاً" دون الحاجة إلى إعادة قراءة كل شيء.
لقد حققت نتائج جيدة عندما:
- يبلغ طول المقالات ما بين 800 و 1200 كلمة.
- لديك هيكل واضح (العناوين، الأقسام)،
- تفرض شكلاً من أشكال التلخيص (على سبيل المثال، 3-5 نقاط رئيسية، نبرة محايدة، بدون وعود).
متى لا يجب استخدام الذكاء الاصطناعي
لا تدفع مقابل واجهة برمجة تطبيقات الذكاء الاصطناعي في الحالات التي WordPress/PHP يفعل ذلك بشكل أفضل ومجاناً.
- مستخلص بسيط إذا كنت تريد فقط أول 20 سطراً، فاستخدم المقتطف. WordPress (حقل الاستخراج) أو
wp_trim_words(). - محتوى قصير جداً لا يحتاج منشور مكون من 200 كلمة إلى ملخص بالذكاء الاصطناعي.
- قيود قانونية/تحريرية قوية إذا كان من الضروري أن يكون الملخص دقيقًا من الناحية القانونية (طبية، مالية)، فإن الإنسان هو الأفضل.
- المواقع شديدة الحساسية للتكاليف إذا كان لديك 50000 عنصر وقمت بتجديد كل شيء، فستصل الفاتورة بسرعة.
بديل "كلاسيكي" غالباً ما يكون كافياً:
<?php
// Exemple : extrait gratuit sans IA (utile si vous débutez)
$excerpt = has_excerpt() ? get_the_excerpt() : wp_trim_words( wp_strip_all_tags( get_the_content() ), 40 );
echo esc_html( $excerpt );
?>
المتطلبات الأساسية
ستقوم بالاتصال بخدمة خارجية عبر API واجهة برمجة التطبيقات (API). عمليًا، هي عنوان URL يرسل إليه موقعك الإلكتروني طلب HTTP (غالبًا بتنسيق JSON) ويتلقى استجابة (غالبًا بتنسيق JSON). في ووردبريس، يتم ذلك باستخدام واجهة برمجة تطبيقات HTTP. wp_remote_post() et wp_remote_get().
المتطلبات التقنية (أبريل 2026):
- WordPress : 6.9.4 (أو أحدث).
- PHP : يوصى باستخدام الإصدار 8.1+ (ومن الناحية العملية، تجنب الإصدار 8.0 إن أمكن).
- HTTPS نشط على الموقع (وإلا ستواجه عاجلاً أم آجلاً مشاكل في المكالمات الصادرة).
- قم بالدخول إلى ملف wp-config.php الخاص بك لتخزين مفتاح واجهة برمجة التطبيقات (API).
اختيار مزود الذكاء الاصطناعي: أعرض OpenAI في الكود (واجهة برمجة تطبيقات مستقرة وموثقة جيدًا)، لكن البنية هي نفسها بالنسبة لـ Anthropic و Google AI و Mistral وما إلى ذلك.
التكاليف تستهلك كل عملية توليد رموزًا (النص المُرسَل + النص المُستَلَم). إذا قمتَ بتفعيل التوليد في كل مرة تُعرَض فيها الصفحة، فسوف تدفع ثمنًا باهظًا. هنا، نقوم بالتوليد مرة واحدة، ونخزّنه، ونعيد توليده فقط عند حدوث إجراء.
تخزين مفتاح واجهة برمجة التطبيقات (أين وكيف)
تجنب وضع مفتاحك في رمز مختصر، أو كتلة HTML، أو JS، أو كنص عادي في قاعدة البيانات إن أمكن. أبسط طريقة للبدء: استخدام ثابت في wp-config.php.
أضف هذا إلى wp-config.php، قبل عبارة "هذا كل شيء، توقف عن التحرير!":
<?php
// Clé API OpenAI (ne jamais committer ce fichier dans un dépôt public)
define( 'BPCAB_OPENAI_API_KEY', 'sk-votre-cle-ici' );
// Optionnel : modèle (vous pourrez ajuster sans toucher au plugin)
define( 'BPCAB_OPENAI_MODEL', 'gpt-4.1-mini' );
?>
إذا لم يكن لديك إمكانية الوصول إلى wp-config.phpاستخدم متغير بيئة من جانب الخادم بدلاً من ذلك. ولكن بالنسبة لمدون مبتدئ، فإن الثابت في wp-config.php لا يزال الخيار الأكثر موثوقية.
أين يتم لصق الكود
تجنب functions.php إذا كنت مبتدئًا: خطأ واحد في استخدام الفاصلة المنقوطة قد يتسبب في تعطل موقعك. أنصحك بـ مو-المساعد (المساعد "يجب استخدامه"): يقوم ووردبريس بتحميله تلقائيًا، وهو أكثر استقرارًا من جزء من القالب.
- أنشئ المجلد:
wp-content/mu-plugins/(إن لم يكن موجوداً). - إنشاء ملف:
wp-content/mu-plugins/ai-summary.php - ألصق "الكود المجمع الكامل" أدناه.
بنية الحل
إليكم ما يحدث خلف الكواليس (مخطط نصي):
محرر ووردبريس → انقر على "إنشاء ملخص" → استعلام المسؤول (رقم عشوائي) → PHP يسترجع المحتوى → ذاكرة التخزين المؤقت (إذا تم إنشاؤه مسبقًا) → وإلا wp_remote_post() → واجهة برمجة تطبيقات الذكاء الاصطناعي → استجابة JSON → التنظيف (
wp_kses_post()) → التخزين في ما بعد التعريف → عرض عبر رمز قصير
لماذا هذا التصميم؟
- لا يتم طلب الذكاء الاصطناعي عند تحميل الصفحة وإلا ستدفع في كل زيارة (وتخاطر بـ "حد المعدل" 429).
- التخزين بعد البيانات الوصفية سريع، بسيط، قابل للتصدير، ويمكنك عرضه في أي مكان.
- عابر : يتجنب إعادة تشغيل الذكاء الاصطناعي إذا نقرت مرتين، أو إذا أدى الحفظ التلقائي إلى تشغيل عملية ثانية.
- رمز قصير متوافق مع Gutenberg و Divi 5 و Elementor و Avada بدون الحاجة إلى كود الواجهة الأمامية.
الكود الكامل - خطوة بخطوة
سنقوم ببناء 5 طوب:
- دالة لاستخراج نص "نظيف" من محتوى ووردبريس،
- دالة تستدعي واجهة برمجة تطبيقات الذكاء الاصطناعي باستخدام
wp_remote_post(), - ذاكرة تخزين مؤقتة
- تخزين ما بعد البيانات الوصفية
- زر في لوحة التحكم + رمز عرض مختصر.
1) استخلاص المحتوى المناسب للتلخيص
إرسال كود HTML الخام (مع الرموز المختصرة، والكتل، والبرامج النصية) غالبًا ما ينتج عنه ملخصات غريبة. سنقوم بما يلي:
- استرجاع المحتوى،
- تنفيذ الرموز المختصرة (اختياري)،
- قم بإزالة العلامات،
- تقليل الطول للحد من التكاليف.
<?php
/**
* Prépare le texte à envoyer à l'IA.
* Objectif : éviter d'envoyer du HTML/bruit et limiter les tokens.
*/
function bpcab_ai_summary_prepare_text( int $post_id, int $max_chars = 12000 ): string {
$post = get_post( $post_id );
if ( ! $post instanceof WP_Post ) {
return '';
}
$content = $post->post_content;
// Optionnel : exécuter les shortcodes. Utile sur certains sites, mais parfois ça ajoute du bruit.
// Si vous avez des shortcodes lourds (formulaires, produits), commentez la ligne suivante.
$content = do_shortcode( $content );
// Applique les filtres de contenu (blocs, embeds, etc.).
$content = apply_filters( 'the_content', $content );
// Retire toutes les balises HTML.
$text = wp_strip_all_tags( $content, true );
// Normalise les espaces.
$text = preg_replace( '/s+/u', ' ', $text );
$text = trim( (string) $text );
// Coupe pour limiter les coûts (et éviter des timeouts si l'article est énorme).
if ( function_exists( 'mb_substr' ) ) {
$text = mb_substr( $text, 0, $max_chars );
} else {
$text = substr( $text, 0, $max_chars );
}
return $text;
}
?>
2) استدعاء واجهة برمجة تطبيقات الذكاء الاصطناعي باستخدام wp_remote_post()
يوفر ووردبريس واجهة برمجة تطبيقات HTTP رسمية. هذه هي الطريقة المفضلة: فهي تدعم cURL/streams، والخوادم الوكيلة، وSSL، وتتكامل مع أدوات ووردبريس.
مصادر رسمية مفيدة:
<?php
/**
* Appelle l'API OpenAI pour générer un résumé.
* Retourne soit une chaîne (résumé), soit WP_Error.
*/
function bpcab_ai_summary_call_openai( string $input_text, array $args = [] ) {
if ( ! defined( 'BPCAB_OPENAI_API_KEY' ) || BPCAB_OPENAI_API_KEY === '' ) {
return new WP_Error( 'bpcab_missing_api_key', 'Clé API manquante : définissez BPCAB_OPENAI_API_KEY dans wp-config.php.' );
}
$model = defined( 'BPCAB_OPENAI_MODEL' ) ? BPCAB_OPENAI_MODEL : 'gpt-4.1-mini';
$defaults = [
'max_bullets' => 4,
'language' => 'fr',
'timeout' => 25,
];
$args = wp_parse_args( $args, $defaults );
// Prompt volontairement strict : réduit les hallucinations et impose une forme stable.
$system = 'Vous êtes un assistant éditorial. Vous résumez fidèlement le texte fourni. Vous n'inventez rien.';
$user = "Résume le texte ci-dessous en {$args['max_bullets']} puces maximum, en {$args['language']}. "
. "Chaque puce doit être courte (max 18 mots). Pas de marketing, pas de phrases vagues.nn"
. $input_text;
$body = [
'model' => $model,
'input' => [
[
'role' => 'system',
'content' => $system,
],
[
'role' => 'user',
'content' => $user,
],
],
// On évite une température trop haute pour un résumé.
'temperature' => 0.2,
];
$request_args = [
'headers' => [
'Authorization' => 'Bearer ' . BPCAB_OPENAI_API_KEY,
'Content-Type' => 'application/json',
],
'timeout' => (int) $args['timeout'],
'body' => wp_json_encode( $body ),
];
$response = wp_remote_post( 'https://api.openai.com/v1/responses', $request_args );
if ( is_wp_error( $response ) ) {
return $response;
}
$code = (int) wp_remote_retrieve_response_code( $response );
$raw = (string) wp_remote_retrieve_body( $response );
if ( $code < 200 || $code >= 300 ) {
// On garde un extrait du body pour aider au debug, sans tout logguer.
$excerpt = function_exists( 'mb_substr' ) ? mb_substr( $raw, 0, 300 ) : substr( $raw, 0, 300 );
return new WP_Error( 'bpcab_openai_http_error', 'Erreur HTTP OpenAI (' . $code . ') : ' . $excerpt, [ 'status' => $code ] );
}
$data = json_decode( $raw, true );
if ( ! is_array( $data ) ) {
return new WP_Error( 'bpcab_openai_json_error', 'Réponse JSON invalide depuis OpenAI.' );
}
// Extraction robuste : la structure peut évoluer, on vise le texte final.
$text = '';
// Format attendu : output_text (souvent présent), sinon on parcourt output.
if ( isset( $data['output_text'] ) && is_string( $data['output_text'] ) ) {
$text = $data['output_text'];
} elseif ( isset( $data['output'] ) && is_array( $data['output'] ) ) {
foreach ( $data['output'] as $item ) {
if ( isset( $item['content'] ) && is_array( $item['content'] ) ) {
foreach ( $item['content'] as $c ) {
if ( isset( $c['type'] ) && $c['type'] === 'output_text' && isset( $c['text'] ) ) {
$text .= (string) $c['text'];
}
}
}
}
}
$text = trim( (string) $text );
if ( $text === '' ) {
return new WP_Error( 'bpcab_openai_empty', 'OpenAI a répondu, mais aucun texte de résumé n’a été trouvé.' );
}
return $text;
}
?>
3) ذاكرة تخزين مؤقتة + تخزين ما بعد البيانات الوصفية
تُستخدم البيانات المؤقتة كذاكرة تخزين مؤقتة قصيرة الأجل (دقائق/ساعات). أما بيانات المنشور فتُستخدم كذاكرة تخزين طويلة الأجل (طالما بقي المقال موجودًا). نحن نجمع بين الأمرين: تتجنب الدفع أثناء التجديد غير المقصود، وتحتفظ بالملخص حتى لو انتهت صلاحية البيانات المؤقتة.
المراجع:
<?php
/**
* Génère (ou récupère) le résumé IA d'un article.
* - Si déjà stocké en meta et pas de force, on le renvoie.
* - Sinon on regarde le transient (évite double facture).
* - Sinon on appelle l'IA, on nettoie, on stocke, puis on renvoie.
*/
function bpcab_ai_summary_get_or_generate( int $post_id, bool $force_regenerate = false ) {
$meta_key = '_bpcab_ai_summary';
if ( ! $force_regenerate ) {
$existing = (string) get_post_meta( $post_id, $meta_key, true );
if ( $existing !== '' ) {
return $existing;
}
}
$transient_key = 'bpcab_ai_sum_' . $post_id;
if ( ! $force_regenerate ) {
$cached = get_transient( $transient_key );
if ( is_string( $cached ) && $cached !== '' ) {
return $cached;
}
}
$input = bpcab_ai_summary_prepare_text( $post_id );
if ( $input === '' ) {
return new WP_Error( 'bpcab_no_content', 'Contenu vide : impossible de résumer.' );
}
$result = bpcab_ai_summary_call_openai( $input, [
'max_bullets' => 4,
'timeout' => 25,
] );
if ( is_wp_error( $result ) ) {
return $result;
}
// Nettoyage : on autorise uniquement un HTML simple (listes, gras, liens si jamais).
$clean = wp_kses_post( $result );
// Stockage long terme.
update_post_meta( $post_id, $meta_key, $clean );
// Cache court terme (ex. 12h). Ajustez selon votre flux éditorial.
set_transient( $transient_key, $clean, 12 * HOUR_IN_SECONDS );
return $clean;
}
?>
4) زر "إنشاء ملخص" في لوحة التحكم (آمن)
تمت إضافة مربع بيانات إلى شاشة تحرير المقالة. يؤدي الضغط على الزر إلى تشغيل إجراء إداري مع السفير البابوي (رمز الحماية من هجمات تزوير الطلبات عبر المواقع). إذا كنت مبتدئًا: يمنع رمز التحقق (nonce) موقعًا خارجيًا من خداع متصفحك للنقر "دون علمك" لإنشاء ملخصات (وبالتالي استهلاك حصتك).
المراجع:
<?php
/**
* Ajoute une metabox sur les posts (vous pouvez ajouter 'page' si vous voulez).
*/
add_action( 'add_meta_boxes', function () {
add_meta_box(
'bpcab-ai-summary-box',
'Résumé IA',
'bpcab_ai_summary_metabox_render',
'post',
'side',
'high'
);
} );
function bpcab_ai_summary_metabox_render( WP_Post $post ): void {
$meta_key = '_bpcab_ai_summary';
$summary = (string) get_post_meta( $post->ID, $meta_key, true );
$generate_url = wp_nonce_url(
add_query_arg(
[
'action' => 'bpcab_generate_ai_summary',
'post_id' => $post->ID,
],
admin_url( 'admin-post.php' )
),
'bpcab_generate_ai_summary_' . $post->ID
);
$regen_url = wp_nonce_url(
add_query_arg(
[
'action' => 'bpcab_generate_ai_summary',
'post_id' => $post->ID,
'force' => 1,
],
admin_url( 'admin-post.php' )
),
'bpcab_generate_ai_summary_' . $post->ID
);
echo '<p>Générez un résumé en 4 puces. Le résultat est stocké dans la fiche de l’article.</p>';
if ( $summary !== '' ) {
echo '<div style="padding:8px;border:1px solid #ccd0d4;background:#fff;max-height:180px;overflow:auto">';
echo wp_kses_post( nl2br( $summary ) );
echo '</div>';
} else {
echo '<p><em>Aucun résumé généré pour le moment.</em></p>';
}
echo '<p><a class="button button-primary" href="' . esc_url( $generate_url ) . '">Générer</a></p>';
echo '<p><a class="button" href="' . esc_url( $regen_url ) . '">Régénérer (force)</a></p>';
echo '<p>Shortcode : <code>[ai_summary]</code></p>';
}
/**
* Handler admin : génère le résumé et redirige vers l'éditeur.
*/
add_action( 'admin_post_bpcab_generate_ai_summary', function () {
if ( ! current_user_can( 'edit_posts' ) ) {
wp_die( 'Droits insuffisants.' );
}
$post_id = isset( $_GET['post_id'] ) ? (int) $_GET['post_id'] : 0;
if ( $post_id <= 0 ) {
wp_die( 'Post ID invalide.' );
}
check_admin_referer( 'bpcab_generate_ai_summary_' . $post_id );
$force = isset( $_GET['force'] ) && (int) $_GET['force'] === 1;
$result = bpcab_ai_summary_get_or_generate( $post_id, $force );
// Prépare un message admin simple.
$redirect = get_edit_post_link( $post_id, 'raw' );
if ( ! $redirect ) {
$redirect = admin_url( 'edit.php' );
}
if ( is_wp_error( $result ) ) {
$redirect = add_query_arg(
[
'bpcab_ai_summary' => 'error',
'msg' => rawurlencode( $result->get_error_message() ),
],
$redirect
);
} else {
$redirect = add_query_arg(
[
'bpcab_ai_summary' => 'success',
],
$redirect
);
}
wp_safe_redirect( $redirect );
exit;
} );
/**
* Affiche un message dans l'admin après génération.
*/
add_action( 'admin_notices', function () {
if ( ! is_admin() ) {
return;
}
if ( ! isset( $_GET['bpcab_ai_summary'] ) ) {
return;
}
$status = sanitize_text_field( (string) $_GET['bpcab_ai_summary'] );
if ( $status === 'success' ) {
echo '<div class="notice notice-success is-dismissible"><p>Résumé IA généré.</p></div>';
} elseif ( $status === 'error' ) {
$msg = isset( $_GET['msg'] ) ? sanitize_text_field( (string) $_GET['msg'] ) : 'Erreur inconnue.';
echo '<div class="notice notice-error is-dismissible"><p>Résumé IA : ' . esc_html( $msg ) . '</p></div>';
}
} );
?>
5) عرض الرمز القصير (Gutenberg، Divi، Elementor، Avada)
الرمز المختصر هو علامة نصية صغيرة (على سبيل المثال: [ai_summary]) الذي يستبدله ووردبريس بالمحتوى. هذه هي أبسط طريقة للتوافق مع معظم أدوات إنشاء المواقع.
إشارة:
<?php
/**
* Shortcode : [ai_summary]
* Attributs :
* - post_id (optionnel) : par défaut, le post courant
* - fallback="excerpt" : si pas de résumé, affiche un extrait classique
*/
add_shortcode( 'ai_summary', function ( $atts ) {
$atts = shortcode_atts(
[
'post_id' => 0,
'fallback' => 'none',
],
(array) $atts,
'ai_summary'
);
$post_id = (int) $atts['post_id'];
if ( $post_id <= 0 ) {
$post_id = get_the_ID();
}
if ( ! $post_id ) {
return '';
}
$summary = (string) get_post_meta( $post_id, '_bpcab_ai_summary', true );
if ( $summary === '' ) {
if ( $atts['fallback'] === 'excerpt' ) {
$excerpt = has_excerpt( $post_id ) ? get_the_excerpt( $post_id ) : wp_trim_words( wp_strip_all_tags( get_post_field( 'post_content', $post_id ) ), 40 );
return '<div class="bpcab-ai-summary"><p>' . esc_html( $excerpt ) . '</p></div>';
}
return '';
}
// On autorise un HTML simple (le meta contient déjà du wp_kses_post, mais on re-filtre à l'affichage).
$html = wp_kses_post( nl2br( $summary ) );
return '<div class="bpcab-ai-summary"><strong>Résumé</strong><br>' . $html . '</div>';
} );
?>
الكود المجمع بالكامل
انسخ هذا الملف والصقه كما هو في wp-content/mu-plugins/ai-summary.phpبعد ذلك، تحقق من أن مفتاحك مُعرّف بشكل صحيح في wp-config.php.
إدراك المخاطر : إذا قمت بلصق هذا الكود في الملف الخطأ (على سبيل المثال، في إضافة مقتطفات تضيف علامات) <?php (تلقائيًا)، قد يتسبب ذلك في حدوث خطأ فادح. إذا كنت تستخدم إضافة مقتطفات، فقم باللصق. بلا علامات PHP إذا كانت الإضافة تضيفها بالفعل.
<?php
/**
* Plugin Name: BPCAB — Résumé IA des articles
* Description: Génère et affiche un résumé IA (stocké en meta) via OpenAI. Compatible WordPress 6.9.4+ / PHP 8.1+.
* Author: BPCAB
* Version: 1.0.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Prépare le texte à envoyer à l'IA.
*/
function bpcab_ai_summary_prepare_text( int $post_id, int $max_chars = 12000 ): string {
$post = get_post( $post_id );
if ( ! $post instanceof WP_Post ) {
return '';
}
$content = $post->post_content;
// Optionnel : exécuter les shortcodes (peut ajouter du bruit selon votre site).
$content = do_shortcode( $content );
// Applique les filtres du contenu (blocs, embeds, etc.).
$content = apply_filters( 'the_content', $content );
$text = wp_strip_all_tags( $content, true );
$text = preg_replace( '/s+/u', ' ', $text );
$text = trim( (string) $text );
if ( function_exists( 'mb_substr' ) ) {
$text = mb_substr( $text, 0, $max_chars );
} else {
$text = substr( $text, 0, $max_chars );
}
return $text;
}
/**
* Appelle l'API OpenAI pour générer un résumé.
* Retourne soit une chaîne (résumé), soit WP_Error.
*/
function bpcab_ai_summary_call_openai( string $input_text, array $args = [] ) {
if ( ! defined( 'BPCAB_OPENAI_API_KEY' ) || BPCAB_OPENAI_API_KEY === '' ) {
return new WP_Error( 'bpcab_missing_api_key', 'Clé API manquante : définissez BPCAB_OPENAI_API_KEY dans wp-config.php.' );
}
$model = defined( 'BPCAB_OPENAI_MODEL' ) ? BPCAB_OPENAI_MODEL : 'gpt-4.1-mini';
$defaults = [
'max_bullets' => 4,
'language' => 'fr',
'timeout' => 25,
];
$args = wp_parse_args( $args, $defaults );
$system = 'Vous êtes un assistant éditorial. Vous résumez fidèlement le texte fourni. Vous n'inventez rien.';
$user = "Résume le texte ci-dessous en {$args['max_bullets']} puces maximum, en {$args['language']}. "
. "Chaque puce doit être courte (max 18 mots). Pas de marketing, pas de phrases vagues.nn"
. $input_text;
$body = [
'model' => $model,
'input' => [
[
'role' => 'system',
'content' => $system,
],
[
'role' => 'user',
'content' => $user,
],
],
'temperature' => 0.2,
];
$request_args = [
'headers' => [
'Authorization' => 'Bearer ' . BPCAB_OPENAI_API_KEY,
'Content-Type' => 'application/json',
],
'timeout' => (int) $args['timeout'],
'body' => wp_json_encode( $body ),
];
$response = wp_remote_post( 'https://api.openai.com/v1/responses', $request_args );
if ( is_wp_error( $response ) ) {
return $response;
}
$code = (int) wp_remote_retrieve_response_code( $response );
$raw = (string) wp_remote_retrieve_body( $response );
if ( $code < 200 || $code >= 300 ) {
$excerpt = function_exists( 'mb_substr' ) ? mb_substr( $raw, 0, 300 ) : substr( $raw, 0, 300 );
return new WP_Error( 'bpcab_openai_http_error', 'Erreur HTTP OpenAI (' . $code . ') : ' . $excerpt, [ 'status' => $code ] );
}
$data = json_decode( $raw, true );
if ( ! is_array( $data ) ) {
return new WP_Error( 'bpcab_openai_json_error', 'Réponse JSON invalide depuis OpenAI.' );
}
$text = '';
if ( isset( $data['output_text'] ) && is_string( $data['output_text'] ) ) {
$text = $data['output_text'];
} elseif ( isset( $data['output'] ) && is_array( $data['output'] ) ) {
foreach ( $data['output'] as $item ) {
if ( isset( $item['content'] ) && is_array( $item['content'] ) ) {
foreach ( $item['content'] as $c ) {
if ( isset( $c['type'] ) && $c['type'] === 'output_text' && isset( $c['text'] ) ) {
$text .= (string) $c['text'];
}
}
}
}
}
$text = trim( (string) $text );
if ( $text === '' ) {
return new WP_Error( 'bpcab_openai_empty', 'OpenAI a répondu, mais aucun texte de résumé n’a été trouvé.' );
}
return $text;
}
/**
* Génère (ou récupère) le résumé IA d'un article.
*/
function bpcab_ai_summary_get_or_generate( int $post_id, bool $force_regenerate = false ) {
$meta_key = '_bpcab_ai_summary';
if ( ! $force_regenerate ) {
$existing = (string) get_post_meta( $post_id, $meta_key, true );
if ( $existing !== '' ) {
return $existing;
}
}
$transient_key = 'bpcab_ai_sum_' . $post_id;
if ( ! $force_regenerate ) {
$cached = get_transient( $transient_key );
if ( is_string( $cached ) && $cached !== '' ) {
return $cached;
}
}
$input = bpcab_ai_summary_prepare_text( $post_id );
if ( $input === '' ) {
return new WP_Error( 'bpcab_no_content', 'Contenu vide : impossible de résumer.' );
}
$result = bpcab_ai_summary_call_openai( $input, [
'max_bullets' => 4,
'timeout' => 25,
] );
if ( is_wp_error( $result ) ) {
return $result;
}
$clean = wp_kses_post( $result );
update_post_meta( $post_id, $meta_key, $clean );
set_transient( $transient_key, $clean, 12 * HOUR_IN_SECONDS );
return $clean;
}
/**
* Metabox dans l'éditeur.
*/
add_action( 'add_meta_boxes', function () {
add_meta_box(
'bpcab-ai-summary-box',
'Résumé IA',
'bpcab_ai_summary_metabox_render',
'post',
'side',
'high'
);
} );
function bpcab_ai_summary_metabox_render( WP_Post $post ): void {
$summary = (string) get_post_meta( $post->ID, '_bpcab_ai_summary', true );
$generate_url = wp_nonce_url(
add_query_arg(
[
'action' => 'bpcab_generate_ai_summary',
'post_id' => $post->ID,
],
admin_url( 'admin-post.php' )
),
'bpcab_generate_ai_summary_' . $post->ID
);
$regen_url = wp_nonce_url(
add_query_arg(
[
'action' => 'bpcab_generate_ai_summary',
'post_id' => $post->ID,
'force' => 1,
],
admin_url( 'admin-post.php' )
),
'bpcab_generate_ai_summary_' . $post->ID
);
echo '<p>Générez un résumé en 4 puces. Le résultat est stocké dans la fiche de l’article.</p>';
if ( $summary !== '' ) {
echo '<div style="padding:8px;border:1px solid #ccd0d4;background:#fff;max-height:180px;overflow:auto">';
echo wp_kses_post( nl2br( $summary ) );
echo '</div>';
} else {
echo '<p><em>Aucun résumé généré pour le moment.</em></p>';
}
echo '<p><a class="button button-primary" href="' . esc_url( $generate_url ) . '">Générer</a></p>';
echo '<p><a class="button" href="' . esc_url( $regen_url ) . '">Régénérer (force)</a></p>';
echo '<p>Shortcode : <code>[ai_summary]</code></p>';
}
/**
* Handler admin sécurisé.
*/
add_action( 'admin_post_bpcab_generate_ai_summary', function () {
if ( ! current_user_can( 'edit_posts' ) ) {
wp_die( 'Droits insuffisants.' );
}
$post_id = isset( $_GET['post_id'] ) ? (int) $_GET['post_id'] : 0;
if ( $post_id <= 0 ) {
wp_die( 'Post ID invalide.' );
}
check_admin_referer( 'bpcab_generate_ai_summary_' . $post_id );
$force = isset( $_GET['force'] ) && (int) $_GET['force'] === 1;
$result = bpcab_ai_summary_get_or_generate( $post_id, $force );
$redirect = get_edit_post_link( $post_id, 'raw' );
if ( ! $redirect ) {
$redirect = admin_url( 'edit.php' );
}
if ( is_wp_error( $result ) ) {
$redirect = add_query_arg(
[
'bpcab_ai_summary' => 'error',
'msg' => rawurlencode( $result->get_error_message() ),
],
$redirect
);
} else {
$redirect = add_query_arg(
[
'bpcab_ai_summary' => 'success',
],
$redirect
);
}
wp_safe_redirect( $redirect );
exit;
} );
/**
* Notices admin.
*/
add_action( 'admin_notices', function () {
if ( ! is_admin() ) {
return;
}
if ( ! isset( $_GET['bpcab_ai_summary'] ) ) {
return;
}
$status = sanitize_text_field( (string) $_GET['bpcab_ai_summary'] );
if ( $status === 'success' ) {
echo '<div class="notice notice-success is-dismissible"><p>Résumé IA généré.</p></div>';
} elseif ( $status === 'error' ) {
$msg = isset( $_GET['msg'] ) ? sanitize_text_field( (string) $_GET['msg'] ) : 'Erreur inconnue.';
echo '<div class="notice notice-error is-dismissible"><p>Résumé IA : ' . esc_html( $msg ) . '</p></div>';
}
} );
/**
* Shortcode : [ai_summary]
*/
add_shortcode( 'ai_summary', function ( $atts ) {
$atts = shortcode_atts(
[
'post_id' => 0,
'fallback' => 'none',
],
(array) $atts,
'ai_summary'
);
$post_id = (int) $atts['post_id'];
if ( $post_id <= 0 ) {
$post_id = get_the_ID();
}
if ( ! $post_id ) {
return '';
}
$summary = (string) get_post_meta( $post_id, '_bpcab_ai_summary', true );
if ( $summary === '' ) {
if ( $atts['fallback'] === 'excerpt' ) {
$excerpt = has_excerpt( $post_id ) ? get_the_excerpt( $post_id ) : wp_trim_words( wp_strip_all_tags( get_post_field( 'post_content', $post_id ) ), 40 );
return '<div class="bpcab-ai-summary"><p>' . esc_html( $excerpt ) . '</p></div>';
}
return '';
}
$html = wp_kses_post( nl2br( $summary ) );
return '<div class="bpcab-ai-summary"><strong>Résumé</strong><br>' . $html . '</div>';
} );
?>
شرح الكود
إعداد النصوص
bpcab_ai_summary_prepare_text() يقوم بالتنظيف قبل الإرسال:
apply_filters('the_content', ...)يعيد بناء عرض متماسك (كتل، عناصر مضمنة).wp_strip_all_tags()قم بإزالة كود HTML لمنع الذكاء الاصطناعي من "تلخيص" تصميمك.- يُعد الحد الأقصى لعدد الأحرف البالغ 12000 حرف بمثابة إجراء وقائي ضد المقالات (والفواتير) الضخمة.
فخ شائع: بعض العصا مباشرة get_the_content() في واجهة برمجة التطبيقات (API). النتيجة: تقوم بإرسال رموز مختصرة غير مفسرة، وتعليقات HTML، وأحيانًا نصوص برمجية مضمنة بواسطة أداة إنشاء.
استدعاء HTTP عبر wp_remote_post()
wp_remote_post() يرسل الطلب. نضبط:
- مهلة بعد 25 ثانية: بعد ذلك، تتوقف العديد من خدمات الاستضافة المشتركة عن العمل.
- نوع المحتوى JSON + رأس التفويض.
- طلب صارم للحصول على رقائق قصيرة.
مأزق شائع: استخدام برنامج تعليمي قديم يستدعي https://api.openai.com/v1/chat/completions باستخدام تنسيق قديم، ثم الاعتقاد بأن "واجهة برمجة التطبيقات قد تعطلت". في عام 2026، نقطة النهاية /v1/responses وهو الأكثر عملية في هذه الحالة.
ذاكرة التخزين المؤقت + البيانات الوصفية
نقوم بتخزينه في:
- ما بعد التعريف
_bpcab_ai_summary: مثابر. - عابر
bpcab_ai_sum_{$post_id}: يتجنب المكالمات المزدوجة المتقاربة.
كثيراً ما واجهتُ خللاً في المواقع التي تستخدم إضافة تخزين مؤقت قوية: يقوم المستخدمون بالاختبار، ثم ينقرون مرتين، مما يؤدي إلى استدعاءين للذكاء الاصطناعي. ويتوقف هذا الأمر فجأةً بسبب خاصية التخزين المؤقت.
Metabox + nonce
يُضيف مربع البيانات الوصفية زرًا. المعالج قيد التشغيل admin-post.phpوهذا يجنب الحاجة إلى كتابة نقطة نهاية REST كاملة للاستخدام الأولي.
لا يمكن التفاوض على قيمة nonce: فبدونها، يمكن لأي صفحة خارجية أن تؤدي إلى إنشاء قيمة جديدة إذا كنت مسجلاً الدخول إلى لوحة التحكم.
العرض عبر رمز مختصر
يُعيد الكود المختصر كود HTML عاديًا. إذا كنت ترغب في عرض قائمة، يمكنك أن تطلب من الذكاء الاصطناعي إرجاع <ul>لكنني أفضل النص + nl2br() : إنه أكثر قوة فيما يتعلق بالقوالب/أدوات البناء.
تكاليف واجهة برمجة التطبيقات وتحسينها
تعتمد التكلفة على القالب وحجم النص المُرسَل. بالنسبة لمقالٍ من 1500 كلمة، غالبًا ما تُرسَل تكلفة تُعادل بضعة آلاف من الرموز. مع قالب "مُصغّر"، تكون التكلفة لكل وحدة منخفضة عمومًا، لكنها تتراكم بسرعة عند إعادة إنشاء كميات كبيرة.
تقدير بسيط (قابل للتعديل)
مثال واقعي:
- 100 قطعة شهرياً
- جيل واحد لكل مقال (ليس مع كل تحديث)
- ملخص قصير (4 نقاط)
ستدفع عادةً ما بين بضعة يورو إلى بضع عشرات من اليورو شهريًا، وذلك حسب الطراز ومتوسط مدة الاستخدام. تكمن المشكلة الحقيقية في خطأين:
- يتم عرضها في كل صفحة،
- أرسل المحتوى الكامل بدون حدود (مقالات + تعليقات + كتل كبيرة).
تحسينات ملموسة
- قص النص (تم إنجاز ذلك بالفعل): غالباً ما يكون 8 إلى 12 حرف كافياً.
- يتم توليدها من المخزون (زر) بدلاً من التشغيل التلقائي
save_post. - أعد استخدام الملخص (النشرة الإخبارية، وصف OG، الخرائط) لجعل المكالمة مربحة.
- اختر نموذجًا أصغر بالنسبة للملخصات (غالباً لا جدوى من أخذ الجزء الأكبر).
المتغيرات المتقدمة وحالات الاستخدام
1) يتم إنشاؤها تلقائيًا عند النشر (مع وجود ضمانات)
إذا كنت ترغب في أتمتة العملية، فافعل ذلك فقط عندما يتم وضع علامة "نشر" على المقالة، مع تحديد خيار لتجنب إعادة تشغيل العملية في كل مرة تقوم فيها بالحفظ التلقائي. وإلا، ستدفع مقابل لا شيء.
<?php
// Variante : génération automatique lors de la publication (optionnel).
add_action( 'transition_post_status', function ( $new_status, $old_status, $post ) {
if ( ! $post instanceof WP_Post ) {
return;
}
if ( $post->post_type !== 'post' ) {
return;
}
// On génère seulement quand on publie pour la première fois.
if ( $old_status !== 'publish' && $new_status === 'publish' ) {
// Évite de faire ça sur des révisions/autosaves.
if ( wp_is_post_revision( $post->ID ) || wp_is_post_autosave( $post->ID ) ) {
return;
}
// Si déjà présent, on ne touche pas.
$existing = (string) get_post_meta( $post->ID, '_bpcab_ai_summary', true );
if ( $existing !== '' ) {
return;
}
// Génération (sans forcer).
$result = bpcab_ai_summary_get_or_generate( $post->ID, false );
// Si erreur, on ne bloque pas la publication.
if ( is_wp_error( $result ) ) {
error_log( 'Résumé IA : ' . $result->get_error_message() );
}
}
}, 10, 3 );
?>
2) مخرجات "متوافقة مع محركات البحث" لوصف الميتا
يمكنك إنشاء نسخة تتراوح بين 155 و160 حرفًا وتخزينها في علامة تعريفية منفصلة. ملاحظة: إذا كنت تستخدم Yoast/RankMath، فلكل منهما حقوله الخاصة. الهدف هنا هو توضيح آلية العمل، وليس تجاوز إعدادات تحسين محركات البحث الخاصة بك.
3) تكامل Divi 5 / Elementor / Avada
- غوتبورغ استخدم كتلة "الرمز المختصر" وضع
[ai_summary]. - ديفي 5 أدخل وحدة "الرمز" أو "النص".
[ai_summary]إذا لم يظهر لك العرض في أداة الإنشاء، فقم بالاختبار على الواجهة الأمامية (قد يختلف Divi في الوضع المرئي). - Elementor أداة "الرمز المختصر"، لصق
[ai_summary]إذا كنت تستخدم ذاكرة تخزين مؤقتة، فقم بمسحها بعد إنشائها. - فتح : عنصر "Shortcode" في Fusion Builder، أو مباشرة في المحتوى.
السلامة وأفضل الممارسات
القواعد الأربع التي أكررها في كل موقع:
- لا تستخدم مفتاح API من جانب العميل لا يقوم جافا سكريبت باستدعاء OpenAI من المتصفح. بخلاف ذلك، يمكن استعادة المفتاح وإعادة استخدامه.
- المبعوثون البابويون في كل مكان لإجراءات الإدارة (تم إنجازها بالفعل).
- نظف المقبس نحن نطبق
wp_kses_post()قبل التخزين وقبل العرض. حتى لو لم يكن الذكاء الاصطناعي "خبيثًا"، فأنت لا تريد أكواد HTML غير متوقعة. - الحد من معدل إذا سمحت بإنشاء المحتوى للمستخدمين (وهذه فكرة سيئة)، فضع حدًا أقصى لكل عنوان IP/مستخدم. هنا، الأمر مقتصر على المسؤولين فقط، لذا فهو محدود بالفعل.
اللائحة العامة لحماية البيانات / الخصوصية
إذا أرسلت محتوى مقال إلى خدمة خارجية، فأنت تنقل البيانات إلى جهة خارجية. بالنسبة للمدونات العامة، يكون هذا مقبولاً في كثير من الأحيان، ولكن:
- تجنب إرسال البيانات الشخصية (الأسماء، عناوين البريد الإلكتروني) إذا كنت تقوم بتلخيص محتوى خاص.
- قم بتوثيق المقاول من الباطن في سياسة الخصوصية الخاصة بك.
- إذا كنت تقوم بتلخيص محتوى يخضع لالتزامات (صحية، قانونية)، فتحقق من صحة إطارك القانوني.
كيفية الاختبار والتصحيح
اختبر دائمًا في بيئة تجريبية إن أمكن. على الأقل: قم بعمل نسخة احتياطية من الكود قبل إضافة PHP.
تفعيل سجلات ووردبريس
في wp-config.php :
<?php
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
?>
ثم:
- انقر على "إنشاء" في مقال قصير،
- في حال وجود خطأ: انظر
wp-content/debug.log.
اختبار استدعاء HTTP بدون الذكاء الاصطناعي (تشخيص الشبكة)
Si wp_remote_post() يفشل في كل مكان؛ المشكلة غالباً ما تكون في الشبكة/SSL/الخادم الوكيل على الاستضافة.
يمكنك اختبار طلب GET بسيط:
<?php
add_action( 'admin_init', function () {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
if ( ! isset( $_GET['bpcab_http_test'] ) ) {
return;
}
$r = wp_remote_get( 'https://www.wordpress.org', [ 'timeout' => 10 ] );
if ( is_wp_error( $r ) ) {
wp_die( 'HTTP test error: ' . esc_html( $r->get_error_message() ) );
}
wp_die( 'HTTP test OK: ' . (int) wp_remote_retrieve_response_code( $r ) );
} );
?>
إذا لم ينجح الأمر
مخطط تشخيصي
| عرض | السبب المحتمل | التحقق | الحلول |
|---|---|---|---|
| خطأ فادح (شاشة بيضاء) بعد اللصق | تم لصق الكود في المكان الخطأ / قوس مفقود أو فاصلة منقوطة | تشاور wp-content/debug.log أو سجلات الخادم |
استخدم إضافة mu، ثم ارجع، وصحح بناء الجملة |
| OpenAI HTTP 401 | مفتاح غير صالح / تم نسخه بشكل غير صحيح / ثابت غير مُعرَّف | الاختيار BPCAB_OPENAI_API_KEY في wp-config.php |
أعد إنشاء المفتاح، وانسخه بدون مسافات، وتحقق من صحة الملف. |
| OpenAI HTTP 429 | تم تجاوز الحصة أو الحد الأقصى للسعر | انظر إلى نص الخطأ (المستخرج من الرسالة) | انتظر، قلل عدد المكالمات، فعّل التخزين المؤقت، استخدم نموذجًا أصغر |
| مهلة زمنية / خطأ cURL رقم 28 | مهلة الانتظار قصيرة جدًا أو الاستضافة بطيئة/محظورة | اختبار wp_remote_get() إلى wordpress.org |
زيادة timeout عند بلوغ سن 35، تحقق من جدار الحماية الصادر |
| لا يتم عرض الملخص في أداة الإنشاء. | لا يتم عرض الرمز المختصر في وضع المحرر/التخزين المؤقت | اختبر واجهة المستخدم وقم بمسح ذاكرة التخزين المؤقت للملحق/شبكة توصيل المحتوى (CDN). | استخدم أداة/وحدة "الرمز المختصر" لمسح ذاكرة التخزين المؤقت. |
| يقوم الزر بإنشاء الكود، ولكن لا يتم تخزين أي شيء. | تعارض في الأذونات أو معرف منشور غير صحيح | تأكد من أنك مسؤول/مؤلف ولديك صلاحيات التحرير. | الاختيار current_user_can() والعنوان URL الذي تم إنشاؤه |
أخطاء واقعية أراها كثيراً (وكيفية تجنبها)
- انسخ الكود إلى القالب الرئيسي مع التحديث القادم للثيم، ستفقد كل شيء. استخدم إضافة mu-plugin أو إضافة مخصصة.
- نسيان تعريف الثابت الكود يعمل، لكنه يُرجع رسالة "مفتاح API مفقود". تحقق من ذلك.
wp-config.phpوعلامات الاقتباس. - خطاف غير لائق إذا قمت بتشغيل الجيل
the_contentيمكنك تفعيل الذكاء الاصطناعي على كل شاشة. استمر في إنشاء المحتوى بناءً على إجراءات المسؤول أو النشر. - اختبار في بيئة الإنتاج بدون نسخة احتياطية فاصلة زائدة واحدة وستواجه مشكلة. قم بعمل نسخة احتياطية من بياناتك أولاً.
- البرنامج التعليمي القديم غير متوافق إذا قمت بتعديل جزء من التعليمات البرمجية لعام 2023، فقد يستهدف نقاط نهاية/معلمات قديمة. في عام 2026، يُفضّل...
/v1/responsesواستخلاص قوي.
الموارد
- ووردبريس: wp_remote_post()
- ووردبريس: واجهة برمجة تطبيقات HTTP
- ووردبريس: أرقام عشوائية
- ووردبريس: واجهة برمجة تطبيقات البيانات المؤقتة
- OpenAI: واجهة برمجة تطبيقات الاستجابات (مرجع رسمي)
- PHP: json_decode()
- نواة ووردبريس على جيت هاب (wordpress-develop)
الأسئلة الشائعة
هل يعمل هذا النظام مع ووردبريس 6.9.4 و PHP 8.1؟
نعم: يعتمد كل شيء على واجهة برمجة تطبيقات HTTP الخاصة بـ WordPress، وعلامات التعريف الوصفية للمنشورات، والبيانات المؤقتة، وهي عناصر مستقرة منذ فترة طويلة. يتجنب الكود استخدام واجهات برمجة تطبيقات "غير مألوفة" ويظل متوافقًا مع PHP 8.1 والإصدارات الأحدث.
لماذا لا يتم إنشاء الملخص في كل مرة يتم فيها عرض المقالة؟
لأنك تدفع في كل زيارة، وتخاطر بتجاوز حصتك (429). لذا، فإن توليدها مرة واحدة وتخزينها هو الاستراتيجية الأفضل.
أين يوجد الملخص في قاعدة البيانات؟
في الجدول wp_postmeta، مفتاح _bpcab_ai_summaryيمكنك عرضها باستخدام إضافة مثل WP-CLI أو أداة قاعدة البيانات، ولكن تجنب التحرير مباشرة في SQL إذا كنت مبتدئًا.
هل يمكنني عرض الملخص في صفحات الفئات (الأرشيفات)؟
نعم. في الحلقة، استخدم [ai_summary post_id="123"] أو اتصل مباشرة get_post_meta(get_the_ID(), '_bpcab_ai_summary', true) في قالب.
هل يمكن أن يكون الملخص خاطئاً؟
نعم. حتى مع وجود توجيهات صارمة، قد يُبسّط الذكاء الاصطناعي المعلومات بشكل مفرط أو يغفل بعض التفاصيل. لذا، في المواضيع الحساسة، يُنصح بالاستعانة برأي بشري.
هل يمكنني تغيير التنسيق (فقرة بدلاً من نقاط)؟
نعم: عدّل التعليمات في $userعلى سبيل المثال: "لخص في جملتين كحد أقصى (160 حرفًا)". حافظ على هدوء الأجواء.
لماذا نستخدم إضافة mu بدلاً من الإضافة الكلاسيكية؟
يتم تحميل إضافة mu تلقائيًا ولا يمكن تعطيلها عن طريق الخطأ من لوحة التحكم. هذا مفيد للميزات "الهيكلية". إذا كنت تفضل إمكانية تفعيلها/تعطيلها، فاستخدم إضافة قياسية.
لا يعرض Elementor/Divi الصورة في المحرر، هل هذا طبيعي؟
نعم في أغلب الأحيان. بعض أدوات إنشاء المواقع لا تُفعّل جميع الرموز المختصرة في وضع التحرير المرئي. تحقق من واجهة المستخدم، ثم امسح ذاكرة التخزين المؤقت (الملحق/شبكة توصيل المحتوى).
كيف يمكن تجنب إرسال المحتوى الخاص إلى واجهة برمجة التطبيقات (API)؟
لا تُفعّل خاصية التوليد التلقائي لأنواع المحتوى الخاص، وقم بتصفية النص (إزالة عناوين البريد الإلكتروني وأرقام الهواتف) عند الضرورة. بالنسبة للشبكات الداخلية، ناقش الإطار القانوني واتفاقيات معالجة البيانات.
أتلقى رسالة "استجابة JSON غير صالحة"، ماذا أفعل؟
يحدث هذا إذا قام جدار الحماية بإدخال صفحة HTML، أو إذا قام مزود الاستضافة باقتطاع الاستجابة. تحقق من رمز HTTP، ثم سجّل الدخول. مؤقتا الجسم بأكمله، واختبار الاتصال الصادر.
هل يمكنني استبدال OpenAI بـ Anthropic أو Mistral؟
نعم: حافظ على نفس البنية (التحضير ← التخزين المؤقت ← استدعاء HTTP ← التنظيف ← البيانات الوصفية). فقط الوظيفة bpcab_ai_summary_call_openai() تغيير (عنوان URL + تنسيق JSON + استخراج النص).