Plugin WordPress rédaction de contenu
Pour générer 50 articles, personne ne veut cliquer 50 fois. Le plugin inclut un système de queue :
- ajout de mots-clés en batch
- traitement séquentiel (respect des rate limits API)
- statuts par article (pending → processing → completed/failed)
- reprise après interruption
La table custom {prefix}_scg_queue stocke l'état de chaque tâche.
Ce que j'ai appris en construisant ça
Prompt engineering, c'est 80% du travail. Le code est simple. Faire en sorte que l'IA produise un output exploitable et constant, c'est autre chose. J'ai itéré des dizaines de fois sur les prompts avant d'avoir un résultat stable.
Les APIs IA sont fragiles. Timeout, rate limit, formats de réponse qui changent... Il faut tout anticiper. Un plugin "production-ready" passe plus de temps à gérer les erreurs qu'à faire le travail nominal.
WordPress a ses patterns. Hooks, filters, options API, AJAX admin... Une fois qu'on les maîtrise, c'est puissant. Avant ça, c'est le chaos.
Résultats concrets
- Temps de production d'un article : 2h → 5 minutes
- Coût par article : ~0.15€ (Claude Sonnet) à ~0.80€ (Claude Opus) + 0.15€ (Semrank)
Pour mes petits sites de vente de liensil fait le job et ça rank !
L'intégration Semrank (la vraie valeur ajoutée)
Le plugin peut fonctionner en mode "IA seule", mais sa force c'est le mode Semrank.
L'API Semrank fournit des données fraîches :
- intention de recherche détectée
- mots-clés must-have et secondaires
- questions PAA (People Also Ask)
- analyse des 10 premiers résultats Google (titres, word count, structure Hn)
Ces données sont injectées directement dans le prompt Architecte. L'IA ne devine plus, elle s'appuie sur la réalité de la SERP.
Architecture technique
Stack utilisée
- PHP 7.4+ (compatible 8.x)
- WordPress 5.8+
- APIs : Claude (Anthropic), Gemini (Google), OpenAI, Semrank
Structure du plugin
seo-content-generator/
├── seo-content-generator.php → Bootstrap + classe principale (Singleton)
├── includes/
│ ├── class-settings.php → Gestion des options + chiffrement
│ ├── class-generator.php → Orchestration du workflow
│ ├── class-claude-api.php → Client API Claude
│ ├── class-gemini-api.php → Client API Gemini
│ ├── class-openai-api.php → Client API OpenAI
│ ├── class-semrank-api.php → Client API Semrank
│ ├── class-queue.php → File d'attente (génération en masse)
│ ├── class-ajax.php → Endpoints AJAX admin
│ ├── class-schema.php → Génération FAQ Schema JSON-LD
│ └── class-admin.php → Interface d'administration
├── templates/ → Vues admin
└── assets/ → CSS/JSLes points techniques dont je suis fier
1. Chiffrement des clés API (AES-256-GCM)
Les clés API ne sont jamais stockées en clair. J'utilise libsodium (natif PHP 7.2+) avec un fallback OpenSSL :
// Nonce unique par chiffrement + clé dérivée des constantes WordPress
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = sodium_crypto_secretbox($key, $nonce, $encryption_key);La clé de chiffrement est dérivée des AUTH_KEY, SECURE_AUTH_KEY + un secret propre au plugin. Même avec un accès BDD, les clés sont inexploitables.
2. Retry automatique intelligent
Les APIs IA sont capricieuses. Rate limit (429), surcharge (529)... Le plugin gère ça automatiquement :
// Délai exponentiel : 15s → 30s → 60s
$wait_time = $base_wait * pow(2, $retry_count);
sleep($wait_time);
return $this->generate_content($prompt, $model, $retry_count + 1);3 tentatives avant abandon. L'utilisateur ne voit rien, ça "just works".
3. Parser Markdown → HTML robuste
L'IA renvoie du Markdown. WordPress attend du HTML. J'ai construit un parser qui gère :
- headers (H1-H6)
- listes à puces et numérotées
- tableaux Markdown (transformés en
<table>propres) - blockquotes
- gras/italique imbriqués
Le tout avec échappement XSS : le HTML dangereux est neutralisé avant conversion.
4. Extraction intelligente des métadonnées
L'IA ne renvoie pas toujours le format demandé. J'ai implémenté un parser multi-format qui détecte :
Format A : ===METADATA=== / ===CONTENT===
Format B : A. BALISE TITLE / B. META DESCRIPTION...
Format C : **BALISE TITLE:** valeurSi un format échoue, le suivant prend le relais. Taux de parsing réussi : ~98%.
5. Compatibilité plugins SEO
Les métadonnées sont automatiquement injectées dans :
- Yoast SEO (
_yoast_wpseo_title,_yoast_wpseo_metadesc) - Rank Math (
rank_math_title,rank_math_description) - All in One SEO (
_aioseo_description)
Pas de configuration, ça détecte et s'adapte.
Sécurité — ce que j'ai mis en place
| Risque | Protection |
|---|---|
| Injection SQL | Requêtes préparées via $wpdb->prepare() |
| XSS | sanitize_text_field(), wp_kses_post(), échappement HTML |
| CSRF | Nonces WordPress sur tous les endpoints AJAX |
| Clés API exposées | Chiffrement AES-256-GCM + dérivation de clé |
| Modes/statuts invalides | Validation whitelist stricte |
| Surcharge serveur | Rate limiting configurable |
File d'attente : génération en masse
Pour générer 50 articles, personne ne veut cliquer 50 fois. Le plugin inclut un système de queue :
- ajout de mots-clés en batch
- traitement séquentiel (respect des rate limits API)
- statuts par article (pending → processing → completed/failed)
- reprise après interruption
La table custom {prefix}_scg_queue stocke l'état de chaque tâche.
Ce que j'ai appris en construisant ça
Prompt engineering, c'est 80% du travail. Le code est simple. Faire en sorte que l'IA produise un output exploitable et constant, c'est autre chose. J'ai itéré des dizaines de fois sur les prompts avant d'avoir un résultat stable.
Les APIs IA sont fragiles. Timeout, rate limit, formats de réponse qui changent... Il faut tout anticiper. Un plugin "production-ready" passe plus de temps à gérer les erreurs qu'à faire le travail nominal.
WordPress a ses patterns. Hooks, filters, options API, AJAX admin... Une fois qu'on les maîtrise, c'est puissant. Avant ça, c'est le chaos.
Résultats concrets
- Temps de production d'un article : 2h → 5 minutes
- Coût par article : ~0.15€ (Claude Sonnet) à ~0.80€ (Claude Opus) + 0.15€ (Semrank)
Pour mes petits sites de vente de liensil fait le job et ça rank !