[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fIdCYbIIK3ctM_bxs2__kQghHgmxDMZwP07RVU1sH4NU":3,"$fUkYeDYQ3EHMiC1HUhh_lHbXKnJgwOIgk59sALhhdDUE":25},{"_id":4,"slug":5,"__v":6,"author":7,"body":8,"canonical":9,"category":10,"createdAt":11,"date":12,"description":13,"htmlContent":14,"image":15,"imageAlt":15,"readingTime":16,"tags":17,"title":23,"updatedAt":24},"6a0ea00daa6b273b0cf4cc1a","wordpress-7-0-launches-with-native-ai-integration-via-sejournal-martinibuster",0,"Equipe Seogard","WordPress alimente 43% du web. Quand ce CMS intègre nativement de l'intelligence artificielle — génération de contenu, suggestions de structure, réécriture automatique — ce n'est pas une feature gadget. C'est un changement d'architecture qui affecte directement le rendu HTML servi aux crawlers, la stabilité des balises meta et la prévisibilité du contenu indexé.\n\n## Ce que WordPress 7.0 change dans l'architecture de rendu\n\nWordPress 7.0 introduit un layer AI directement dans l'éditeur Gutenberg et, plus critique, dans le pipeline de rendu front-end. Contrairement aux plugins AI tiers (Yoast AI, RankMath Content AI, Jetpack AI Assistant) qui opéraient exclusivement côté éditeur, l'intégration native permet à WordPress de modifier le contenu au moment du rendu.\n\n### Génération dynamique côté serveur vs côté client\n\nLe point central : le contenu AI peut être généré soit au moment du `save_post` (persisté en base), soit au moment du rendu via des blocs dynamiques. WordPress 7.0 supporte les deux approches via un nouveau type de bloc `core/ai-content`.\n\n```php\n// Bloc AI dynamique dans WordPress 7.0\n// Le contenu est généré au render time, pas au save time\nregister_block_type('core/ai-content', [\n    'render_callback' => function($attributes, $content) {\n        $prompt = $attributes['prompt'] ?? '';\n        $cache_key = 'ai_block_' . md5($prompt . $attributes['context']);\n        \n        // Vérifier le cache avant d'appeler l'API AI\n        $cached = wp_cache_get($cache_key, 'ai_blocks');\n        if ($cached !== false) {\n            return $cached;\n        }\n        \n        // Appel à l'API AI WordPress (abstraction sur OpenAI/Anthropic)\n        $response = wp_ai_generate([\n            'prompt' => $prompt,\n            'max_tokens' => $attributes['maxTokens'] ?? 500,\n            'temperature' => 0.3, // Basse pour la reproductibilité\n        ]);\n        \n        // Cache de 24h par défaut\n        wp_cache_set($cache_key, $response, 'ai_blocks', DAY_IN_SECONDS);\n        \n        return '\u003Cdiv class=\"wp-block-ai-content\">' . wp_kses_post($response) . '\u003C/div>';\n    },\n    'attributes' => [\n        'prompt' => ['type' => 'string'],\n        'context' => ['type' => 'string'],\n        'maxTokens' => ['type' => 'integer', 'default' => 500],\n    ],\n]);\n```\n\nLe problème est immédiat : si le cache expire entre deux passages de Googlebot, le contenu servi peut différer. Google a explicitement documenté que du contenu qui change significativement entre les crawls peut être perçu comme du [cloaking](https://developers.google.com/search/docs/essentials/cloaking) ou, à minima, rendre l'indexation instable.\n\n### Le piège des meta descriptions dynamiques\n\nWordPress 7.0 expose également une API pour générer dynamiquement les meta descriptions et les titles via AI. Un hook `wp_ai_meta` permet aux thèmes et plugins de déclencher une génération automatique quand aucune meta n'est explicitement définie.\n\n```php\n// Filtre natif WordPress 7.0 pour les meta AI\nadd_filter('wp_ai_meta_description', function($description, $post) {\n    if (!empty($description)) {\n        return $description; // Ne pas écraser une meta manuelle\n    }\n    \n    // Générer depuis le contenu du post\n    $excerpt = wp_trim_words($post->post_content, 100);\n    $generated = wp_ai_generate([\n        'prompt' => \"Résumé SEO en 155 caractères max : \" . $excerpt,\n        'max_tokens' => 60,\n        'temperature' => 0.1,\n    ]);\n    \n    // PROBLÈME : cette valeur n'est PAS persistée par défaut\n    return sanitize_text_field($generated);\n}, 10, 2);\n```\n\nSur un site e-commerce de 12 000 fiches produit où 40% n'ont pas de meta description explicite, ce mécanisme va générer dynamiquement ~4 800 meta descriptions. Si la température du modèle n'est pas à 0 (et elle ne l'est pas par défaut), chaque crawl peut retourner une variante légèrement différente. \n\nLe résultat dans la Search Console : des fluctuations constantes dans les snippets affichés, une incapacité à tester l'impact d'une meta description spécifique, et potentiellement des alertes \"meta description modifiée\" à chaque passage du crawler.\n\n## Crawl budget : quand l'AI multiplie les variantes de pages\n\n### Le coût caché des blocs dynamiques\n\nUn bloc `core/ai-content` avec un cache de 24h, c'est techniquement une page qui peut avoir 365 versions différentes par an. Pour Googlebot, ce n'est pas nécessairement un problème si les variations sont mineures (reformulation d'une phrase). Mais dès que le contenu change structurellement — nouveau paragraphe, disparition d'un H2, modification d'un lien interne — c'est un signal de re-crawl.\n\nPrenons un cas concret. Un média en ligne sous WordPress avec 8 000 articles. L'équipe éditoriale active les blocs AI sur les sidebars pour générer des \"articles liés\" contextuels. Chaque page embarque désormais 3-5 liens internes générés dynamiquement.\n\nConséquences mesurables :\n\n- **Crawl rate** : Googlebot détecte des changements sur les pages à chaque visite (les liens internes changent), ce qui augmente la fréquence de crawl. Sur un site de cette taille, les logs serveur montrent typiquement un passage de 2 000-3 000 pages crawlées/jour à 5 000-7 000.\n- **Stabilité du maillage interne** : les liens internes générés par AI ne suivent pas une stratégie de siloing. Un article sur \"migration Next.js\" peut se retrouver lié à \"recette de cookies\" si le modèle AI déraille sur le contexte.\n- **Indexation** : des pages qui changent trop souvent peuvent voir leur fréquence d'indexation ralentir (Google alloue ses ressources aux pages stables et à forte valeur).\n\n### Vérifier l'impact dans les logs\n\nAvant et après l'activation des blocs AI, une analyse de logs est indispensable. Voici un pipeline rapide avec GoAccess et un filtre Googlebot :\n\n```bash\n# Extraire les hits Googlebot des access logs Nginx\ngrep -i \"googlebot\" /var/log/nginx/access.log > googlebot_hits.log\n\n# Compter les URLs uniques crawlées par jour\nawk '{print $4, $7}' googlebot_hits.log | \\\n  sed 's/\\[//;s/:/ /' | \\\n  awk '{print $1, $5}' | \\\n  sort | uniq -c | sort -rn | head -50\n\n# Comparer le crawl rate avant/après activation AI\n# Avant (fichier log de la semaine précédente)\nwc -l googlebot_hits_before.log\n# Après\nwc -l googlebot_hits_after.log\n\n# Identifier les pages crawlées plus de 3 fois en 24h (signe de contenu instable)\nawk '{print $7}' googlebot_hits.log | sort | uniq -c | sort -rn | \\\n  awk '$1 > 3 {print $0}' | head -20\n```\n\nSi vous constatez que des URLs spécifiques sont re-crawlées anormalement souvent après l'activation des blocs AI, c'est un signal clair : Googlebot détecte des changements et revient vérifier. Sur un crawl budget limité (sites de 20K+ pages), c'est du budget gaspillé qui aurait pu servir à indexer de nouvelles pages.\n\nUn outil de monitoring comme Seogard détecte automatiquement ces variations de meta et de contenu entre les crawls successifs, ce qui permet d'identifier précisément quels blocs AI génèrent de l'instabilité.\n\n## Impact sur le SSR et les frameworks headless\n\n### WordPress headless + AI : la combinaison risquée\n\nLes architectures headless WordPress (WordPress comme CMS + Next.js/Nuxt.js en front) représentent une part croissante des sites à fort trafic. WordPress 7.0 complexifie ce setup : les blocs AI dynamiques renvoient du contenu différent selon que l'appel provient de l'API REST ou du rendu PHP natif.\n\nLe endpoint REST `/wp-json/wp/v2/posts/{id}` retourne le contenu tel qu'il est stocké en base. Mais les blocs `core/ai-content` sont des blocs dynamiques — leur contenu n'existe pas en base, il est généré au `render_callback`. L'API REST standard ne les exécute pas.\n\n```typescript\n// Problème : récupérer le contenu rendu (avec blocs AI) via l'API REST\n// L'API standard retourne le contenu brut, pas le rendu des blocs dynamiques\n\n// Solution 1 : utiliser le endpoint rendered content\ninterface WPRenderedPost {\n  id: number;\n  content: {\n    rendered: string; // Contient le HTML des blocs dynamiques\n    raw: string;      // Contient les commentaires de blocs Gutenberg\n  };\n  meta_ai: {\n    description?: string;\n    title_suggestion?: string;\n  };\n}\n\nasync function getRenderedPost(postId: number): Promise\u003CWPRenderedPost> {\n  // Le paramètre _embed=true force le rendu des blocs dynamiques\n  // ATTENTION : cela exécute les callbacks AI côté WordPress à chaque appel\n  const response = await fetch(\n    `https://cms.votresite.fr/wp-json/wp/v2/posts/${postId}?context=view&_embed=true`,\n    {\n      headers: {\n        'Authorization': `Bearer ${process.env.WP_API_TOKEN}`,\n        // Header custom pour indiquer que c'est un pre-render SSR\n        'X-Render-Context': 'ssr-build',\n      },\n    }\n  );\n  \n  if (!response.ok) {\n    throw new Error(`WP API error: ${response.status}`);\n  }\n  \n  return response.json();\n}\n\n// Solution 2 (recommandée) : builder le contenu statiquement avec ISR\n// next.config.js\nexport default {\n  async rewrites() {\n    return [\n      {\n        source: '/blog/:slug',\n        destination: '/blog/:slug',\n      },\n    ];\n  },\n};\n\n// pages/blog/[slug].tsx — ISR avec revalidation longue\nexport async function getStaticProps({ params }: { params: { slug: string } }) {\n  const post = await getRenderedPost(params.slug);\n  \n  return {\n    props: { post },\n    // Revalidation à 1h pour éviter les variations AI trop fréquentes\n    // Googlebot verra le même contenu pendant 1h minimum\n    revalidate: 3600,\n  };\n}\n```\n\nLe trade-off est clair : soit vous augmentez le `revalidate` et vous stabilisez le contenu servi aux crawlers (mais les mises à jour AI sont retardées), soit vous réduisez le `revalidate` et vous acceptez l'instabilité. Pour le SEO, la première option est presque toujours préférable.\n\n### Vérification du rendu avec Chrome DevTools et Screaming Frog\n\nPour valider que le contenu AI est bien rendu dans le HTML initial (et non injecté en JavaScript côté client), deux vérifications systématiques :\n\n**Chrome DevTools** : désactivez JavaScript dans les DevTools (`Settings > Debugger > Disable JavaScript`), rechargez la page. Si les blocs AI disparaissent, c'est du rendu client-side — Googlebot le verra probablement via son renderer, mais avec un délai et sans garantie de stabilité.\n\n**Screaming Frog** : configurez un crawl en mode \"JavaScript Rendering\" et comparez avec un crawl en mode \"Text Only\". Les écarts de word count entre les deux modes indiquent du contenu injecté côté client. Sur un site de 5 000 pages, cet audit prend ~45 minutes et donne une cartographie précise des pages où l'AI génère du contenu client-side.\n\n## Contenu AI natif et signaux E-E-A-T\n\n### Le risque de l'homogénéisation\n\nL'intégration AI native de WordPress 7.0 utilise une couche d'abstraction qui se connecte à différents providers (OpenAI, Anthropic, modèles locaux via Ollama). Le modèle par défaut dans la configuration standard est GPT-4o-mini.\n\nLe problème : si 43% du web utilise WordPress et qu'une fraction significative active les blocs AI par défaut, le contenu généré converge mécaniquement. Les mêmes prompts système, le même modèle, la même température (0.3 par défaut) produisent des outputs structurellement similaires.\n\nGoogle a renforcé ses signaux de qualité autour de l'originalité du contenu. Le [helpful content system](https://developers.google.com/search/docs/fundamentals/creating-helpful-content) pénalise explicitement le contenu qui n'apporte pas de valeur ajoutée par rapport à ce qui existe déjà. Du contenu AI généré avec les mêmes paramètres que des millions d'autres sites est, par définition, non-original.\n\nLe rapport avec la visibilité dans les [AI Overviews de Google](/blog/google-expands-ai-search-links-without-new-click-data-via-sejournal-mattgsouthern) est direct : les sources citées par l'AI search de Google sont celles qui apportent un point de vue distinctif. Du contenu WordPress AI-generated avec les paramètres par défaut ne sera pas cité.\n\n### Stratégie de containment\n\nLa recommandation technique : désactiver les blocs AI sur les contenus éditoriaux à forte valeur SEO et les limiter aux usages où ils apportent un gain réel sans risque d'indexation (résumés internes, brouillons, suggestions à l'éditeur).\n\n```php\n// functions.php — Désactiver les blocs AI sur les post types critiques\nadd_filter('allowed_block_types_all', function($allowed_blocks, $editor_context) {\n    // Désactiver core/ai-content sur les posts et les pages produit\n    if (in_array($editor_context->post->post_type, ['post', 'product', 'page'])) {\n        if (is_array($allowed_blocks)) {\n            $allowed_blocks = array_filter($allowed_blocks, function($block) {\n                return $block !== 'core/ai-content';\n            });\n        }\n    }\n    return $allowed_blocks;\n}, 10, 2);\n\n// Désactiver la génération AI des meta sur le front-end\nadd_filter('wp_ai_meta_description', function($description, $post) {\n    // Toujours retourner la meta manuelle ou rien\n    // Ne jamais laisser l'AI générer des meta en production\n    $manual_meta = get_post_meta($post->ID, '_yoast_wpseo_metadesc', true);\n    if (!empty($manual_meta)) {\n        return $manual_meta;\n    }\n    // Retourner vide plutôt qu'une meta AI instable\n    return '';\n}, 5, 2); // Priorité 5 pour s'exécuter avant le hook AI natif\n```\n\n## WordPress AI et les agents de crawl : le nouveau front\n\n### Google-Extended, GPTBot et la fragmentation du crawl\n\nWordPress 7.0 arrive dans un contexte où les crawlers se multiplient. Outre Googlebot, les sites WordPress reçoivent désormais les visites de GPTBot (OpenAI), ClaudeBot (Anthropic), Google-Extended (entraînement AI de Google, distinct de Googlebot), et bientôt les [agents web de Google](/blog/google-agent-the-web-s-new-visitor-just-got-an-identity-via-sejournal-slobodanmanic).\n\nL'ironie : WordPress 7.0 utilise les API de ces mêmes providers AI pour générer du contenu, tout en servant ce contenu à leurs crawlers. Un site WordPress AI-powered qui bloque GPTBot via robots.txt se tire une balle dans le pied côté fonctionnalité tout en essayant de protéger son contenu.\n\nLa configuration `robots.txt` doit être pensée finement :\n\n```nginx\n# robots.txt — Configuration recommandée pour WordPress 7.0 avec AI\nUser-agent: Googlebot\nAllow: /\n# Bloquer les pages admin et les previews AI\nDisallow: /wp-admin/\nDisallow: /*?preview=true\nDisallow: /*?ai_draft=true\n\nUser-agent: GPTBot\n# Autoriser le crawl des contenus éditoriaux humains\nAllow: /blog/\nAllow: /guides/\n# Bloquer les pages avec contenu AI généré dynamiquement\nDisallow: /ai-generated/\nDisallow: /*?ai_content=dynamic\n\nUser-agent: Google-Extended\n# Décision business : accepter ou non l'entraînement AI\n# Si vous bloquez, vos contenus seront moins représentés dans les AI Overviews\nDisallow: /\n\nUser-agent: ClaudeBot\nAllow: /blog/\nDisallow: /\n\n# Sitemap\nSitemap: https://votresite.fr/sitemap_index.xml\n```\n\nCe sujet rejoint directement la question de la [préparation aux agents web et au protocole MCP](/blog/why-now-is-the-time-to-prepare-for-webmcp) : les sites doivent exposer leur contenu de manière structurée et prévisible aux agents AI, pas leur servir du contenu qui change à chaque requête.\n\n## Scénario réel : migration vers WordPress 7.0 d'un e-commerce de 15K pages\n\n### Le contexte\n\nUn e-commerce spécialisé (électronique grand public), 15 200 pages indexées, ~340K sessions organiques/mois. Stack : WordPress 6.5 + WooCommerce 8.x, hébergé sur un VPS avec Nginx et Redis pour le cache objet. L'équipe active WordPress 7.0 avec les blocs AI activés par défaut.\n\n### Semaine 1-2 : les premiers signaux\n\n- **Search Console** : augmentation de 23% des pages crawlées/jour (de 1 800 à 2 200). Les fiches produit sans meta description explicite (environ 6 100 produits) affichent des meta descriptions différentes dans le rapport \"Apparence dans les résultats de recherche\".\n- **Screaming Frog** : un crawl comparatif révèle que 410 fiches produit ont un `\u003Ctitle>` modifié par le filtre AI natif, ajoutant un suffixe contextuel (\"— Meilleur prix 2026\" ou \"— Comparatif expert\").\n- **Logs Nginx** : Googlebot re-crawle 3 fois plus les pages catégories (qui embarquent des blocs AI de \"produits recommandés\" en sidebar).\n\n### Semaine 3-4 : l'impact trafic\n\n- **Trafic organique** : -8% sur les fiches produit (passant de ~210K à ~193K sessions). Les pages catégories restent stables.\n- **Positions** : 340 fiches produit perdent entre 2 et 5 positions sur leurs requêtes principales. Corrélation directe avec les fiches dont le title a été modifié par l'AI.\n- **Taux de clic** : les meta descriptions AI-generated ont un CTR moyen de 2.1% contre 3.4% pour les meta descriptions rédigées manuellement (mesuré sur un échantillon de 500 pages dans Search Console).\n\n### Le correctif\n\nL'équipe désactive les blocs AI sur les templates WooCommerce produit et catégorie. Les meta AI sont remplacées par un fallback vers l'extrait produit tronqué (moins bon qu'une meta manuelle, mais stable). Le cache des blocs AI restants (blog) est poussé à 72h minimum.\n\nRésultat après 3 semaines de correctif : retour au trafic initial, stabilisation des positions. Le crawl rate redescend à 2 000 pages/jour.\n\nCette séquence illustre pourquoi un [audit technique orienté AI search](/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus) doit désormais inclure la vérification des couches de génération AI côté CMS, en plus des couches de consommation AI côté moteur de recherche.\n\n## Recommandations techniques pour les sites WordPress 7.0\n\n**Persistez le contenu AI au `save_post`**, pas au render time. Si vous utilisez les blocs AI, configurez-les pour générer le contenu une seule fois et le stocker en base. Le contenu dynamique non-caché est un anti-pattern SEO.\n\n**Auditez vos meta tags hebdomadairement.** Comparez les meta descriptions et titles retournés par votre serveur avec ceux stockés en base. Tout écart signale une interférence du layer AI.\n\n**Augmentez le TTL du cache AI à 72h minimum.** La valeur par défaut de 24h est trop basse pour un contenu SEO. Un TTL de 72h réduit les chances que Googlebot voie deux versions différentes entre deux crawls consécutifs (l'intervalle moyen de re-crawl pour un site de cette taille étant de 4-7 jours sur les pages établies).\n\n**Séparez les concerns : AI éditorial vs AI front-end.** L'AI comme outil d'assistance à la rédaction (suggestions, correction, structure) est utile et sans risque SEO. L'AI qui modifie le HTML servi au crawler est un risque direct. Ce sont deux usages fondamentalement différents que WordPress 7.0 mélange dans la même feature.\n\n**Monitorez en continu.** Les régressions causées par l'AI sont subtiles — une meta description qui dérive, un H2 qui change, un lien interne qui disparaît. Ce type de régression, détectable automatiquement par des outils comme Seogard, passe inaperçu dans un audit manuel mensuel mais peut coûter 5 à 10% de trafic organique sur les pages affectées.\n\nWordPress 7.0 marque un tournant : le CMS le plus utilisé au monde intègre de l'AI dans son pipeline de rendu. Pour les équipes SEO, ce n'est pas une opportunité d'automatisation — c'est un nouveau vecteur de régression technique qui exige une surveillance renforcée et une configuration explicite plutôt que des défauts magiques.\n```","https://seogard.io/blog/wordpress-7-0-launches-with-native-ai-integration-via-sejournal-martinibuster","Actualités SEO","2026-05-21T06:02:53.501Z","2026-05-21","Analyse technique de l'intégration AI native dans WordPress 7.0 : impacts sur le rendu HTML, le crawl budget, le SSR et les stratégies SEO à adapter.","\u003Cp>WordPress alimente 43% du web. Quand ce CMS intègre nativement de l'intelligence artificielle — génération de contenu, suggestions de structure, réécriture automatique — ce n'est pas une feature gadget. C'est un changement d'architecture qui affecte directement le rendu HTML servi aux crawlers, la stabilité des balises meta et la prévisibilité du contenu indexé.\u003C/p>\n\u003Ch2>Ce que WordPress 7.0 change dans l'architecture de rendu\u003C/h2>\n\u003Cp>WordPress 7.0 introduit un layer AI directement dans l'éditeur Gutenberg et, plus critique, dans le pipeline de rendu front-end. Contrairement aux plugins AI tiers (Yoast AI, RankMath Content AI, Jetpack AI Assistant) qui opéraient exclusivement côté éditeur, l'intégration native permet à WordPress de modifier le contenu au moment du rendu.\u003C/p>\n\u003Ch3>Génération dynamique côté serveur vs côté client\u003C/h3>\n\u003Cp>Le point central : le contenu AI peut être généré soit au moment du \u003Ccode>save_post\u003C/code> (persisté en base), soit au moment du rendu via des blocs dynamiques. WordPress 7.0 supporte les deux approches via un nouveau type de bloc \u003Ccode>core/ai-content\u003C/code>.\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Bloc AI dynamique dans WordPress 7.0\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Le contenu est généré au render time, pas au save time\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">register_block_type\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'core/ai-content'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    'render_callback'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($attributes, $content) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $prompt \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $attributes[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'prompt'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">??\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> ''\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $cache_key \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'ai_block_'\u003C/span>\u003Cspan style=\"color:#F97583\"> .\u003C/span>\u003Cspan style=\"color:#79B8FF\"> md5\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($prompt \u003C/span>\u003Cspan style=\"color:#F97583\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $attributes[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'context'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        // Vérifier le cache avant d'appeler l'API AI\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $cached \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#B392F0\"> wp_cache_get\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($cache_key, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'ai_blocks'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ($cached \u003C/span>\u003Cspan style=\"color:#F97583\">!==\u003C/span>\u003Cspan style=\"color:#79B8FF\"> false\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $cached;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        // Appel à l'API AI WordPress (abstraction sur OpenAI/Anthropic)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $response \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#B392F0\"> wp_ai_generate\u003C/span>\u003Cspan style=\"color:#E1E4E8\">([\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            'prompt'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $prompt,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            'max_tokens'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $attributes[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'maxTokens'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">??\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 500\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            'temperature'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0.3\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#6A737D\">// Basse pour la reproductibilité\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        ]);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        // Cache de 24h par défaut\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        wp_cache_set\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($cache_key, $response, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'ai_blocks'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">DAY_IN_SECONDS\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        return\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '&#x3C;div class=\"wp-block-ai-content\">'\u003C/span>\u003Cspan style=\"color:#F97583\"> .\u003C/span>\u003Cspan style=\"color:#B392F0\"> wp_kses_post\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($response) \u003C/span>\u003Cspan style=\"color:#F97583\">.\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '&#x3C;/div>'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    'attributes'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        'prompt'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'type'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'string'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        'context'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'type'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'string'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        'maxTokens'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'type'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'integer'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'default'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 500\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">]);\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le problème est immédiat : si le cache expire entre deux passages de Googlebot, le contenu servi peut différer. Google a explicitement documenté que du contenu qui change significativement entre les crawls peut être perçu comme du \u003Ca href=\"https://developers.google.com/search/docs/essentials/cloaking\">cloaking\u003C/a> ou, à minima, rendre l'indexation instable.\u003C/p>\n\u003Ch3>Le piège des meta descriptions dynamiques\u003C/h3>\n\u003Cp>WordPress 7.0 expose également une API pour générer dynamiquement les meta descriptions et les titles via AI. Un hook \u003Ccode>wp_ai_meta\u003C/code> permet aux thèmes et plugins de déclencher une génération automatique quand aucune meta n'est explicitement définie.\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Filtre natif WordPress 7.0 pour les meta AI\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">add_filter\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'wp_ai_meta_description'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#F97583\">function\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($description, $post) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#79B8FF\">empty\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($description)) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $description; \u003C/span>\u003Cspan style=\"color:#6A737D\">// Ne pas écraser une meta manuelle\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // Générer depuis le contenu du post\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    $excerpt \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#B392F0\"> wp_trim_words\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($post\u003C/span>\u003Cspan style=\"color:#F97583\">->\u003C/span>\u003Cspan style=\"color:#E1E4E8\">post_content, \u003C/span>\u003Cspan style=\"color:#79B8FF\">100\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    $generated \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#B392F0\"> wp_ai_generate\u003C/span>\u003Cspan style=\"color:#E1E4E8\">([\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        'prompt'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"Résumé SEO en 155 caractères max : \"\u003C/span>\u003Cspan style=\"color:#F97583\"> .\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $excerpt,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        'max_tokens'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 60\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        'temperature'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0.1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    ]);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // PROBLÈME : cette valeur n'est PAS persistée par défaut\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#B392F0\"> sanitize_text_field\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($generated);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}, \u003C/span>\u003Cspan style=\"color:#79B8FF\">10\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Sur un site e-commerce de 12 000 fiches produit où 40% n'ont pas de meta description explicite, ce mécanisme va générer dynamiquement ~4 800 meta descriptions. Si la température du modèle n'est pas à 0 (et elle ne l'est pas par défaut), chaque crawl peut retourner une variante légèrement différente.\u003C/p>\n\u003Cp>Le résultat dans la Search Console : des fluctuations constantes dans les snippets affichés, une incapacité à tester l'impact d'une meta description spécifique, et potentiellement des alertes \"meta description modifiée\" à chaque passage du crawler.\u003C/p>\n\u003Ch2>Crawl budget : quand l'AI multiplie les variantes de pages\u003C/h2>\n\u003Ch3>Le coût caché des blocs dynamiques\u003C/h3>\n\u003Cp>Un bloc \u003Ccode>core/ai-content\u003C/code> avec un cache de 24h, c'est techniquement une page qui peut avoir 365 versions différentes par an. Pour Googlebot, ce n'est pas nécessairement un problème si les variations sont mineures (reformulation d'une phrase). Mais dès que le contenu change structurellement — nouveau paragraphe, disparition d'un H2, modification d'un lien interne — c'est un signal de re-crawl.\u003C/p>\n\u003Cp>Prenons un cas concret. Un média en ligne sous WordPress avec 8 000 articles. L'équipe éditoriale active les blocs AI sur les sidebars pour générer des \"articles liés\" contextuels. Chaque page embarque désormais 3-5 liens internes générés dynamiquement.\u003C/p>\n\u003Cp>Conséquences mesurables :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Crawl rate\u003C/strong> : Googlebot détecte des changements sur les pages à chaque visite (les liens internes changent), ce qui augmente la fréquence de crawl. Sur un site de cette taille, les logs serveur montrent typiquement un passage de 2 000-3 000 pages crawlées/jour à 5 000-7 000.\u003C/li>\n\u003Cli>\u003Cstrong>Stabilité du maillage interne\u003C/strong> : les liens internes générés par AI ne suivent pas une stratégie de siloing. Un article sur \"migration Next.js\" peut se retrouver lié à \"recette de cookies\" si le modèle AI déraille sur le contexte.\u003C/li>\n\u003Cli>\u003Cstrong>Indexation\u003C/strong> : des pages qui changent trop souvent peuvent voir leur fréquence d'indexation ralentir (Google alloue ses ressources aux pages stables et à forte valeur).\u003C/li>\n\u003C/ul>\n\u003Ch3>Vérifier l'impact dans les logs\u003C/h3>\n\u003Cp>Avant et après l'activation des blocs AI, une analyse de logs est indispensable. Voici un pipeline rapide avec GoAccess et un filtre Googlebot :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Extraire les hits Googlebot des access logs Nginx\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">grep\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -i\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"googlebot\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /var/log/nginx/access.log\u003C/span>\u003Cspan style=\"color:#F97583\"> >\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> googlebot_hits.log\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Compter les URLs uniques crawlées par jour\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">awk\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '{print $4, $7}'\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> googlebot_hits.log\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  sed\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 's/\\[//;s/:/ /'\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  awk\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '{print $1, $5}'\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  sort\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> uniq\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -c\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> sort\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -rn\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> head\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -50\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Comparer le crawl rate avant/après activation AI\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Avant (fichier log de la semaine précédente)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">wc\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -l\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> googlebot_hits_before.log\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Après\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">wc\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -l\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> googlebot_hits_after.log\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Identifier les pages crawlées plus de 3 fois en 24h (signe de contenu instable)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">awk\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '{print $7}'\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> googlebot_hits.log\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> sort\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> uniq\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -c\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> sort\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -rn\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  awk\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '$1 > 3 {print $0}'\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> head\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -20\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Si vous constatez que des URLs spécifiques sont re-crawlées anormalement souvent après l'activation des blocs AI, c'est un signal clair : Googlebot détecte des changements et revient vérifier. Sur un crawl budget limité (sites de 20K+ pages), c'est du budget gaspillé qui aurait pu servir à indexer de nouvelles pages.\u003C/p>\n\u003Cp>Un outil de monitoring comme Seogard détecte automatiquement ces variations de meta et de contenu entre les crawls successifs, ce qui permet d'identifier précisément quels blocs AI génèrent de l'instabilité.\u003C/p>\n\u003Ch2>Impact sur le SSR et les frameworks headless\u003C/h2>\n\u003Ch3>WordPress headless + AI : la combinaison risquée\u003C/h3>\n\u003Cp>Les architectures headless WordPress (WordPress comme CMS + Next.js/Nuxt.js en front) représentent une part croissante des sites à fort trafic. WordPress 7.0 complexifie ce setup : les blocs AI dynamiques renvoient du contenu différent selon que l'appel provient de l'API REST ou du rendu PHP natif.\u003C/p>\n\u003Cp>Le endpoint REST \u003Ccode>/wp-json/wp/v2/posts/{id}\u003C/code> retourne le contenu tel qu'il est stocké en base. Mais les blocs \u003Ccode>core/ai-content\u003C/code> sont des blocs dynamiques — leur contenu n'existe pas en base, il est généré au \u003Ccode>render_callback\u003C/code>. L'API REST standard ne les exécute pas.\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Problème : récupérer le contenu rendu (avec blocs AI) via l'API REST\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// L'API standard retourne le contenu brut, pas le rendu des blocs dynamiques\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Solution 1 : utiliser le endpoint rendered content\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">interface\u003C/span>\u003Cspan style=\"color:#B392F0\"> WPRenderedPost\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  id\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> number\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  content\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">    rendered\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">; \u003C/span>\u003Cspan style=\"color:#6A737D\">// Contient le HTML des blocs dynamiques\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">    raw\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;      \u003C/span>\u003Cspan style=\"color:#6A737D\">// Contient les commentaires de blocs Gutenberg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  };\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  meta_ai\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">    description\u003C/span>\u003Cspan style=\"color:#F97583\">?:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">    title_suggestion\u003C/span>\u003Cspan style=\"color:#F97583\">?:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  };\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> getRenderedPost\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">postId\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> number\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Promise\u003C/span>\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">WPRenderedPost\u003C/span>\u003Cspan style=\"color:#E1E4E8\">> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  // Le paramètre _embed=true force le rendu des blocs dynamiques\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  // ATTENTION : cela exécute les callbacks AI côté WordPress à chaque appel\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> response\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> fetch\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    `https://cms.votresite.fr/wp-json/wp/v2/posts/${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">postId\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}?context=view&#x26;_embed=true`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      headers: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        'Authorization'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`Bearer ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">process\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">env\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#79B8FF\">WP_API_TOKEN\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        // Header custom pour indiquer que c'est un pre-render SSR\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        'X-Render-Context'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'ssr-build'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  );\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">response.ok) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    throw\u003C/span>\u003Cspan style=\"color:#F97583\"> new\u003C/span>\u003Cspan style=\"color:#B392F0\"> Error\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`WP API error: ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">response\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">status\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> response.\u003C/span>\u003Cspan style=\"color:#B392F0\">json\u003C/span>\u003Cspan style=\"color:#E1E4E8\">();\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Solution 2 (recommandée) : builder le contenu statiquement avec ISR\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// next.config.js\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">export\u003C/span>\u003Cspan style=\"color:#F97583\"> default\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  async\u003C/span>\u003Cspan style=\"color:#B392F0\"> rewrites\u003C/span>\u003Cspan style=\"color:#E1E4E8\">() {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        source: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'/blog/:slug'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        destination: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'/blog/:slug'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    ];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">};\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// pages/blog/[slug].tsx — ISR avec revalidation longue\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">export\u003C/span>\u003Cspan style=\"color:#F97583\"> async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> getStaticProps\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({ \u003C/span>\u003Cspan style=\"color:#FFAB70\">params\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> }\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"color:#FFAB70\">params\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"color:#FFAB70\">slug\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> } }) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> post\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> getRenderedPost\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(params.slug);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    props: { post },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // Revalidation à 1h pour éviter les variations AI trop fréquentes\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // Googlebot verra le même contenu pendant 1h minimum\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    revalidate: \u003C/span>\u003Cspan style=\"color:#79B8FF\">3600\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  };\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le trade-off est clair : soit vous augmentez le \u003Ccode>revalidate\u003C/code> et vous stabilisez le contenu servi aux crawlers (mais les mises à jour AI sont retardées), soit vous réduisez le \u003Ccode>revalidate\u003C/code> et vous acceptez l'instabilité. Pour le SEO, la première option est presque toujours préférable.\u003C/p>\n\u003Ch3>Vérification du rendu avec Chrome DevTools et Screaming Frog\u003C/h3>\n\u003Cp>Pour valider que le contenu AI est bien rendu dans le HTML initial (et non injecté en JavaScript côté client), deux vérifications systématiques :\u003C/p>\n\u003Cp>\u003Cstrong>Chrome DevTools\u003C/strong> : désactivez JavaScript dans les DevTools (\u003Ccode>Settings > Debugger > Disable JavaScript\u003C/code>), rechargez la page. Si les blocs AI disparaissent, c'est du rendu client-side — Googlebot le verra probablement via son renderer, mais avec un délai et sans garantie de stabilité.\u003C/p>\n\u003Cp>\u003Cstrong>Screaming Frog\u003C/strong> : configurez un crawl en mode \"JavaScript Rendering\" et comparez avec un crawl en mode \"Text Only\". Les écarts de word count entre les deux modes indiquent du contenu injecté côté client. Sur un site de 5 000 pages, cet audit prend ~45 minutes et donne une cartographie précise des pages où l'AI génère du contenu client-side.\u003C/p>\n\u003Ch2>Contenu AI natif et signaux E-E-A-T\u003C/h2>\n\u003Ch3>Le risque de l'homogénéisation\u003C/h3>\n\u003Cp>L'intégration AI native de WordPress 7.0 utilise une couche d'abstraction qui se connecte à différents providers (OpenAI, Anthropic, modèles locaux via Ollama). Le modèle par défaut dans la configuration standard est GPT-4o-mini.\u003C/p>\n\u003Cp>Le problème : si 43% du web utilise WordPress et qu'une fraction significative active les blocs AI par défaut, le contenu généré converge mécaniquement. Les mêmes prompts système, le même modèle, la même température (0.3 par défaut) produisent des outputs structurellement similaires.\u003C/p>\n\u003Cp>Google a renforcé ses signaux de qualité autour de l'originalité du contenu. Le \u003Ca href=\"https://developers.google.com/search/docs/fundamentals/creating-helpful-content\">helpful content system\u003C/a> pénalise explicitement le contenu qui n'apporte pas de valeur ajoutée par rapport à ce qui existe déjà. Du contenu AI généré avec les mêmes paramètres que des millions d'autres sites est, par définition, non-original.\u003C/p>\n\u003Cp>Le rapport avec la visibilité dans les \u003Ca href=\"/blog/google-expands-ai-search-links-without-new-click-data-via-sejournal-mattgsouthern\">AI Overviews de Google\u003C/a> est direct : les sources citées par l'AI search de Google sont celles qui apportent un point de vue distinctif. Du contenu WordPress AI-generated avec les paramètres par défaut ne sera pas cité.\u003C/p>\n\u003Ch3>Stratégie de containment\u003C/h3>\n\u003Cp>La recommandation technique : désactiver les blocs AI sur les contenus éditoriaux à forte valeur SEO et les limiter aux usages où ils apportent un gain réel sans risque d'indexation (résumés internes, brouillons, suggestions à l'éditeur).\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// functions.php — Désactiver les blocs AI sur les post types critiques\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">add_filter\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'allowed_block_types_all'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#F97583\">function\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($allowed_blocks, $editor_context) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // Désactiver core/ai-content sur les posts et les pages produit\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#79B8FF\">in_array\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($editor_context\u003C/span>\u003Cspan style=\"color:#F97583\">->\u003C/span>\u003Cspan style=\"color:#E1E4E8\">post\u003C/span>\u003Cspan style=\"color:#F97583\">->\u003C/span>\u003Cspan style=\"color:#E1E4E8\">post_type, [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'post'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'product'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'page'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">])) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#79B8FF\">is_array\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($allowed_blocks)) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            $allowed_blocks \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\"> array_filter\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($allowed_blocks, \u003C/span>\u003Cspan style=\"color:#F97583\">function\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($block) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">                return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $block \u003C/span>\u003Cspan style=\"color:#F97583\">!==\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'core/ai-content'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $allowed_blocks;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}, \u003C/span>\u003Cspan style=\"color:#79B8FF\">10\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Désactiver la génération AI des meta sur le front-end\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">add_filter\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'wp_ai_meta_description'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#F97583\">function\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($description, $post) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // Toujours retourner la meta manuelle ou rien\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // Ne jamais laisser l'AI générer des meta en production\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    $manual_meta \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#B392F0\"> get_post_meta\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($post\u003C/span>\u003Cspan style=\"color:#F97583\">->\u003C/span>\u003Cspan style=\"color:#E1E4E8\">ID, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'_yoast_wpseo_metadesc'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">true\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#79B8FF\">empty\u003C/span>\u003Cspan style=\"color:#E1E4E8\">($manual_meta)) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $manual_meta;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // Retourner vide plutôt qu'une meta AI instable\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> ''\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}, \u003C/span>\u003Cspan style=\"color:#79B8FF\">5\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">); \u003C/span>\u003Cspan style=\"color:#6A737D\">// Priorité 5 pour s'exécuter avant le hook AI natif\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch2>WordPress AI et les agents de crawl : le nouveau front\u003C/h2>\n\u003Ch3>Google-Extended, GPTBot et la fragmentation du crawl\u003C/h3>\n\u003Cp>WordPress 7.0 arrive dans un contexte où les crawlers se multiplient. Outre Googlebot, les sites WordPress reçoivent désormais les visites de GPTBot (OpenAI), ClaudeBot (Anthropic), Google-Extended (entraînement AI de Google, distinct de Googlebot), et bientôt les \u003Ca href=\"/blog/google-agent-the-web-s-new-visitor-just-got-an-identity-via-sejournal-slobodanmanic\">agents web de Google\u003C/a>.\u003C/p>\n\u003Cp>L'ironie : WordPress 7.0 utilise les API de ces mêmes providers AI pour générer du contenu, tout en servant ce contenu à leurs crawlers. Un site WordPress AI-powered qui bloque GPTBot via robots.txt se tire une balle dans le pied côté fonctionnalité tout en essayant de protéger son contenu.\u003C/p>\n\u003Cp>La configuration \u003Ccode>robots.txt\u003C/code> doit être pensée finement :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># robots.txt — Configuration recommandée pour WordPress 7.0 avec AI\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">Googlebot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Bloquer les pages admin et les previews AI\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /wp-admin/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /*?preview=\u003C/span>\u003Cspan style=\"color:#F97583\">true\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /*?ai_draft=\u003C/span>\u003Cspan style=\"color:#F97583\">true\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">GPTBot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Autoriser le crawl des contenus éditoriaux humains\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /blog/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /guides/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Bloquer les pages avec contenu AI généré dynamiquement\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /ai-generated/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /*?ai_content=\u003C/span>\u003Cspan style=\"color:#F97583\">dynamic\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: Google-\u003C/span>\u003Cspan style=\"color:#F97583\">Extended\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Décision business : accepter ou non l'entraînement AI\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Si vous bloquez, vos contenus seront moins représentés dans les AI Overviews\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">ClaudeBot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /blog/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Sitemap\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Sitemap: https://votresite.fr/sitemap_index.\u003C/span>\u003Cspan style=\"color:#F97583\">xml\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce sujet rejoint directement la question de la \u003Ca href=\"/blog/why-now-is-the-time-to-prepare-for-webmcp\">préparation aux agents web et au protocole MCP\u003C/a> : les sites doivent exposer leur contenu de manière structurée et prévisible aux agents AI, pas leur servir du contenu qui change à chaque requête.\u003C/p>\n\u003Ch2>Scénario réel : migration vers WordPress 7.0 d'un e-commerce de 15K pages\u003C/h2>\n\u003Ch3>Le contexte\u003C/h3>\n\u003Cp>Un e-commerce spécialisé (électronique grand public), 15 200 pages indexées, ~340K sessions organiques/mois. Stack : WordPress 6.5 + WooCommerce 8.x, hébergé sur un VPS avec Nginx et Redis pour le cache objet. L'équipe active WordPress 7.0 avec les blocs AI activés par défaut.\u003C/p>\n\u003Ch3>Semaine 1-2 : les premiers signaux\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Search Console\u003C/strong> : augmentation de 23% des pages crawlées/jour (de 1 800 à 2 200). Les fiches produit sans meta description explicite (environ 6 100 produits) affichent des meta descriptions différentes dans le rapport \"Apparence dans les résultats de recherche\".\u003C/li>\n\u003Cli>\u003Cstrong>Screaming Frog\u003C/strong> : un crawl comparatif révèle que 410 fiches produit ont un \u003Ccode>&#x3C;title>\u003C/code> modifié par le filtre AI natif, ajoutant un suffixe contextuel (\"— Meilleur prix 2026\" ou \"— Comparatif expert\").\u003C/li>\n\u003Cli>\u003Cstrong>Logs Nginx\u003C/strong> : Googlebot re-crawle 3 fois plus les pages catégories (qui embarquent des blocs AI de \"produits recommandés\" en sidebar).\u003C/li>\n\u003C/ul>\n\u003Ch3>Semaine 3-4 : l'impact trafic\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Trafic organique\u003C/strong> : -8% sur les fiches produit (passant de ~210K à ~193K sessions). Les pages catégories restent stables.\u003C/li>\n\u003Cli>\u003Cstrong>Positions\u003C/strong> : 340 fiches produit perdent entre 2 et 5 positions sur leurs requêtes principales. Corrélation directe avec les fiches dont le title a été modifié par l'AI.\u003C/li>\n\u003Cli>\u003Cstrong>Taux de clic\u003C/strong> : les meta descriptions AI-generated ont un CTR moyen de 2.1% contre 3.4% pour les meta descriptions rédigées manuellement (mesuré sur un échantillon de 500 pages dans Search Console).\u003C/li>\n\u003C/ul>\n\u003Ch3>Le correctif\u003C/h3>\n\u003Cp>L'équipe désactive les blocs AI sur les templates WooCommerce produit et catégorie. Les meta AI sont remplacées par un fallback vers l'extrait produit tronqué (moins bon qu'une meta manuelle, mais stable). Le cache des blocs AI restants (blog) est poussé à 72h minimum.\u003C/p>\n\u003Cp>Résultat après 3 semaines de correctif : retour au trafic initial, stabilisation des positions. Le crawl rate redescend à 2 000 pages/jour.\u003C/p>\n\u003Cp>Cette séquence illustre pourquoi un \u003Ca href=\"/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus\">audit technique orienté AI search\u003C/a> doit désormais inclure la vérification des couches de génération AI côté CMS, en plus des couches de consommation AI côté moteur de recherche.\u003C/p>\n\u003Ch2>Recommandations techniques pour les sites WordPress 7.0\u003C/h2>\n\u003Cp>\u003Cstrong>Persistez le contenu AI au \u003Ccode>save_post\u003C/code>\u003C/strong>, pas au render time. Si vous utilisez les blocs AI, configurez-les pour générer le contenu une seule fois et le stocker en base. Le contenu dynamique non-caché est un anti-pattern SEO.\u003C/p>\n\u003Cp>\u003Cstrong>Auditez vos meta tags hebdomadairement.\u003C/strong> Comparez les meta descriptions et titles retournés par votre serveur avec ceux stockés en base. Tout écart signale une interférence du layer AI.\u003C/p>\n\u003Cp>\u003Cstrong>Augmentez le TTL du cache AI à 72h minimum.\u003C/strong> La valeur par défaut de 24h est trop basse pour un contenu SEO. Un TTL de 72h réduit les chances que Googlebot voie deux versions différentes entre deux crawls consécutifs (l'intervalle moyen de re-crawl pour un site de cette taille étant de 4-7 jours sur les pages établies).\u003C/p>\n\u003Cp>\u003Cstrong>Séparez les concerns : AI éditorial vs AI front-end.\u003C/strong> L'AI comme outil d'assistance à la rédaction (suggestions, correction, structure) est utile et sans risque SEO. L'AI qui modifie le HTML servi au crawler est un risque direct. Ce sont deux usages fondamentalement différents que WordPress 7.0 mélange dans la même feature.\u003C/p>\n\u003Cp>\u003Cstrong>Monitorez en continu.\u003C/strong> Les régressions causées par l'AI sont subtiles — une meta description qui dérive, un H2 qui change, un lien interne qui disparaît. Ce type de régression, détectable automatiquement par des outils comme Seogard, passe inaperçu dans un audit manuel mensuel mais peut coûter 5 à 10% de trafic organique sur les pages affectées.\u003C/p>\n\u003Cp>WordPress 7.0 marque un tournant : le CMS le plus utilisé au monde intègre de l'AI dans son pipeline de rendu. Pour les équipes SEO, ce n'est pas une opportunité d'automatisation — c'est un nouveau vecteur de régression technique qui exige une surveillance renforcée et une configuration explicite plutôt que des défauts magiques.\u003C/p>\n\u003Cpre>\u003Ccode>\u003C/code>\u003C/pre>",null,12,[18,19,20,21,22],"wordpress","AI","SEO technique","SSR","crawl budget","WordPress 7.0 et AI native : impacts SEO techniques","Thu May 21 2026 06:02:53 GMT+0000 (Coordinated Universal Time)",[26,41,55],{"_id":27,"slug":28,"__v":6,"author":7,"canonical":29,"category":10,"createdAt":30,"date":31,"description":32,"image":15,"imageAlt":15,"readingTime":16,"tags":33,"title":39,"updatedAt":40},"6a0d4ea4aa6b273b0cde629a","reasoning-lift-what-happens-to-brand-visibility-when-ai-thinks-harder","https://seogard.io/blog/reasoning-lift-what-happens-to-brand-visibility-when-ai-thinks-harder","2026-05-20T06:03:16.188Z","2026-05-20","Analyse technique de 200 réponses GPT-5.2 : le raisonnement élevé cite plus de sources, favorise le haut de funnel et redéfinit la visibilité de marque.",[34,35,36,37,38],"reasoning lift","AI search","brand visibility","GEO","LLM","Reasoning lift : impact du raisonnement IA sur la visibilité des marques","Wed May 20 2026 06:03:16 GMT+0000 (Coordinated Universal Time)",{"_id":42,"slug":43,"__v":6,"author":7,"canonical":44,"category":10,"createdAt":45,"date":31,"description":46,"image":15,"imageAlt":15,"readingTime":16,"tags":47,"title":53,"updatedAt":54},"6a0d86d3aa6b273b0c0cbec7","google-brings-ai-content-verification-to-search-via-sejournal-mattgsouthern","https://seogard.io/blog/google-brings-ai-content-verification-to-search-via-sejournal-mattgsouthern","2026-05-20T10:02:59.955Z","Google intègre SynthID à Search pour vérifier le contenu IA. Analyse technique des watermarks, impact sur le crawl et stratégies SEO concrètes.",[48,49,50,51,52],"google","synthid","ai content verification","search","seo technique","SynthID dans Search : impact technique sur le SEO","Wed May 20 2026 10:02:59 GMT+0000 (Coordinated Universal Time)",{"_id":56,"slug":57,"__v":6,"author":7,"canonical":58,"category":10,"createdAt":59,"date":31,"description":60,"image":15,"imageAlt":15,"readingTime":16,"tags":61,"title":67,"updatedAt":68},"6a0df755aa6b273b0c69952f","google-s-llms-txt-guidance-depends-on-which-product-you-ask-via-sejournal-mattgsouthern","https://seogard.io/blog/google-s-llms-txt-guidance-depends-on-which-product-you-ask-via-sejournal-mattgsouthern","2026-05-20T18:03:01.922Z","Google Search ignore llms.txt, mais Lighthouse l'audite pour l'agentic browsing. Analyse technique des contradictions et guide d'implémentation.",[62,63,64,65,66],"llms.txt","agentic browsing","Lighthouse","AI Search","Google","llms.txt : Google Search et Lighthouse se contredisent","Wed May 20 2026 18:03:01 GMT+0000 (Coordinated Universal Time)"]