Ak ste niekedy strávili 40 minút písaním popisu produktu, len aby ste nakoniec dostali vlažnú verziu, tento pracovný postup si zamilujete: WooCommerce vygeneruje „dlhý“ popis a „krátky“ úryvok z názvu, atribútov a niekoľkých obchodných poznámok – a vy si ponecháte kontrolu nad overením.
Potreba / Prípad použitia
V katalógoch WooCommerce je tvorba obsahu často úzkym hrdlom. Videl som obchody s 300 produktmi „čakajúcimi“ na odoslanie jednoducho preto, že chýbali popisy, hoci fotografie a ceny boli pripravené. Výsledok: zlé SEO, prudko klesajúce miery konverzie a tím odkladajúci spustenie.
Umelá inteligencia je tu užitočná na vytvorenie uceleného, štruktúrovaného a na zisk orientovaného prvého návrhu z údajov, ktoré sú už k dispozícii. WordPress : názov, kategórie, atribúty, značka, rozmery, materiál atď. Cieľom nie je slepá automatizácia, ale skrátenie času písania pre každý produkt a zároveň zachovanie redakčnej kontroly.
Nakoniec budete vedieť, ako implementovať:
- Tlačidlo „Generovať pomocou AI“ v editore produktov (administrátor WooCommerce).
- Volanie rozhrania API umelej inteligencie prostredníctvom
wp_remote_post()(sans SDK) s časovým limitom a spracovaním chýb. - Jedna vyrovnávacia pamäť na prechodný jav, aby sa predišlo opätovnému plateniu za tú istú generáciu.
- Bezpečná aktualizácia dlhý popis et krátky popis (výňatok) z produktu.
- Jednoduchý systém obmedzovania sadzieb, aby sa predišlo prudkým nárastom (a prekvapivým faktúram).
Rýchle zhrnutie
- Pridáme meta box WooCommerce s tlačidlom, ktoré spúšťa požiadavku AJAX administrátora.
- Server zostaví výzvu z údajov o produkte (atribúty, kategórie atď.).
- Hovor s umelou inteligenciou
wp_remote_post(), krátky časový limit, obmedzený počet opakovaní, zaznamenané chyby. - Vyčistená odpoveď s
wp_kses_post()pred vložením dopost_contentetpost_excerpt. - Ukladá sa do vyrovnávacej pamäte cez rozhranie Transients API, aby sa predišlo regenerácii, ak sa nič nezmenilo.
- Kľúč API uložený v
wp-config.php(nikdy napevno naprogramované, nikdy na strane JS).
Kedy na to použiť umelú inteligenciu
Použite umelú inteligenciu, keď máte značný objem údajov, spoľahlivú dátovú štruktúru a potrebujete konzistentnosť. Typicky:
- Obchody s viacerými predajcami kde záznamy prichádzajú vo forme surových dát (CSV, ERP) s malým množstvom textu.
- Katalógy s variáciami (veľkosť/farba), kde chcete jednotné popisy a rozdiely spravované atribútmi.
- „Základná“ SEO stratégia vytvoriť čistý, čitateľný text so stabilnou štruktúrou (odseky, zoznamy) a potom spresniť strategické produkty.
- Internacionalizácia (pokročilý variant): vygenerovať EN/DE/ES verziu z FR bázy s ľudskou validáciou.
V reálnych scenároch funguje dobre generovanie produktu hneď po jeho vytvorení a jeho regenerácia iba v prípade zmeny určitých polí (atribúty, kategória, značka). Ukladanie do vyrovnávacej pamäte na základe „odtlačku prsta“ produktu veľmi pomáha.
Kedy NEPOUŽÍVAŤ AI
Vyhnite sa umelej inteligencii, ak je tradičné riešenie robustnejšie alebo menej rizikové:
- Prísne právne popisy (kozmetika, doplnky výživy, medicína): riziko halucinácií je reálne. Uprednostňujte šablóny PHP s poľami/atribútmi ACF alebo legálne overenú databázu.
- Vysoko technické produkty kde aj najmenšia chyba generuje výnosy za zákaznícky servis (kompatibilita, štandardy). Umelú inteligenciu môžete stále používať, ale iba na uzamknutom výzve s povinným overením.
- Stránky s veľmi prísnymi cenovými obmedzeniami Ak máte 20 000 produktov a často ich regenerujete, náklady na API sa rýchlo zvýšia, ak nepoužívate ukladanie do vyrovnávacej pamäte a dávkové spracovanie.
- Keď sú vaše zdrojové údaje zlé (Nekonzistentné názvy, prázdne atribúty). UI si „vymyslí“, ako vyplniť medzery. V tomto prípade začnite vyčistením katalógu.
Bežným anti-vzorom je spúšťanie generovania pri každom automatickom ukladaní. Nakoniec máte desiatky volaní API pre jeden produkt, pretože Gutenberg automaticky ukladá, WooCommerce aktualizuje meta tagy a váš hook sa spúšťa kaskádovito.
predpoklady
Do apríla 2026 sa zamerajte aspoň na:
- WordPress 6.9.4 (váš kontext) a PHP 8.1 +.
- WooCommerce Aktuálne (verejnosť 2026). Kód uvedený nižšie sa spolieha na stabilné rozhrania WordPress API, nie na krehké interné prvky WooCommerce.
- Prístup k
wp-config.php(alebo premenné prostredia) na uloženie kľúča API.
Uložte kľúč API (wp-config.php)
Pridajte toto k wp-config.php (ideálne prostredníctvom správy tajomstiev vášho poskytovateľa hostingu, ale konštanta zostáva dobrým základom).
/**
* Clé API OpenAI (exemple).
* Ne la commitez jamais dans Git. Ne la mettez jamais dans un plugin.
*/
define('BPCAB_OPENAI_API_KEY', 'sk-proj-...');
Ak uprednostňujete premenné prostredia, môžete urobiť nasledovné:
define('BPCAB_OPENAI_API_KEY', getenv('BPCAB_OPENAI_API_KEY') ?: '');
Užitočné oficiálne referencie
- wp_remote_post() (Zdroje pre vývojárov WordPressu)
- Jednoduché výrazy (WordPress)
- wp_kses_post() (Vyčistenie HTML)
- Prechodné javy API
- JSON v PHP (php.net)
Architektúra riešenia
Tok (textová schéma):
Správa produktu (tlačidlo Generovať) → Správa AJAX (nonce + funkcie) → načítanie údajov o produkte → výpočet hashu → prechodná vyrovnávacia pamäť? → inak wp_remote_post() → AI API → parsovanie JSON → sanitácia (
wp_kses_post()) → aktualizácia produktu (obsah + úryvok) → JSON vrátený administrátorovi
Čo sa deje v zákulisí
- Správca používateľského rozhrania : meta box s tlačidlom + voliteľné pole „poznámky“. JS nikdy nemá kľúč API.
- Koncový bod AJAX : zabezpečené jednorazovým číslom +
current_user_can('edit_product', $product_id). - prompt : postavené zo spoľahlivých prvkov (atribúty WooCommerce, kategórie, značky, ceny, ak chcete).
- Cache : prechodné na základe hashu dát. Ak sa nič nezmenilo, vráti sa už vygenerovaný popis.
- sanitácia Umelá inteligencia dokáže vrátiť HTML. Povolené je iba to, čo WordPress povoľuje v príspevku.
wp_kses_post().
Kompletný kód – krok za krokom
Radím ti, aby si išiel na mu-zapojiť Ak chcete zabrániť zlyhaniu doplnku podradenej témy alebo úryvku počas aktualizácie, vytvorte: wp-content/mu-plugins/bpcab-ai-woo-descriptions.php.
1) Uložte meta box v administrácii produktu
Používame obrazovku productTento meta box zostáva kompatibilný bez ohľadu na váš front-end builder (Divi/Elementor/Avada), pretože sa robí v administrátorskej časti WooCommerce.
<?php
/**
* Plugin Name: BPCAB - IA descriptions produits WooCommerce
* Description: Génère des descriptions produits via IA depuis l'admin WooCommerce (WP 6.9.4+, PHP 8.1+).
* Version: 1.0.0
*/
if (!defined('ABSPATH')) {
exit;
}
add_action('add_meta_boxes', function () {
add_meta_box(
'bpcab_ai_product_desc',
'Descriptions IA',
'bpcab_render_ai_metabox',
'product',
'side',
'high'
);
});
function bpcab_render_ai_metabox(WP_Post $post): void {
$product_id = (int) $post->ID;
if (!current_user_can('edit_product', $product_id)) {
echo '<p>Vous n’avez pas les droits pour modifier ce produit.</p>';
return;
}
wp_nonce_field('bpcab_ai_generate_desc', 'bpcab_ai_nonce');
echo '<p>
<label for="bpcab_ai_notes"><strong>Notes internes (optionnel)</strong></label>
<textarea id="bpcab_ai_notes" style="width:100%;min-height:70px;" placeholder="Ex: ton premium, mentionner la garantie 2 ans, éviter les superlatifs..."></textarea>
</p>';
echo '<p>
<button type="button" class="button button-primary" id="bpcab-ai-generate" data-product-id="' . esc_attr((string) $product_id) . '">
Générer avec IA
</button>
</p>';
echo '<div id="bpcab-ai-status" style="margin-top:8px;"></div>';
}
2) Načítajte JS skript iba na obrazovke produktu
Často sa stretávam s chybou, že skript zaraďujem do frontu všade v administrátorskom paneli. To zbytočne spomaľuje prácu a môže spôsobiť konflikty s inými pluginmi.
add_action('admin_enqueue_scripts', function (string $hook_suffix) {
// Écrans typiques : post.php (édition), post-new.php (création)
if (!in_array($hook_suffix, ['post.php', 'post-new.php'], true)) {
return;
}
$screen = get_current_screen();
if (!$screen || $screen->post_type !== 'product') {
return;
}
wp_enqueue_script(
'bpcab-ai-woo-admin',
plugins_url('bpcab-ai-woo-admin.js', __FILE__),
['jquery'],
'1.0.0',
true
);
wp_localize_script('bpcab-ai-woo-admin', 'BPCAB_AI', [
'ajaxUrl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('bpcab_ai_generate_desc'),
]);
});
Ďalej vytvorte súbor wp-content/mu-plugins/bpcab-ai-woo-admin.jsÁno, mu-plugin dokáže načítať samostatný JS súbor, pokiaľ je cesta správna. Ak to vaša infraštruktúra blokuje, vložte JS do bežného pluginu (často je to jednoduchšie).
(function ($) {
function setStatus(html) {
$('#bpcab-ai-status').html(html);
}
$(document).on('click', '#bpcab-ai-generate', function () {
var productId = $(this).data('product-id');
var notes = $('#bpcab_ai_notes').val() || '';
setStatus('<p>Génération en cours… (ne fermez pas cet onglet)</p>');
$.ajax({
url: BPCAB_AI.ajaxUrl,
method: 'POST',
dataType: 'json',
data: {
action: 'bpcab_ai_generate_product_desc',
nonce: BPCAB_AI.nonce,
product_id: productId,
notes: notes
}
})
.done(function (resp) {
if (!resp || !resp.success) {
var msg = (resp && resp.data && resp.data.message) ? resp.data.message : 'Erreur inconnue.';
setStatus('<p style="color:#b32d2e;"><strong>Échec:</strong> ' + msg + '</p>');
return;
}
setStatus(
'<p style="color:#1e7e34;"><strong>OK:</strong> Descriptions mises à jour.</p>' +
'<p>Astuce: cliquez sur “Mettre à jour” pour déclencher les hooks habituels de votre stack (cache, SEO, etc.).</p>'
);
})
.fail(function (xhr) {
setStatus('<p style="color:#b32d2e;"><strong>Erreur AJAX:</strong> vérifiez la console et vos logs PHP.</p>');
});
});
})(jQuery);
3) Vytvorenie koncového bodu AJAX (zabezpečenie + validácia)
Kontrolujeme nonce, povolenia a ID produktu. A zabránime volaniam, ak nie je nakonfigurovaný kľúč API.
add_action('wp_ajax_bpcab_ai_generate_product_desc', function () {
// Vérification nonce
$nonce = isset($_POST['nonce']) ? sanitize_text_field((string) $_POST['nonce']) : '';
if (!wp_verify_nonce($nonce, 'bpcab_ai_generate_desc')) {
wp_send_json_error(['message' => 'Nonce invalide. Rechargez la page produit.'], 403);
}
$product_id = isset($_POST['product_id']) ? (int) $_POST['product_id'] : 0;
if ($product_id <= 0) {
wp_send_json_error(['message' => 'ID produit invalide.'], 400);
}
if (!current_user_can('edit_product', $product_id)) {
wp_send_json_error(['message' => 'Droits insuffisants.'], 403);
}
if (!defined('BPCAB_OPENAI_API_KEY') || !BPCAB_OPENAI_API_KEY) {
wp_send_json_error(['message' => 'Clé API manquante. Définissez BPCAB_OPENAI_API_KEY dans wp-config.php.'], 500);
}
$notes = isset($_POST['notes']) ? wp_kses_post((string) $_POST['notes']) : '';
$result = bpcab_ai_generate_and_update_product($product_id, $notes);
if (is_wp_error($result)) {
wp_send_json_error([
'message' => $result->get_error_message(),
'code' => $result->get_error_code(),
], 500);
}
wp_send_json_success(['updated' => true]);
});
4) Získajte údaje o produkte a vytvorte výzvu
Ak je k dispozícii, používame WooCommerce; inak vrátime jasnú chybu. Nezamieňajte si to s hookom. save_post Pokiaľ ste nestabilizovali tok: AJAX je predvídateľnejší.
function bpcab_ai_generate_and_update_product(int $product_id, string $notes = '') {
if (!function_exists('wc_get_product')) {
return new WP_Error('woocommerce_missing', 'WooCommerce ne semble pas actif.');
}
$product = wc_get_product($product_id);
if (!$product) {
return new WP_Error('product_missing', 'Produit introuvable.');
}
// Rate limiting basique (par produit + utilisateur) pour éviter les rafales.
$user_id = get_current_user_id();
$rl_key = 'bpcab_ai_rl_' . $user_id . '_' . $product_id;
if (get_transient($rl_key)) {
return new WP_Error('rate_limited', 'Vous générez trop vite. Attendez 30 secondes et réessayez.');
}
set_transient($rl_key, 1, 30);
$payload = bpcab_build_product_payload_for_prompt($product);
// Empreinte: si les données n'ont pas changé, on peut servir depuis cache.
$fingerprint = hash('sha256', wp_json_encode([
'payload' => $payload,
'notes' => $notes,
'v' => '1.0.0', // incrémentez si vous changez la logique de prompt
]));
$cache_key = 'bpcab_ai_desc_' . $product_id . '_' . substr($fingerprint, 0, 12);
$cached = get_transient($cache_key);
if (is_array($cached) && isset($cached['long'], $cached['short'])) {
return bpcab_update_product_descriptions($product_id, $cached['long'], $cached['short']);
}
$prompt = bpcab_build_prompt($payload, $notes);
$ai = bpcab_call_openai_responses_api($prompt);
if (is_wp_error($ai)) {
return $ai;
}
// Sanitation: on autorise un HTML "post" standard, pas de scripts, pas d'iframes.
$long = wp_kses_post($ai['long'] ?? '');
$short = wp_kses_post($ai['short'] ?? '');
// Fallback si l'IA renvoie vide (ça arrive avec des prompts trop stricts).
if (mb_strlen(wp_strip_all_tags($long)) < 80) {
return new WP_Error('ai_empty', 'La réponse IA est trop courte ou vide. Vérifiez vos données produit et le prompt.');
}
if (mb_strlen(wp_strip_all_tags($short)) < 30) {
$short = wp_trim_words(wp_strip_all_tags($long), 35, '…');
}
// Cache 30 jours (vous pouvez réduire si votre catalogue change souvent).
set_transient($cache_key, ['long' => $long, 'short' => $short], 30 * DAY_IN_SECONDS);
return bpcab_update_product_descriptions($product_id, $long, $short);
}
function bpcab_build_product_payload_for_prompt(WC_Product $product): array {
$product_id = $product->get_id();
$cats = wp_get_post_terms($product_id, 'product_cat', ['fields' => 'names']);
$tags = wp_get_post_terms($product_id, 'product_tag', ['fields' => 'names']);
// Attributs WooCommerce (pa_*) et attributs custom.
$attributes_out = [];
foreach ($product->get_attributes() as $attr) {
if ($attr->is_taxonomy()) {
$taxonomy = $attr->get_name();
$label = wc_attribute_label($taxonomy);
$terms = wp_get_post_terms($product_id, $taxonomy, ['fields' => 'names']);
$attributes_out[] = [
'label' => $label,
'values' => array_values(array_filter(array_map('sanitize_text_field', $terms))),
];
} else {
$attributes_out[] = [
'label' => sanitize_text_field($attr->get_name()),
'values' => array_values(array_filter(array_map('sanitize_text_field', $attr->get_options()))),
];
}
}
$sku = (string) $product->get_sku();
$price = $product->get_price();
$regular = $product->get_regular_price();
$sale = $product->get_sale_price();
return [
'title' => sanitize_text_field($product->get_name()),
'sku' => sanitize_text_field($sku),
'categories' => array_values(array_filter(array_map('sanitize_text_field', (array) $cats))),
'tags' => array_values(array_filter(array_map('sanitize_text_field', (array) $tags))),
'attributes' => $attributes_out,
'price' => $price !== '' ? (string) $price : '',
'regular_price' => $regular !== '' ? (string) $regular : '',
'sale_price' => $sale !== '' ? (string) $sale : '',
'short_description_existing' => wp_strip_all_tags((string) $product->get_short_description()),
'description_existing' => wp_strip_all_tags((string) $product->get_description()),
];
}
function bpcab_build_prompt(array $payload, string $notes = ''): string {
$attrs_lines = [];
foreach (($payload['attributes'] ?? []) as $attr) {
$label = $attr['label'] ?? '';
$values = $attr['values'] ?? [];
if (!$label || empty($values)) {
continue;
}
$attrs_lines[] = '- ' . $label . ' : ' . implode(', ', $values);
}
$notes_clean = trim(wp_strip_all_tags($notes));
// Prompt orienté e-commerce: bénéfices, usage, contraintes, pas de promesses non vérifiées.
$prompt = "Vous êtes un rédacteur e-commerce senior. Rédigez pour WooCommerce une description produit en FR.nn";
$prompt .= "Règles STRICTES:n";
$prompt .= "1) N'inventez aucune caractéristique non fournie.n";
$prompt .= "2) Pas de superlatifs gratuits ("le meilleur", "incroyable").n";
$prompt .= "3) Style clair, concret, orienté bénéfices et usages.n";
$prompt .= "4) HTML autorisé: <p>, <ul>, <li>, <strong>, <em>. Pas de titres H1/H2.n";
$prompt .= "5) Retournez STRICTEMENT un JSON valide avec les clés: long_html, short_html.nn";
$prompt .= "Données produit:n";
$prompt .= "- Titre: " . ($payload['title'] ?? '') . "n";
if (!empty($payload['sku'])) {
$prompt .= "- SKU: " . $payload['sku'] . "n";
}
if (!empty($payload['categories'])) {
$prompt .= "- Catégories: " . implode(', ', (array) $payload['categories']) . "n";
}
if (!empty($payload['tags'])) {
$prompt .= "- Tags: " . implode(', ', (array) $payload['tags']) . "n";
}
if (!empty($attrs_lines)) {
$prompt .= "- Attributs:n" . implode("n", $attrs_lines) . "n";
}
// Le prix est optionnel: utile si vous voulez positionnement "entrée de gamme/premium".
if (!empty($payload['price'])) {
$prompt .= "- Prix actuel (indicatif): " . $payload['price'] . "n";
}
if ($notes_clean !== '') {
$prompt .= "nNotes internes:n" . $notes_clean . "n";
}
// Si une description existe déjà, on peut demander une amélioration plutôt qu'une réécriture totale.
$existing = trim((string) ($payload['description_existing'] ?? ''));
if ($existing !== '' && mb_strlen($existing) > 80) {
$prompt .= "nTexte existant (à améliorer sans changer le sens):n" . $existing . "n";
}
$prompt .= "nFormat attendu (exemple):n";
$prompt .= "{"long_html":"<p>...</p>","short_html":"<p>...</p>"}n";
return $prompt;
}
5) Zavolajte AI API pomocou wp_remote_post()
Príklad s OpenAI „Responses“ API. Ak použijete iného poskytovateľa (Anthropic, Mistral, Google), štruktúra sa zmení, ale princípy zostávajú rovnaké: časový limit, spracovanie chýb, striktné parsovanie.
V prompte vynútim odpoveď JSON a potom ju analyzujem na strane servera. Tým sa zabráni 80 % „podrobných“ odpovedí, ktoré prerušia vkladanie.
function bpcab_call_openai_responses_api(string $prompt) {
$endpoint = 'https://api.openai.com/v1/responses';
$body = [
// Modèle: choisissez un modèle "mini" pour réduire les coûts si la qualité vous suffit.
// Adaptez selon votre compte et les modèles disponibles.
'model' => 'gpt-4.1-mini',
'input' => [
[
'role' => 'user',
'content' => [
[
'type' => 'input_text',
'text' => $prompt,
],
],
],
],
// Limite raisonnable: descriptions produit, pas un roman.
'max_output_tokens' => 700,
'temperature' => 0.6,
];
$args = [
'timeout' => 25, // Évitez 60s: en admin, ça se ressent vite.
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . BPCAB_OPENAI_API_KEY,
],
'body' => wp_json_encode($body),
];
$res = wp_remote_post($endpoint, $args);
if (is_wp_error($res)) {
return new WP_Error('http_error', 'Erreur HTTP vers l’API IA: ' . $res->get_error_message());
}
$code = (int) wp_remote_retrieve_response_code($res);
$raw = (string) wp_remote_retrieve_body($res);
if ($code < 200 || $code >= 300) {
// Log minimal (évitez de logger des données sensibles).
error_log('[BPCAB AI] API non-200: ' . $code . ' body=' . substr($raw, 0, 500));
return new WP_Error('api_non_200', 'Réponse IA invalide (HTTP ' . $code . '). Vérifiez votre clé/quota.');
}
$json = json_decode($raw, true);
if (!is_array($json)) {
return new WP_Error('json_decode', 'Réponse IA non JSON (json_decode a échoué).');
}
// Récupération du texte: selon l’API, la sortie peut être structurée.
// On essaie plusieurs chemins connus, puis on échoue proprement.
$text = '';
// Chemin courant: output_text agrégé
if (isset($json['output_text']) && is_string($json['output_text'])) {
$text = $json['output_text'];
}
// Fallback: certaines réponses contiennent output[] avec content[]
if ($text === '' && !empty($json['output']) && is_array($json['output'])) {
foreach ($json['output'] as $item) {
if (!is_array($item) || empty($item['content']) || !is_array($item['content'])) {
continue;
}
foreach ($item['content'] as $c) {
if (is_array($c) && ($c['type'] ?? '') === 'output_text' && isset($c['text'])) {
$text .= (string) $c['text'];
}
}
}
}
$text = trim($text);
if ($text === '') {
error_log('[BPCAB AI] Sortie vide. Raw=' . substr($raw, 0, 500));
return new WP_Error('empty_output', 'L’API IA a renvoyé une sortie vide.');
}
// On attend un JSON strict dans $text
$out = json_decode($text, true);
if (!is_array($out)) {
error_log('[BPCAB AI] JSON attendu mais non parsable. Text=' . substr($text, 0, 500));
return new WP_Error('bad_format', 'Format IA inattendu. Ajustez le prompt (JSON strict).');
}
$long = isset($out['long_html']) ? (string) $out['long_html'] : '';
$short = isset($out['short_html']) ? (string) $out['short_html'] : '';
return [
'long' => $long,
'short' => $short,
];
}
6) Aktualizácia produktu (obsah + úryvok)
Podkladový príspevok WordPressu sa aktualizuje. WooCommerce potom prečíta tieto polia a zobrazí popis. Používam wp_update_post() aby zostali v rámci štandardného pracovného postupu WordPressu (hooky, revízie, ak sú povolené, atď.).
function bpcab_update_product_descriptions(int $product_id, string $long_html, string $short_html) {
$update = [
'ID' => $product_id,
'post_content' => $long_html,
'post_excerpt' => $short_html,
];
$res = wp_update_post(wp_slash($update), true, false);
if (is_wp_error($res)) {
return new WP_Error('update_failed', 'Échec mise à jour produit: ' . $res->get_error_message());
}
// Optionnel: forcer une mise à jour du produit WooCommerce (index, lookup tables, etc.)
if (function_exists('wc_get_product')) {
$product = wc_get_product($product_id);
if ($product) {
$product->save();
}
}
return true;
}
Kompletný zostavený kód
Skopírujte a vložte tento súbor do wp-content/mu-plugins/bpcab-ai-woo-descriptions.phpVytvorte aj JS bpcab-ai-woo-admin.js vedľa neho (uvedené vyššie).
<?php
/**
* Plugin Name: BPCAB - IA descriptions produits WooCommerce
* Description: Génère des descriptions produits via IA depuis l'admin WooCommerce (WP 6.9.4+, PHP 8.1+).
* Version: 1.0.0
*/
if (!defined('ABSPATH')) {
exit;
}
/**
* Meta box sur l'écran produit.
*/
add_action('add_meta_boxes', function () {
add_meta_box(
'bpcab_ai_product_desc',
'Descriptions IA',
'bpcab_render_ai_metabox',
'product',
'side',
'high'
);
});
function bpcab_render_ai_metabox(WP_Post $post): void {
$product_id = (int) $post->ID;
if (!current_user_can('edit_product', $product_id)) {
echo '<p>Vous n’avez pas les droits pour modifier ce produit.</p>';
return;
}
wp_nonce_field('bpcab_ai_generate_desc', 'bpcab_ai_nonce');
echo '<p>
<label for="bpcab_ai_notes"><strong>Notes internes (optionnel)</strong></label>
<textarea id="bpcab_ai_notes" style="width:100%;min-height:70px;" placeholder="Ex: ton premium, mentionner la garantie 2 ans, éviter les superlatifs..."></textarea>
</p>';
echo '<p>
<button type="button" class="button button-primary" id="bpcab-ai-generate" data-product-id="' . esc_attr((string) $product_id) . '">
Générer avec IA
</button>
</p>';
echo '<div id="bpcab-ai-status" style="margin-top:8px;"></div>';
}
/**
* JS admin (uniquement sur l'écran produit).
*/
add_action('admin_enqueue_scripts', function (string $hook_suffix) {
if (!in_array($hook_suffix, ['post.php', 'post-new.php'], true)) {
return;
}
$screen = get_current_screen();
if (!$screen || $screen->post_type !== 'product') {
return;
}
wp_enqueue_script(
'bpcab-ai-woo-admin',
plugins_url('bpcab-ai-woo-admin.js', __FILE__),
['jquery'],
'1.0.0',
true
);
wp_localize_script('bpcab-ai-woo-admin', 'BPCAB_AI', [
'ajaxUrl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('bpcab_ai_generate_desc'),
]);
});
/**
* Endpoint AJAX sécurisé.
*/
add_action('wp_ajax_bpcab_ai_generate_product_desc', function () {
$nonce = isset($_POST['nonce']) ? sanitize_text_field((string) $_POST['nonce']) : '';
if (!wp_verify_nonce($nonce, 'bpcab_ai_generate_desc')) {
wp_send_json_error(['message' => 'Nonce invalide. Rechargez la page produit.'], 403);
}
$product_id = isset($_POST['product_id']) ? (int) $_POST['product_id'] : 0;
if ($product_id <= 0) {
wp_send_json_error(['message' => 'ID produit invalide.'], 400);
}
if (!current_user_can('edit_product', $product_id)) {
wp_send_json_error(['message' => 'Droits insuffisants.'], 403);
}
if (!defined('BPCAB_OPENAI_API_KEY') || !BPCAB_OPENAI_API_KEY) {
wp_send_json_error(['message' => 'Clé API manquante. Définissez BPCAB_OPENAI_API_KEY dans wp-config.php.'], 500);
}
$notes = isset($_POST['notes']) ? wp_kses_post((string) $_POST['notes']) : '';
$result = bpcab_ai_generate_and_update_product($product_id, $notes);
if (is_wp_error($result)) {
wp_send_json_error([
'message' => $result->get_error_message(),
'code' => $result->get_error_code(),
], 500);
}
wp_send_json_success(['updated' => true]);
});
function bpcab_ai_generate_and_update_product(int $product_id, string $notes = '') {
if (!function_exists('wc_get_product')) {
return new WP_Error('woocommerce_missing', 'WooCommerce ne semble pas actif.');
}
$product = wc_get_product($product_id);
if (!$product) {
return new WP_Error('product_missing', 'Produit introuvable.');
}
$user_id = get_current_user_id();
$rl_key = 'bpcab_ai_rl_' . $user_id . '_' . $product_id;
if (get_transient($rl_key)) {
return new WP_Error('rate_limited', 'Vous générez trop vite. Attendez 30 secondes et réessayez.');
}
set_transient($rl_key, 1, 30);
$payload = bpcab_build_product_payload_for_prompt($product);
$fingerprint = hash('sha256', wp_json_encode([
'payload' => $payload,
'notes' => $notes,
'v' => '1.0.0',
]));
$cache_key = 'bpcab_ai_desc_' . $product_id . '_' . substr($fingerprint, 0, 12);
$cached = get_transient($cache_key);
if (is_array($cached) && isset($cached['long'], $cached['short'])) {
return bpcab_update_product_descriptions($product_id, $cached['long'], $cached['short']);
}
$prompt = bpcab_build_prompt($payload, $notes);
$ai = bpcab_call_openai_responses_api($prompt);
if (is_wp_error($ai)) {
return $ai;
}
$long = wp_kses_post($ai['long'] ?? '');
$short = wp_kses_post($ai['short'] ?? '');
if (mb_strlen(wp_strip_all_tags($long)) < 80) {
return new WP_Error('ai_empty', 'La réponse IA est trop courte ou vide. Vérifiez vos données produit et le prompt.');
}
if (mb_strlen(wp_strip_all_tags($short)) < 30) {
$short = wp_trim_words(wp_strip_all_tags($long), 35, '…');
}
set_transient($cache_key, ['long' => $long, 'short' => $short], 30 * DAY_IN_SECONDS);
return bpcab_update_product_descriptions($product_id, $long, $short);
}
function bpcab_build_product_payload_for_prompt(WC_Product $product): array {
$product_id = $product->get_id();
$cats = wp_get_post_terms($product_id, 'product_cat', ['fields' => 'names']);
$tags = wp_get_post_terms($product_id, 'product_tag', ['fields' => 'names']);
$attributes_out = [];
foreach ($product->get_attributes() as $attr) {
if ($attr->is_taxonomy()) {
$taxonomy = $attr->get_name();
$label = wc_attribute_label($taxonomy);
$terms = wp_get_post_terms($product_id, $taxonomy, ['fields' => 'names']);
$attributes_out[] = [
'label' => $label,
'values' => array_values(array_filter(array_map('sanitize_text_field', $terms))),
];
} else {
$attributes_out[] = [
'label' => sanitize_text_field($attr->get_name()),
'values' => array_values(array_filter(array_map('sanitize_text_field', $attr->get_options()))),
];
}
}
$sku = (string) $product->get_sku();
$price = $product->get_price();
$regular = $product->get_regular_price();
$sale = $product->get_sale_price();
return [
'title' => sanitize_text_field($product->get_name()),
'sku' => sanitize_text_field($sku),
'categories' => array_values(array_filter(array_map('sanitize_text_field', (array) $cats))),
'tags' => array_values(array_filter(array_map('sanitize_text_field', (array) $tags))),
'attributes' => $attributes_out,
'price' => $price !== '' ? (string) $price : '',
'regular_price' => $regular !== '' ? (string) $regular : '',
'sale_price' => $sale !== '' ? (string) $sale : '',
'short_description_existing' => wp_strip_all_tags((string) $product->get_short_description()),
'description_existing' => wp_strip_all_tags((string) $product->get_description()),
];
}
function bpcab_build_prompt(array $payload, string $notes = ''): string {
$attrs_lines = [];
foreach (($payload['attributes'] ?? []) as $attr) {
$label = $attr['label'] ?? '';
$values = $attr['values'] ?? [];
if (!$label || empty($values)) {
continue;
}
$attrs_lines[] = '- ' . $label . ' : ' . implode(', ', $values);
}
$notes_clean = trim(wp_strip_all_tags($notes));
$prompt = "Vous êtes un rédacteur e-commerce senior. Rédigez pour WooCommerce une description produit en FR.nn";
$prompt .= "Règles STRICTES:n";
$prompt .= "1) N'inventez aucune caractéristique non fournie.n";
$prompt .= "2) Pas de superlatifs gratuits ("le meilleur", "incroyable").n";
$prompt .= "3) Style clair, concret, orienté bénéfices et usages.n";
$prompt .= "4) HTML autorisé: <p>, <ul>, <li>, <strong>, <em>. Pas de titres H1/H2.n";
$prompt .= "5) Retournez STRICTEMENT un JSON valide avec les clés: long_html, short_html.nn";
$prompt .= "Données produit:n";
$prompt .= "- Titre: " . ($payload['title'] ?? '') . "n";
if (!empty($payload['sku'])) {
$prompt .= "- SKU: " . $payload['sku'] . "n";
}
if (!empty($payload['categories'])) {
$prompt .= "- Catégories: " . implode(', ', (array) $payload['categories']) . "n";
}
if (!empty($payload['tags'])) {
$prompt .= "- Tags: " . implode(', ', (array) $payload['tags']) . "n";
}
if (!empty($attrs_lines)) {
$prompt .= "- Attributs:n" . implode("n", $attrs_lines) . "n";
}
if (!empty($payload['price'])) {
$prompt .= "- Prix actuel (indicatif): " . $payload['price'] . "n";
}
if ($notes_clean !== '') {
$prompt .= "nNotes internes:n" . $notes_clean . "n";
}
$existing = trim((string) ($payload['description_existing'] ?? ''));
if ($existing !== '' && mb_strlen($existing) > 80) {
$prompt .= "nTexte existant (à améliorer sans changer le sens):n" . $existing . "n";
}
$prompt .= "nFormat attendu (exemple):n";
$prompt .= "{"long_html":"<p>...</p>","short_html":"<p>...</p>"}n";
return $prompt;
}
function bpcab_call_openai_responses_api(string $prompt) {
$endpoint = 'https://api.openai.com/v1/responses';
$body = [
'model' => 'gpt-4.1-mini',
'input' => [
[
'role' => 'user',
'content' => [
[
'type' => 'input_text',
'text' => $prompt,
],
],
],
],
'max_output_tokens' => 700,
'temperature' => 0.6,
];
$args = [
'timeout' => 25,
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . BPCAB_OPENAI_API_KEY,
],
'body' => wp_json_encode($body),
];
$res = wp_remote_post($endpoint, $args);
if (is_wp_error($res)) {
return new WP_Error('http_error', 'Erreur HTTP vers l’API IA: ' . $res->get_error_message());
}
$code = (int) wp_remote_retrieve_response_code($res);
$raw = (string) wp_remote_retrieve_body($res);
if ($code < 200 || $code >= 300) {
error_log('[BPCAB AI] API non-200: ' . $code . ' body=' . substr($raw, 0, 500));
return new WP_Error('api_non_200', 'Réponse IA invalide (HTTP ' . $code . '). Vérifiez votre clé/quota.');
}
$json = json_decode($raw, true);
if (!is_array($json)) {
return new WP_Error('json_decode', 'Réponse IA non JSON (json_decode a échoué).');
}
$text = '';
if (isset($json['output_text']) && is_string($json['output_text'])) {
$text = $json['output_text'];
}
if ($text === '' && !empty($json['output']) && is_array($json['output'])) {
foreach ($json['output'] as $item) {
if (!is_array($item) || empty($item['content']) || !is_array($item['content'])) {
continue;
}
foreach ($item['content'] as $c) {
if (is_array($c) && ($c['type'] ?? '') === 'output_text' && isset($c['text'])) {
$text .= (string) $c['text'];
}
}
}
}
$text = trim($text);
if ($text === '') {
error_log('[BPCAB AI] Sortie vide. Raw=' . substr($raw, 0, 500));
return new WP_Error('empty_output', 'L’API IA a renvoyé une sortie vide.');
}
$out = json_decode($text, true);
if (!is_array($out)) {
error_log('[BPCAB AI] JSON attendu mais non parsable. Text=' . substr($text, 0, 500));
return new WP_Error('bad_format', 'Format IA inattendu. Ajustez le prompt (JSON strict).');
}
return [
'long' => isset($out['long_html']) ? (string) $out['long_html'] : '',
'short' => isset($out['short_html']) ? (string) $out['short_html'] : '',
];
}
function bpcab_update_product_descriptions(int $product_id, string $long_html, string $short_html) {
$update = [
'ID' => $product_id,
'post_content' => $long_html,
'post_excerpt' => $short_html,
];
$res = wp_update_post(wp_slash($update), true, false);
if (is_wp_error($res)) {
return new WP_Error('update_failed', 'Échec mise à jour produit: ' . $res->get_error_message());
}
if (function_exists('wc_get_product')) {
$product = wc_get_product($product_id);
if ($product) {
$product->save();
}
}
return true;
}
Vysvetlenie kódu
Prečo tlačidlo (AJAX) a nie automatický hook?
Na WooCommerce je možné produkt uložiť viackrát bez kliknutia na tlačidlo „Aktualizovať“: automatické ukladanie, revízie, meta aktualizácie z iných pluginov, synchronizácia inventára atď. Ak pripojíte umelú inteligenciu save_post_product Bez ochranných opatrení spustíte fantomové volania API.
Tlačidlo vynúti úmyselnú akciu. A to zjednodušuje ladenie: kliknete, uvidíte stav, opravíte to.
Prečo prechodný jav založený na haši?
Jednoduchá vyrovnávacia pamäť „na produkt“ (napr.: bpcab_ai_desc_123Toto je rýchlo zavádzajúce, pretože produkt sa mení. SHA-256 hash dáta + bankovky zaručuje: rovnaké vstupy → rovnaký výstup → žiadne splácanie.
Skutočný okrajový prípad: ak upravíte výzvu (štruktúru, pravidlá), chcete zneplatniť vyrovnávaciu pamäť. Preto malé pole v v haši.
Prečo wp_kses_post() a nie sanitize_text_field()?
sanitize_text_field() ničí HTML. Popis WooCommerce však potrebuje zoznamy, tučný text a odseky. V praxi wp_kses_post() je správny kompromis: HTML povolený pre jeden príspevok, skripty odstránené.
Stále vidím stránky, ktoré vkladajú „surovú“ odpoveď umelej inteligencie do post_contentAk umelá inteligencia vráti podozrivý odkaz alebo nezvyčajný HTML kód, práve ste otvorili zbytočné dvere. Nie je to „automatický“ XSS útok (WordPress už na niektorých miestach filtruje), ale sami si veci komplikujete.
Prečo krátky časový limit?
V administrátorskej oblasti 60-sekundový časový limit blokuje používateľské rozhranie a spôsobuje, že WordPress sa zdá byť zamrznutý. 20 – 30 sekúnd je dobré maximum. Ak máte veľmi zložité produkty, zvážte použitie asynchrónneho generovania (cron/queue) alebo preskúmajte rozšírené možnosti.
Náklady na API a optimalizácia
Cena závisí od modelu a objemu tokenov. Typická stránka produktu (výzva + odpoveď) môže stáť zhruba 800 až 2 000 žetónov v závislosti od počtu atribútov a požadovanej dĺžky. Pri „mini“ modeli máte často veľmi nízke náklady na generáciu, ale vo veľkom meradle je to dôležité.
Jednoduchý odhad (prispôsobí sa vášmu modelu)
- Predpokladajme 1200 tokenov na produkt (vstup + výstup).
- 1000 produktov/mesiac → 1,2 milióna tokenov/mesiac.
- Pri „mini“ modeli je to zvyčajne rozumná cena, ale ak sa regeneruješ (bez ukladania do vyrovnávacej pamäte), rýchlo vynásobíte 3 alebo 10.
Optimalizácie, ktoré skutočne fungujú
- Vyrovnávacia pamäť podľa odtlačku prsta (už zavedené): je to najlepšia návratnosť investícií.
- Obmedzte výstup s
max_output_tokensvyhýba sa dlhým odpovediam. - Menší model Pre hromadné použitie je silnejší model určený len pre prémiové produkty.
- Dávka (pokročilý variant): spracovať 50 produktov v nočnom crone s denným rozpočtom.
- Znížiť výzvu Neposielajte prázdne atribúty ani existujúci popis, ak je prázdny.
Pokročilé varianty a prípady použitia
Možnosť 1: Vygenerujte iba krátky popis (výňatok)
Užitočné, keď je váš dlhý popis už napísaný (alebo poskytnutý výrobcom), ale chcete pre stránky kategórií úryvok, ktorý je priateľský k predaju a konzistentný.
- Upravte výzvu tak, aby sa zobrazovala iba otázka
short_html. - Dans
bpcab_update_product_descriptions()iba aktualizáciapost_excerpt.
Variant 2: Asynchrónne generovanie (bez časových limitov)
Na pomalých serveroch môže externé volanie trvať dlhšie ako 25 sekúnd. V takom prípade spustite odloženú úlohu:
- AJAX: zaregistruje „požiadavku“ (post meta) a okamžite reaguje.
- Úloha cron (WP-Cron alebo cron server) spracováva požiadavky vo fronte, 5 za minútu.
Nedávam sem všetok kód, aby sa dal kopírovať, ale kľúčové je... Nevykonávajte volanie AI v administrátorskej požiadavke ak je vaša infraštruktúra nestabilná.
Variant 3: Kompatibilita s Divi 5 / Elementor / Avada
Generovanie prebieha na strane WooCommerce, takže zostáva kompatibilné. Zaujímavejšie je zobrazenie bloku „odznak“ alebo „Hlavné body“ na stránke produktu prostredníctvom vášho nástroja na tvorbu.
- Divi 5 Môžete vytvoriť modul, ktorý číta
post_excerptalebo metapole „silné stránky“ generované umelou inteligenciou. Ak zostanete napost_content/post_excerptDivi nemá nič špeciálne na práci. - Elementor Použite widget „Stručný popis produktu“ a zobrazí sa automaticky Aktualizovaný úryvok.
- Avada Komponent WooCommerce „Obsah produktu“ / „Výňatok produktu“ odráža tieto polia bez úprav.
Tip, ktorý často používam: požiadajte umelú inteligenciu o zoznam <ul> Do dlhého popisu zahrňte výhody a potom tento zoznam upravte pomocou témy/nástroja na tvorbu. Získate tak vizuálnu konzistenciu bez akéhokoľvek dodatočného kódovania.
Bezpečnosť a osvedčené postupy
Nikdy nezverejňujte kľúč API na strane klienta
Práve volá správca JS admin-ajax.phpKľúč zostáva v wp-config.phpAk vložíte kľúč do skriptu, dokonca aj v administrátorskom paneli, nakoniec sa niekde skopíruje (vyrovnávacia pamäť, rozšírenia prehliadača, proxy).
Overiť a obmedziť
- Možnosti :
edit_productminimum. Nedovoľte, aby nekontrolovaná rola „shop_manager“ spustila 10 000 generácií. - nonce : už je zavedené, aby sa zabránilo požiadavkám CSRF.
- Obmedzenie sadzby 30-sekundový prechodný jav na používateľa+produkt. Ak chcete ísť ďalej, pridajte kvótu na deň („počítadlo prechodných javov“).
Sanitizujte reakciu umelej inteligencie
wp_kses_post() je minimum. Ak chcete byť prísnejší, môžete odovzdať zoznam povolených značiek do wp_kses() a odmietnuť akékoľvek externé odkazy.
GDPR / odoslané údaje
Neposielajte osobné údaje (meno zákazníka, adresa atď.). V tomto prípade posielame iba údaje o produktoch. Ak plánujete prispôsobiť popisy pre používateľa, vstupujete do citlivejšieho kontextu GDPR (právny základ, subdodávateľ, DPA atď.).
Realistické chyby, ktorým sa treba vyhnúť
- Kopírovanie kódu na nesprávne miesto úryvok vložený do
functions.phpNadradená téma sa v ďalšej aktualizácii stratí. - Zabudnite na bodkočiarku : jedna chyba PHP → biela obrazovka v administrácii. Test na staging.
- Nevhodný háčik spúšť zapnutá
initousave_postbez záruk → neúmyselné volania umelej inteligencie. - Testovanie v produkcii bez zálohy Existujúce popisy môžete hromadne prepísať.
- PHP je príliš staré Niektoré z vyššie uvedených syntaxí/typov predpokladajú PHP 8.1+. Vo verzii 7.4 to nefunguje.
Ako testovať a ladiť
1) Správne povoľte protokolovanie
Dans wp-config.php (na pracovisku), aktivujte:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Potom si prečítate wp-content/debug.logOficiálna dokumentácia: Ladenie vo WordPress.
2) Najprv otestujte na „jednoduchom“ produkte
- Jasný názov
- Vyplnené 2–3 atribúty
- Kategória A
Ak to funguje, prejdite na variabilný produkt s mnohými atribútmi. Príliš dlhé výzvy zvyšujú riziko nekompatibilného (alebo skráteného) výstupu.
3) Skontrolujte požiadavku AJAX
- Otvorte prehliadač DevTools → Sieť →
admin-ajax.php. - Pozrite sa na HTTP kód (200/403/500) a vrátený JSON.
4) Skontrolujte odpoveď API
Ak máte chyby vo formáte JSON, zaznamenávajte iba úryvky (už hotové s substr()). Nezaznamenávajte celú výzvu, ak do nej vkladáte citlivé informácie.
Ak to nefunguje
Tu je diagnostický graf, ktorý skutočne používam pri riešení problémov s týmto typom integrácie.
| symptóm | Príčina pravdepodobná | overenie | Riešenie |
|---|---|---|---|
| Tlačidlo „Generovať“ nerobí nič. | JS sa nenačítal na obrazovke produktu | Konzola/sieť DevTools, absencia bpcab-ai-woo-admin.js |
check admin_enqueue_scriptscesta plugins_url()a že súbor JS existuje |
| Chyba 403 „Neplatný nonce“ | Oznámenie nebolo odoslané alebo je stránka príliš stará | Sieť → POST dáta obsahujú nonce ? |
Znovu načítajte stránku produktu, skontrolujte wp_localize_script a činnosť nuncia |
| Chyba 500 „Chýbajúci kľúč API“ | Konštantne chýba / prázdny | check wp-config.php a životné prostredie |
Definujte BPCAB_OPENAI_API_KEYv prípade potreby vymazať opcache |
| HTTP 401/403 na strane AI API | Neplatný kľúč, neoprávnený projekt | Záznamy: „API non-200“ + kód | Obnoviť kľúč, skontrolovať povolenia projektu na strane poskytovateľa |
| HTTP 429 | Prekročená kvóta / limit sadzby dodávateľa | Záznamy + dashboard dodávateľa | Pridajte funkciu odloženia/opakovania, znížte frekvenciu hodín, povoľte ukladanie do vyrovnávacej pamäte a použite ľahší model. |
| „Neočakávaný formát umelej inteligencie“ | AI vracia text, ktorý nie je JSON | Čiastočný protokol výstupu | Sprísnite výzvu, znížte jej úroveň temperatureSkráťte požadovanú dĺžku |
| Popisy rozdrvené „náhodne“ | Test v produkčnom prostredí + viacero kliknutí + automatické ukladanie | História revízií / protokoly | Práca na príprave, pridanie dlhšieho zámku (prechodného), vyžadovanie potvrdenia |
Dve bežné nástrahy
- Úryvok poškodený doplnkom pre úryvky Ak používate plugin typu „Úryvky kódu“, chyba pri analýze môže úryvok kódu deaktivovať, čím sa administrátorské rozhranie dostane do nestabilného stavu. Pre tento typ kódu je stabilnejší plugin mu-plugin.
- Skrytý konflikt Niektoré lokality majú agresívnu trvalú vyrovnávaciu pamäť objektov. Prechodné javy sa môžu zdieľať medzi prostrediami, ak sú nesprávne nakonfigurované. Ak vidíte popisy, ktoré sa nezhodujú, začnite dočasným vypnutím vyrovnávacej pamäte objektov v testovacom prostredí.
zdroje
- WordPress: wp_remote_post()
- WordPress: API prechodných javov
- WordPress: wp_kses_post()
- WordPress: Jednorazové pokusy
- Zdrojový kód WordPressu (zrkadlo GitHubu)
- WordPress Core Trac
- OpenAI: Odpovede API (referencia)
- PHP: json_decode()
- WooCommerce na WordPress.org
Často kladené otázky
Funguje to s variabilnými produktmi (variáciami)?
Áno, ale vyššie uvedený kód generuje popis materský produktAk chcete pre každú variáciu zobraziť text, musíte prechádzať variáciami a ukladať ich do vyhradených metaznačiek (a prispôsobiť zobrazenie). Robím to zriedka: je to nákladné a z hľadiska SEO často zbytočné.
Môžem zabrániť umelej inteligencii, aby spomenula cenu?
Áno: odstrániť pole price užitočného zaťaženia a zodpovedajúceho riadku v príkazovom riadku. Odporúčam neuvádzať ceny, ak často prevádzkujete propagačné akcie, inak budete mať zastaraný text.
Prečo požadovať výstup JSON namiesto jednoduchého HTML?
Pretože chcete dve polia (dlhé + krátke) a robustné parsovanie. JSON znižuje prípady, kedy umelá inteligencia pridáva vety mimo formátu. A keď sa pokazí, okamžite to uvidíte (chyba „bad_format“).
Môžem namiesto toho použiť Anthropic, Mistral alebo Google?
Áno. Zachovať rovnakú architektúru (AJAX admin → wp_remote_post() → analyzovať → wp_kses_post() → aktualizácia). Zmení sa iba koncový bod a formát JSON. Ak mi poskytnete presného poskytovateľa, môžem vám poskytnúť funkciu bpcab_call_* ekvivalent.
Existuje riziko, že sa tým vytvorí duplicitný obsah?
Ak sú si vaše produkty veľmi podobné (rovnaké atribúty, takmer identické názvy), umelá inteligencia môže vytvoriť podobné texty. Ak to chcete obmedziť, pridajte do výzvy obmedzenie „rozlišovať podľa použitia“ a vložte jedinečný prvok (značka, materiál, hlavná výhoda). Pri homogénnych katalógoch je však určitá podobnosť nevyhnutná.
Ako môžeme zabrániť umelej inteligencii vo vymýšľaní funkcií?
Nikdy sa tomu úplne nevyhnete. Riziko výrazne znížite tým, že:
- Výslovný zákaz vynálezu (už vykonaný).
- Zníženie
temperature(-0.3 0.6). - Poskytovanie iba štruktúrovaných údajov (atribútov) a vyhýbanie sa nejednoznačným „poznámkam“.
Zobrazuje sa mi chyba „Neočakávaný formát AI“. Čo mám urobiť ako prvé?
Znížte zložitosť: menej atribútov, max_output_tokens vyššie (ak sa skracuje) a ešte prísnejšiu výzvu („Vrátiť iba JSON, žiadny text pred/za“). Podľa mojej skúsenosti je to v 9 z 10 prípadov iba výstup, ktorý nie je vo formáte JSON.
Prečo sa na tlačidle zobrazuje „OK“, ale na prednej strane nič nevidím?
Často ide o vyrovnávaciu pamäť stránok (alebo vyrovnávaciu pamäť objektov), ktorá zobrazuje staršiu verziu. Vymažte vyrovnávaciu pamäť a skontrolujte, či sa vaša téma zobrazuje správne. the_content() a štandardný úryvok kódu WooCommerce. Pri Elementore/Avada/Divi sa uistite, že namiesto toho nezobrazujete vlastné pole.
Môžem si zobraziť ukážku popisu predtým, ako bude prepísaný?
Áno: namiesto volania wp_update_post(), poslať späť long_html et short_html V odpovedi AJAX ich zobrazte v modálnom okne a potom pridajte druhé tlačidlo „Použiť“. Toto je verzia, ktorú nasadzujem v obchodoch, kde upravuje viacero ľudí.
Mohlo by ich generovanie narušiť moje SEO?
Ak publikujete 500 vygenerovaných produktových listov bez korektúry, riskujete kvalitu (a teda aj svoje SEO). Zdravý pracovný postup je: generovanie pomocou umelej inteligencie → overenie človekom → publikovanie. A pri strategických produktoch ich skutočne prepíšete.