{"id":84678,"date":"2026-07-22T13:55:55","date_gmt":"2026-07-22T12:55:55","guid":{"rendered":"https:\/\/kinsta.com\/it\/?p=84678&#038;preview=true&#038;preview_id=84678"},"modified":"2026-07-23T13:08:09","modified_gmt":"2026-07-23T12:08:09","slug":"ai-wordpress","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/","title":{"rendered":"Integrazione dell&#8217;AI in WordPress: un&#8217;analisi approfondita dell&#8217;architettura e un caso d&#8217;uso reale"},"content":{"rendered":"<p>Prima di <a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-7-0\/\">WordPress 7.0<\/a>, i <a href=\"https:\/\/kinsta.com\/it\/blog\/plugin-ai-wordpress\/\">plugin che aggiungevano funzionalit\u00e0 di AI<\/a> dovevano richiedere e gestire una chiave API per comunicare con un provider di AI.<\/p>\n<p>Questo comportava diversi svantaggi in termini di peso del codice e facilit\u00e0 di manutenzione. Dovevi includere nei tuoi plugin librerie SDK pesanti e proprietarie e scrivere richieste cURL specifiche per ogni provider.<\/p>\n<p>Questo scenario frammentato \u00e8 cambiato completamente con l&#8217;<a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-7-0\/#integration-with-ai\">integrazione nativa dell\u2019AI introdotta in WordPress 7.0<\/a>. Oggi, WordPress offre un\u2019interfaccia centralizzata per configurare le credenziali dei vari fornitori di AI, insieme a una nuova API PHP. Questa nuova architettura permette di inviare comandi, istruzioni, file multimediali e strutture di dati senza intoppi, mentre il core si occupa delle richieste.<\/p>\n<p>La nuova architettura offre vantaggi sostanziali sia agli amministratori del sito che agli sviluppatori di plugin.<\/p>\n<p>Gli amministratori non devono pi\u00f9 configurare le impostazioni di AI su pi\u00f9 plugin. A partire da WordPress 7.0, basta installare e abilitare i connettori dei plugin, inserire le chiavi API nell\u2019interfaccia unificata dei connettori, e questi diventano immediatamente disponibili per tutti i plugin basati sull\u2019AI presenti sul sito. Puoi monitorare facilmente l\u2019utilizzo dell\u2019AI, cambiare il tuo modello preferito o revocare l\u2019accesso di un fornitore per tutti i plugin con un solo clic.<\/p>\n<p>Per gli sviluppatori di plugin, i vantaggi sono ancora maggiori e spaziano dalla sicurezza dei dati alla portabilit\u00e0 del codice, fino a una drastica riduzione del <a href=\"https:\/\/kinsta.com\/it\/blog\/agenzie-wordpress-scalabili\/#technical-debt\">debito tecnico<\/a>.<\/p>\n<p>Ti va di intraprendere questo viaggio nella nuova architettura AI di WordPress? Partiamo!<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>I tre livelli dell\u2019architettura AI di WordPress<\/h2>\n<p>Oggi, i tuoi siti WordPress sono nativamente pronti per l\u2019AI. Non si tratta per\u00f2 di funzionalit\u00e0 AI pronte all\u2019uso, ma piuttosto delle basi per costruire siti web basati sull\u2019AI.<\/p>\n<p>La nuova architettura \u00e8 strutturata su tre livelli distinti:<br \/>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc><\/p>\n<h3>Connettore AI<\/h3>\n<p>Prima di <a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-7-0\/\">WordPress 7.0<\/a>, ogni plugin che aggiungeva funzionalit\u00e0 di AI al tuo sito aveva bisogno di un proprio sistema per archiviare e gestire le chiavi API. Le credenziali dovevano essere inserite direttamente nel codice del plugin o gestite tramite una pagina di impostazioni personalizzata. In entrambi i casi, era ben lungi dall\u2019essere una soluzione ideale per gestire dati sensibili.<\/p>\n<figure id=\"attachment_211404\" aria-describedby=\"caption-attachment-211404\" style=\"width: 1462px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-211404\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/connectors-screen.png\" alt=\"schermata Connectors\" width=\"1462\" height=\"1404\"><figcaption id=\"caption-attachment-211404\" class=\"wp-caption-text\">L\u2019interfaccia centralizzata dei connettori AI nella bacheca di WordPress.<\/figcaption><\/figure>\n<p>Un\u2019interfaccia unificata permette di configurare tutti i tuoi fornitori di servizi di AI in un unico posto. Questa interfaccia offre diversi vantaggi importanti per la gestione del sito.<\/p>\n<p>Dal punto di vista della gestione e della sicurezza, il vantaggio principale \u00e8 che devi configurare i tuoi provider una sola volta nell\u2019interfaccia di Connectors, dopodich\u00e9 puoi non pensarci pi\u00f9, indipendentemente dal numero di plugin che li utilizzano. Se dovessi mai cambiare le tue chiavi API, non dovrai riconfigurare ogni singolo plugin; potrai aggiornarle tutte in una volta sola nella schermata dei Connettori.<\/p>\n<p>Centralizzare le credenziali migliora anche la sicurezza del tuo sito, riducendo il rischio di esporre dati sensibili tramite plugin di terze parti che potrebbero essere scritti male o inaffidabili.<\/p>\n<p>Un altro vantaggio fondamentale \u00e8 la portabilit\u00e0 del codice. I tuoi plugin non devono pi\u00f9 sapere quale provider di AI utilizzi, perch\u00e9 la nuova architettura separa l\u2019autenticazione dalla logica del plugin. Ci\u00f2 significa che se cambi provider di IA, il tuo plugin continuer\u00e0 a funzionare senza richiedere la modifica di una sola riga di codice.<\/p>\n<p>Tuttavia, la vera svolta in termini di portabilit\u00e0 \u00e8 la possibilit\u00e0 per gli amministratori del sito di configurare pi\u00f9 connettori contemporaneamente. Quando un plugin invia una richiesta, WordPress seleziona automaticamente il provider di AI e il modello pi\u00f9 adatti per generare la risposta, in base sia alla <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/introducing-the-ai-client-in-wordpress-7-0\/#ai-model-preferences\" target=\"_blank\" rel=\"noopener noreferrer\">configurazione specifica del plugin<\/a> sia alle capacit\u00e0 dei modelli disponibili.<\/p>\n<h3>AI Client<\/h3>\n<p>Mentre la schermata &#8220;Connettori&#8221; offre l\u2019interfaccia utente per la configurazione dei provider di AI, il <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/introducing-the-ai-client-in-wordpress-7-0\/\" target=\"_blank\" rel=\"noopener noreferrer\">AI client<\/a> fornisce agli sviluppatori lo strumento operativo per comunicare con i modelli di AI.<\/p>\n<p>Si tratta di un\u2019interfaccia software nativa che standardizza l\u2019interazione con i modelli di intelligenza artificiale tramite la funzione globale <code>wp_ai_client_prompt()<\/code> e un insieme unificato di metodi PHP.<\/p>\n<h4>Riduzione del debito tecnico<\/h4>\n<p>Per gli sviluppatori, uno dei principali vantaggi della nuova architettura AI \u00e8 la riduzione del debito tecnico e delle dipendenze. Prima di WordPress 7.0, aggiungere funzionalit\u00e0 AI comportava un costo molto elevato in termini di manutenzione del codice. Dovevi integrare SDK proprietari di terze parti (come le librerie ufficiali di <a href=\"https:\/\/developers.openai.com\/api\/docs\/libraries\" target=\"_blank\" rel=\"noopener noreferrer\">OpenAI<\/a> o <a href=\"https:\/\/platform.claude.com\/docs\/en\/api\/client-sdks\" target=\"_blank\" rel=\"noopener noreferrer\">Anthropic<\/a>) e monitorare costantemente le versioni delle librerie. Questo comportava un codice del plugin molto pesante e apriva la strada a errori di compatibilit\u00e0.<\/p>\n<p>Inoltre, era necessario scrivere molte righe di codice per gestire la logica di rete e l\u2019analisi delle risposte. A peggiorare le cose, il codice era specifico per ogni fornitore, quindi se decidevi di cambiare fornitore di AI, dovevi riscrivere l\u2019intera architettura di rete del tuo plugin.<\/p>\n<p>AI Client risolve questo problema alla radice, trasferendo tutto questo lavoro pesante al core di WordPress. Il tuo codice diventa completamente indipendente dal fornitore di AI; devi solo scrivere le istruzioni una volta, e WordPress le tradurr\u00e0 nel \u201cdialetto\u201d specifico del modello.<\/p>\n<h4>Selezione intelligente dei modelli<\/h4>\n<p>Una potente funzionalit\u00e0 dell\u2019interfaccia Fluent di AI Client \u00e8 la possibilit\u00e0 di impostare i modelli preferiti tramite il metodo <code>using_model_preference()<\/code>, disponibile tramite la funzione di costruzione <code>wp_ai_client_prompt()<\/code>. Questo metodo ti permette di dichiarare un elenco ordinato di modelli per l\u2019attivit\u00e0 specifica del tuo plugin. Ad esempio, il codice seguente richiede la generazione di testo puntando a 3 modelli preferiti:<\/p>\n<pre><code class=\"language-php\">$text_result = wp_ai_client_prompt( 'Convert the following transcript into a concise, blog-ready draft.' )\n\t-&gt;using_model_preference(\n\t\t'gemini-2.5-flash',\n\t\t'claude-3-5-sonnet',\n\t\t'gpt-4o'\n\t)\n\t-&gt;generate_text();<\/code><\/pre>\n<p>WordPress controller\u00e0 i provider configurati nella schermata &#8220;Connettori&#8221; e analizzer\u00e0 l\u2019elenco dei modelli definiti nel codice del plugin, selezionando il primo connettore disponibile anche sul sito. Se nessuno dei modelli specificati nel tuo codice \u00e8 disponibile tra i connettori attivi, WordPress ignorer\u00e0 l\u2019elenco delle preferenze dei modelli e ricorrer\u00e0 al primo modello compatibile configurato sul sito.<\/p>\n<p>Questo meccanismo garantisce che il tuo plugin funzioni sempre, anche se l\u2019amministratore del sito passa a un fornitore di AI diverso.<\/p>\n<h3>Provider AI<\/h3>\n<p>Un provider di AI \u00e8 l\u2019azienda che possiede, addestra e ospita i modelli linguistici di grandi dimensioni (LLM) che usiamo ogni giorno. OpenAI, Google Gemini e Anthropic sono i provider di AI pi\u00f9 comuni supportati tramite connettori dedicati in WordPress 7.0, ma gli sviluppatori possono registrare ulteriori provider di AI personalizzati.<\/p>\n<p>Quando il codice del plugin chiama il metodo <code>generate_text()<\/code>\u00a0\u2014 o qualsiasi altro metodo di generazione \u2014 WordPress compila e invia un payload di dati al fornitore di AI tramite l\u2019endpoint stabilito dal connettore. Ecco la sequenza di operazioni che avviene dietro le quinte:<\/p>\n<ul>\n<li>Come primo passo, il provider di AI riceve il testo di input insieme a eventuali file multimediali allegati (payload di dati).<\/li>\n<li>Una volta ricevuta, elabora la richiesta, applicando eventuali istruzioni di sistema.<\/li>\n<li>Da l\u00ec, genera l\u2019output strutturato come testo libero o come oggetto JSON.<\/li>\n<li>Infine, invia l\u2019output a WordPress tramite una risposta HTTP.<\/li>\n<\/ul>\n<p>Ogni provider offre un\u2019ampia variet\u00e0 di modelli con diverse funzionalit\u00e0, velocit\u00e0 e prezzi. Questi vanno da modelli specializzati esclusivamente nell\u2019elaborazione del testo a modelli multimodali che accettano file multimediali (audio, immagini, video) insieme a un prompt di testo, fino a modelli progettati per compiti specifici, come la generazione di immagini o la conversione da voce a testo.<\/p>\n<figure id=\"attachment_211411\" aria-describedby=\"caption-attachment-211411\" style=\"width: 1718px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-211411\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/gemini-3-models.png\" alt=\"modelli Gemini 3\" width=\"1718\" height=\"1534\"><figcaption id=\"caption-attachment-211411\" class=\"wp-caption-text\">La famiglia di modelli Gemini 3 di Google.<\/figcaption><\/figure>\n<p>Anche in questo caso, i modelli disponibili per un sito WordPress dipendono dai fornitori di AI che l\u2019utente configura nella schermata \u201cConnettori\u201d. Questo significa che il plugin non impone quale fornitore specifico utilizzare.<\/p>\n<h2>Un&#8217;analisi approfondita della funzione wp_ai_client_prompt()<\/h2>\n<p>La funzione <code>wp_ai_client_prompt()<\/code> permette ai plugin di comunicare con i modelli di AI in modo standardizzato: non dovrai installare librerie esterne, gestire configurazioni specifiche per ogni fornitore n\u00e9 scrivere manualmente richieste HTTP.<\/p>\n<p>Si tratta di un\u2019interfaccia software che permette di scrivere il codice una sola volta, lasciando che sia WordPress a occuparsi del lavoro pi\u00f9 impegnativo e a tradurre le istruzioni nel \u201cdialetto\u201d specifico di ciascun modello.<\/p>\n<p>La funzione restituisce un\u2019istanza della <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_ai_client_prompt_builder\/\" target=\"_blank\" rel=\"noopener noreferrer\">classe <code>WP_AI_Client_Prompt_Builder<\/code><\/a>, che offre un\u2019interfaccia fluida di metodi concatenabili per personalizzare i tuoi prompt. La funzione \u00e8 <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/7.0\/src\/wp-includes\/ai-client\/class-wp-ai-client-prompt-builder.php#L33\" target=\"_blank\" rel=\"noopener noreferrer\">descritta come segue<\/a>:<\/p>\n<pre><code class=\"language-php\">\/**\n * Generatore \"fluent\" per la creazione di prompt di IA, che restituisce un WP_Error in caso di errore.\n *\n * Questa classe fornisce un'interfaccia \"fluent\" per la creazione di prompt con vari\n * tipi di contenuto e configurazioni di modello. Incorpora il PromptBuilder dell'SDK PHP AI Client\n * e aggiunge comportamenti specifici per WordPress, tra cui la gestione di WP_Error\n * al posto delle eccezioni, la denominazione dei metodi in snake_case e l'integrazione\n * con l'API di Abilities.\n *\n * Solo i metodi di generazione restituiranno un WP_Error, per non compromettere l\u2019interfaccia\n * fluida. Non appena viene intercettata un\u2019eccezione in una catena di chiamate ai metodi,\n * l\u2019istanza restituita entrer\u00e0 in uno stato di errore e tutte le successive chiamate ai metodi\n * saranno operazioni nulle che restituiranno semplicemente la stessa istanza in stato di errore. Solo\n * quando viene chiamato un metodo di generazione, verr\u00e0 restituito il WP_Error.\n *\/<\/code><\/pre>\n<p><code>wp_ai_client_prompt()<\/code> non effettua una richiesta HTTP immediata; invece, istanzia e restituisce un oggetto <code>WP_AI_Client_Prompt_Builder<\/code>. Pi\u00f9 di 50 metodi di configurazione popolano le propriet\u00e0 private dell\u2019oggetto utilizzando <a href=\"https:\/\/en.wikipedia.org\/wiki\/Fluent_interface\" target=\"_blank\" rel=\"noopener noreferrer\">un\u2019interfaccia fluida<\/a>, il che rende il codice altamente leggibile e facile da scrivere.<\/p>\n<p>Ecco un elenco non esaustivo dei metodi che userai pi\u00f9 spesso:<\/p>\n<ul>\n<li><code>with_text()<\/code>: aggiunge del testo al messaggio corrente.<\/li>\n<li><code>with_file()<\/code>: aggiunge un file al messaggio corrente.<\/li>\n<li><code>with_history()<\/code>: aggiunge i messaggi della cronologia della conversazione.<\/li>\n<li><code>using_model_preference()<\/code>: imposta i modelli preferiti da valutare in ordine.<\/li>\n<li><code>using_system_instruction()<\/code>: imposta l&#8217;istruzione di sistema.<\/li>\n<li><code>using_max_tokens()<\/code>: imposta il numero massimo di token da generare.<\/li>\n<li><code>using_temperature()<\/code>: imposta la temperatura per la generazione.<\/li>\n<li><code>using_top_p()<\/code>: imposta il valore top-p per la generazione.<\/li>\n<li><code>using_top_k()<\/code>: imposta il valore top-k per la generazione.<\/li>\n<li><code>as_output_file_type()<\/code>: imposta il tipo di file di output.<\/li>\n<li><code>as_json_response()<\/code>: configura il prompt per l&#8217;output della risposta JSON.<\/li>\n<li><code>is_supported_for_text_generation()<\/code>: verifica se la generazione di testo \u00e8 supportata dalla configurazione attiva.<\/li>\n<li><code>is_supported_for_image_generation()<\/code>: verifica se la generazione di immagini \u00e8 supportata dalla configurazione attiva.<\/li>\n<li><code>is_supported_for_text_to_speech_conversion()<\/code>: verifica se la conversione da testo a voce \u00e8 supportata dalla configurazione attiva.<\/li>\n<li><code>is_supported_for_video_generation()<\/code>: verifica se la generazione di video \u00e8 supportata dalla configurazione attiva.<\/li>\n<li><code>generate_text()<\/code>: genera un risultato testuale dal prompt.<\/li>\n<li><code>generate_image()<\/code>: genera un&#8217;immagine dal prompt.<\/li>\n<li><code>convert_text_to_speech()<\/code>: converte il testo in voce.<\/li>\n<li><code>generate_speech()<\/code>: genera un messaggio vocale dal prompt.<\/li>\n<li><code>generate_video()<\/code>: genera un video dal prompt.<\/li>\n<\/ul>\n<p>Per l\u2019elenco completo dei metodi, dai un\u2019occhiata al <a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/7.0\/src\/wp-includes\/ai-client\/class-wp-ai-client-prompt-builder.php#L33\" target=\"_blank\" rel=\"noopener noreferrer\">codice sorgente di WordPress<\/a>.<\/p>\n<p>Supponiamo che tu voglia trascrivere con precisione il contenuto di un file audio. Potresti usare la funzione come segue:<\/p>\n<pre><code class=\"language-php\">$transcription_builder = wp_ai_client_prompt( $prompt )\n\t-&gt;with_file( $audio_base64, $mime_type )\n\t-&gt;using_temperature( 0.1 );\n\nif ( ! $transcription_builder-&gt;is_supported_for_text_generation() ) {\n\t\/\/ No configured provider supports the current prompt configuration.\n\treturn new WP_Error(\n\t\t'no_supported_model',\n\t\t'No configured AI model can process this request. Configure a provider in Settings &gt; Connectors.',\n\t\tarray( 'status' =&gt; 400 )\n\t);\n}\n\n$transcript = $transcription_builder-&gt;generate_text();<\/code><\/pre>\n<p>Ecco cosa fa questo codice:<\/p>\n<ul>\n<li><code>$prompt<\/code>: rappresenta la stringa principale contenente le tue istruzioni principali.<\/li>\n<li><code>with_file()<\/code>: sblocca le funzionalit\u00e0 multimodali dell\u2019interfaccia. Nell\u2019esempio sopra, abbiamo passato il payload audio binario pre-codificato come stringa codificata in Base64 insieme al relativo tipo MIME.<\/li>\n<li><code>using_temperature()<\/code>: controlla il determinismo della risposta. Mentre un valore basso (0,1) costringe il modello a rimanere fedele all\u2019audio, un valore pi\u00f9 alto permette una maggiore libert\u00e0 creativa. Puoi combinare questo metodo con quello \u201c <code>using_top_p()<\/code> \u201d (Top-Probability) per un controllo pi\u00f9 preciso sull\u2019output.<\/li>\n<li><code>is_supported_for_text_generation()<\/code>: verifica se i connettori attivi supportano i requisiti del prompt corrente prima di impegnare risorse in una chiamata di rete.<\/li>\n<li><code>generate_text()<\/code>: questo \u00e8 il metodo di chiusura dell\u2019interfaccia Fluent. Invia la richiesta HTTP unificata al provider attivo e restituisce la stringa di testo generata oppure, in caso di errore, un oggetto <code>WP_Error<\/code>.<\/li>\n<\/ul>\n<p>In breve, abbiamo passato al provider AI un prompt di testo e un file audio allegato. Abbiamo impostato una temperatura bassa per garantire il risultato pi\u00f9 deterministico possibile, verificato che la configurazione attiva supportasse la generazione di testo e infine eseguito la trascrizione da voce a testo in base alla risposta dell\u2019AI.<\/p>\n<p>Con un altro prompt, possiamo restituire la trascrizione grezza all\u2019AI per generare una risposta strutturata come oggetto JSON:<\/p>\n<pre><code class=\"language-php\">$structured_json = wp_ai_client_prompt(\n\t\"Convert the following transcript into a concise, blog-ready draft in American English.n\" .\n\t\"Return JSON with a post title and body sections.n\" .\n\t\"Each section must have: heading, level (2 or 3), and paragraphs (array).n\" .\n\t\"If useful, include bullet_points (array) for short actionable lists.n\" .\n\t\"Use short, clear headings and readable paragraph text.nn\" .\n\t\"Transcript:n\" . $transcript\n)\n\t-&gt;using_system_instruction( \"You are a professional WordPress content editor. Always write in American English (use appropriate spelling, grammar, and conventions for that language variant).\" )\n\t-&gt;using_temperature( 0.4 )\n\t-&gt;as_json_response( $schema )\n\t-&gt;generate_text();<\/code><\/pre>\n<p>Per questo secondo prompt, usiamo metodi aggiuntivi per sfruttare altre funzionalit\u00e0 dell\u2019API:<\/p>\n<ul>\n<li><code>using_system_instruction()<\/code>: definisce il contesto operativo e il ruolo comportamentale del modello, separando nettamente la sua identit\u00e0 (\u201cun redattore professionista di contenuti WordPress\u201d) dal payload dei dati.<\/li>\n<li><code>using_temperature( 0.4 )<\/code>: imposta una &#8220;temperatura&#8221; pi\u00f9 alta rispetto al precedente compito di trascrizione, permettendo al modello di usare un vocabolario pi\u00f9 ricco e produrre un contenuto pi\u00f9 fluido.<\/li>\n<li><code>as_json_response()<\/code>: obbliga il modello a restituire una stringa JSON strutturata che corrisponda al layout definito nella variabile <code>$schema<\/code>. \u00c8 utile quando prepari contenuti per Gutenberg.<\/li>\n<\/ul>\n<p>Con un output strutturato come JSON, puoi estrarre singoli campi e mapparli a livello di programmazione nei blocchi nativi di Gutenberg utilizzando le funzioni principali di WordPress.<\/p>\n<p>Per una panoramica pi\u00f9 approfondita dell\u2019AI Client, dai un\u2019occhiata anche alla nota di sviluppo <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/introducing-the-ai-client-in-wordpress-7-0\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u201cIntroduzione all\u2019AI Client in WordPress 7.0<\/a>\u201d.<\/p>\n<h2>Convertire un file audio in contenuto pronto per Gutenberg con l\u2019AI<\/h2>\n<p>Ora che hai una migliore comprensione dei tre livelli dell\u2019architettura AI di WordPress, vediamo come tutto questo si integra con un esempio pratico. In questa sezione impareremo a costruire la logica di base di un plugin basato sull\u2019intelligenza artificiale, progettato per generare una bozza di post ben strutturata direttamente da un file audio.<\/p>\n<p>I casi d\u2019uso di questa funzionalit\u00e0 sono vasti e variegati. Immagina di creare un post completo per il blog partendo da una breve nota vocale inviata tramite la tua app di messaggistica preferita, oppure di trascrivere un\u2019intervista audio registrata sul tuo smartphone.<\/p>\n<p>Per implementare questa funzionalit\u00e0 sul tuo sito WordPress, dovrai creare un plugin personalizzato. Qui non tratteremo i file boilerplate n\u00e9 l\u2019intero processo di registrazione del plugin; per le nozioni di base sullo sviluppo dei plugin, puoi consultare <a href=\"https:\/\/kinsta.com\/it\/blog\/plugin-gutenberg\/\">altri tutorial<\/a> sul blog di Kinsta o la <a href=\"https:\/\/make.wordpress.org\/cli\/handbook\/how-to\/how-to-create-custom-plugins\/\" target=\"_blank\" rel=\"noopener noreferrer\">documentazione ufficiale di WordPress.org<\/a>.<\/p>\n<p>Ci concentreremo sulla logica di base che permette al plugin di comunicare con il provider di AI. Ma non preoccuparti, il plugin \u00e8 disponibile per la consultazione e il download in <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\" target=\"_blank\" rel=\"noopener noreferrer\">questo repository GitHub<\/a>.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Il plugin di esempio di questo tutorial \u00e8 stato realizzato su WordPress 7.0. Non funzioner\u00e0 su versioni precedenti del CMS.<\/p>\n<\/aside>\n\n<h3>Cosa fa questo plugin<\/h3>\n<p>Per iniziare, vai alla <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\" target=\"_blank\" rel=\"noopener noreferrer\">pagina del progetto su GitHub<\/a> e scarica l\u2019archivio ZIP del plugin. Poi, accedi alla tua dashboard di WordPress 7.0 e caricalo da <strong>Plugin<\/strong> &gt; <strong>Aggiungi plugin<\/strong> &gt; <strong>Carica plugin<\/strong>. Una volta installato e attivato il plugin, avrai tutto ci\u00f2 che serve per seguire questo tutorial.<\/p>\n<p>Il plugin <strong>AI Content Builder<\/strong> genera una barra laterale delle impostazioni personalizzate, accessibile tramite un\u2019icona situata nell\u2019angolo in alto a destra dell\u2019interfaccia dell\u2019editor a blocchi. Questa barra laterale presenta un\u2019interfaccia dedicata per caricare file audio e un pulsante che permette all\u2019AI di sovrascrivere il titolo attuale del post.<\/p>\n<figure id=\"attachment_211625\" aria-describedby=\"caption-attachment-211625\" style=\"width: 1612px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-211625\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/ai-content-builder-sidebar.png\" alt=\"La barra laterale di AI Content Builder\" width=\"1612\" height=\"1054\"><figcaption id=\"caption-attachment-211625\" class=\"wp-caption-text\">Il plugin AI Content Builder aggiunge una barra laterale delle impostazioni personalizzate all\u2019editor a blocchi.<\/figcaption><\/figure>\n<p>Il pulsante <strong>Upload audio note<\/strong> apre il caricatore multimediale di WordPress, permettendoti di caricare un nuovo file audio o di selezionarne uno esistente dalla libreria multimediale.<\/p>\n<figure id=\"attachment_211626\" aria-describedby=\"caption-attachment-211626\" style=\"width: 1560px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-211626\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/select-or-upload-media.png\" alt=\"La libreria multimediale di WordPress\" width=\"1560\" height=\"1328\"><figcaption id=\"caption-attachment-211626\" class=\"wp-caption-text\">Seleziona o carica file audio nella libreria multimediale di WordPress.<\/figcaption><\/figure>\n<p>Una volta caricato il file audio, il pulsante <strong>Generate Content<\/strong> avvia una richiesta asincrona al provider di AI attivo.<\/p>\n<figure id=\"attachment_211627\" aria-describedby=\"caption-attachment-211627\" style=\"width: 1616px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-211627\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/generate-content-button.png\" alt=\"La barra laterale del plugin\" width=\"1616\" height=\"1062\"><figcaption id=\"caption-attachment-211627\" class=\"wp-caption-text\">La barra laterale del plugin con il pulsante \u201cGenera contenuto\u201d attivo.<\/figcaption><\/figure>\n<p>L&#8217;immagine qui sotto mostra la bozza finale del post generata dall&#8217;AI in pochi secondi.<\/p>\n<figure id=\"attachment_211628\" aria-describedby=\"caption-attachment-211628\" style=\"width: 1612px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-211628\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/ai-generated-post-content.png\" alt=\"Markup generato dall'AI\" width=\"1612\" height=\"1336\"><figcaption id=\"caption-attachment-211628\" class=\"wp-caption-text\">Una bozza di post per il blog ben formattata, generata dall&#8217;AI a partire da un file audio grezzo.<\/figcaption><\/figure>\n<p>Il contenuto risultante \u00e8 strutturato in blocchi nativi di Gutenberg, inclusi paragrafi, titoli ed elenchi.<\/p>\n<figure id=\"attachment_211629\" aria-describedby=\"caption-attachment-211629\" style=\"width: 1616px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-211629\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/post-content-in-code-editor.png\" alt=\"Markup ben strutturato nell\u2019editor di codice di WordPress.\" width=\"1616\" height=\"1396\"><figcaption id=\"caption-attachment-211629\" class=\"wp-caption-text\">Markup ben strutturato nell\u2019editor di codice di WordPress.<\/figcaption><\/figure>\n<p>Ora vediamo un po\u2019 come funziona il plugin.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Questo plugin \u00e8 stato creato appositamente per questo tutorial ed \u00e8 solo a scopo illustrativo. Non usarlo in produzione.<\/p>\n<\/aside>\n\n<h3>Cosa serve per questo plugin<\/h3>\n<p>Ecco i requisiti di base per creare un plugin WordPress che si integri con la nuova architettura AI per generare i contenuti dei post:<\/p>\n<ul>\n<li>WordPress 7.0<\/li>\n<li>Una chiave API di un provider di AI che offra un modello in grado di convertire il parlato in testo. Nel nostro esempio useremo Google AI.<\/li>\n<li>Il tuo IDE preferito. Per questo plugin abbiamo usato VS Code.<\/li>\n<li>Una solida conoscenza dello sviluppo di WordPress e Gutenberg, delle API REST, di PHP e JavaScript.<\/li>\n<\/ul>\n<p>Non devi preoccuparti di Node.js, dei processi di compilazione o dell\u2019importazione di librerie esterne, perch\u00e9 questo plugin si basa interamente sulle API native del core di WordPress. Il risultato \u00e8 un plugin leggero e sicuro, senza alcun debito tecnico.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>A causa dei limiti di spazio, le sezioni seguenti si concentreranno esclusivamente sul codice che gestisce la comunicazione con l\u2019AI Client e la gestione dei contenuti generati dall\u2019AI. Il resto del codice \u00e8 documentato in modo completo nel <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/tree\/35ef318c10768969e235c89617a59cc4b6b38eb4\" target=\"_blank\" rel=\"noopener noreferrer\">repository GitHub<\/a>.<\/p>\n<\/aside>\n\n<h3>Struttura del plugin e versione minima di WordPress<\/h3>\n<p>Il plugin AI Content Builder \u00e8 composto da soli due file:<\/p>\n<ul>\n<li><code>ai-content-builder.php<\/code><\/li>\n<li><code>editor.js.<\/code><\/li>\n<\/ul>\n<p>La versione minima richiesta di WordPress \u00e8 la 7.0, quindi assicurati di impostarla nell\u2019intestazione del plugin:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\/**\n * Plugin Name: AI Content Builder\n * Description: Gutenberg sidebar plugin that uploads audio and generates post content using the WordPress 7.0 AI Client.\n * Version: 1.0.0\n * Requires at least: 7.0\n * Requires PHP: 8.0\n * Author: Your Name\n * License: GPL-2.0-or-later\n * Text Domain: ai-content-builder\n *\/<\/code><\/pre>\n<p>Tenendo presente questo, diamo un\u2019occhiata al processo di creazione di un plugin basato sull\u2019AI per WordPress.<\/p>\n<h3>Il flusso dei dati del plugin<\/h3>\n<p>Prima di addentrarci nel codice, diamo un\u2019occhiata a come i dati fluiscono dal backend di WordPress (l\u2019editor a blocchi) al server PHP e al provider di AI, per poi tornare indietro.<\/p>\n<p><a href=\"#register-api-endpoint\">1. Dal browser al server &#8211; chiamata REST asincrona<\/a>: il browser invia l\u2019ID dell\u2019audio all\u2019endpoint REST personalizzato del plugin. Per evitare che l\u2019interfaccia utente si blocchi, registriamo un endpoint REST che consente richieste asincrone al server PHP.<\/p>\n<p><a href=\"#first-ai-pass\">2. Primo passaggio dell\u2019AI &#8211; trascrizione da voce a testo<\/a>: il server intercetta la richiesta, recupera l\u2019audio dal database e interroga il client AI per estrarre la trascrizione testuale grezza.<\/p>\n<p><a href=\"#second-ai-pass\">3. Secondo passaggio dell\u2019AI &#8211; strutturazione dei contenuti<\/a>: il server rimanda la trascrizione grezza al client AI e richiede che venga formattata come oggetto JSON strutturato.<\/p>\n<p><a href=\"#block-generation\">4. Hydration dei dati e generazione dei blocchi<\/a>: lo script JavaScript (JS) riceve l\u2019oggetto JSON strutturato, lo normalizza e mappa i campi ai blocchi nativi di Gutenberg.<\/p>\n<p>Ora diamo un\u2019occhiata alla logica alla base di ogni fase.<\/p>\n<h3 id=\"register-api-endpoint\">1. Registrare un endpoint API personalizzato<\/h3>\n<p>Il primo passo per creare il plugin <strong>AI Content Builder<\/strong> \u00e8 registrare un endpoint API. Questo \u00e8 fondamentale perch\u00e9 l\u2019elaborazione di un file audio e la generazione di una risposta possono richiedere diversi secondi (o addirittura minuti) al modello di AI. <strong>Registrare un endpoint REST permette di effettuare richieste asincrone tramite i controlli della barra laterale, evitando che l\u2019interfaccia utente si blocchi.<\/strong><\/p>\n<p>Registrare un endpoint API permette anche di effettuare chiamate AI sicure senza esporre le credenziali di accesso, sfruttando il sistema di autenticazione nativo di WordPress.<\/p>\n<p>La logica per registrare e inizializzare l\u2019endpoint \u00e8 gestita nel file PHP del plugin utilizzando i due metodi di classe <code>init()<\/code> e <code>register_rest_routes()<\/code>.<\/p>\n<pre><code class=\"language-php\">public static function init(): void {\n\n\t\/\/ Register the custom REST endpoint used by the sidebar JS.\n\tadd_action( 'rest_api_init', array( __CLASS__, 'register_rest_routes' ) );\n\n\t...\n}<\/code><\/pre>\n<p>Collegando la chiamata alla funzione all\u2019hook <code>rest_api_init<\/code>, il plugin registra la root dell\u2019endpoint solo quando viene attivata una richiesta API REST. Questo migliora le prestazioni evitando ritardi inutili nel caricamento della pagina.<\/p>\n<p>Puoi configurare i percorsi usando il metodo <code>register_rest_routes()<\/code>\u00a0come mostrato nel codice qui sotto:<\/p>\n<pre><code class=\"language-php\">public static function register_rest_routes(): void {\n\tregister_rest_route(\n\t\tself::REST_NAMESPACE,\n\t\tself::REST_ROUTE,\n\t\tarray(\n\t\t\t'methods'             =&gt; WP_REST_Server::CREATABLE, \/\/ Alias for POST.\n\t\t\t'callback'            =&gt; array( __CLASS__, 'handle_generate_request' ),\n\t\t\t'permission_callback' =&gt; static function (): bool {\n\t\t\t\t\/\/ Reject unauthenticated or insufficiently privileged requests early.\n\t\t\t\treturn current_user_can( 'edit_posts' );\n\t\t\t},\n\t\t\t'args'                =&gt; array(\n\t\t\t\t'audio_id' =&gt; array(\n\t\t\t\t\t'type'     =&gt; 'integer',\n\t\t\t\t\t'required' =&gt; true,\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t);\n}<\/code><\/pre>\n<p>Questo metodo fa quanto segue:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_rest_route\/\" target=\"_blank\" rel=\"noopener noreferrer\">La funzione <code>register_rest_route()<\/code><\/a>\u00a0accetta tre parametri: lo spazio dei nomi del percorso, il percorso stesso e un array di configurazione.<\/li>\n<li><code>WP_REST_Server::CREATABLE<\/code> \u00e8 un alias per il metodo di trasporto POST, utilizzato per garantire la massima compatibilit\u00e0 con l\u2019architettura interna di WordPress.<\/li>\n<li><code>permission_callback<\/code> \u00e8 una funzione anonima che limita l\u2019accesso agli utenti autenticati che hanno il permesso di creare e modificare i propri post. WordPress blocca quindi la richiesta prima di elaborarla e restituisce automaticamente un errore <a href=\"https:\/\/kinsta.com\/it\/blog\/errore-401\/\">401 Unauthorized<\/a> o <a href=\"https:\/\/kinsta.com\/it\/blog\/errore-403-forbidden\/\">403 Forbidden<\/a> in caso di accesso non autorizzato.<\/li>\n<li><code>args<\/code> \u00c8 un array opzionale di parametri aggiuntivi che puoi usare per modificare la risposta dell\u2019API. Permette di specificare i dati che la richiesta all\u2019endpoint deve restituire.<\/li>\n<li><code>audio_id<\/code> \u00e8 un array di parametri che specifica il tipo di dati richiesti. Se il tipo di dati restituito non \u00e8 un numero intero o manca, l\u2019API REST interrompe l\u2019esecuzione e genera un errore.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Per ulteriori informazioni su <a href=\"https:\/\/developer.wordpress.org\/rest-api\/extending-the-rest-api\/routes-and-endpoints\/\" target=\"_blank\" rel=\"noopener noreferrer\">percorsi ed endpoint<\/a>, consulta la documentazione ufficiale.<\/p>\n<\/aside>\n\n<p>Infine, assicurati che la barra laterale dell\u2019editor sappia dove inviare i dati. Per farlo, usa la funzione <code>wp_localize_script()<\/code> all\u2019interno del metodo <code>enqueue_editor_assets()<\/code>.<\/p>\n<pre><code class=\"language-php\">public static function enqueue_editor_assets(): void {\n\t...\n\n\twp_localize_script(\n\t\t'ai-content-builder-editor',\n\t\t'AICBData',\n\t\tarray(\n\t\t\t'restPath' =&gt; '\/' . self::REST_NAMESPACE . self::REST_ROUTE,\n\t\t\t'nonce'    =&gt; wp_create_nonce( 'wp_rest' ),\n\t\t)\n\t);\n}<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_localize_script\/\" target=\"_blank\" rel=\"noopener noreferrer\">La funzione <code>wp_localize_script()<\/code><\/a> viene usata principalmente per associare uno script registrato ai dati di una variabile JavaScript, ma qui la usiamo per passare i dati da PHP a JavaScript tramite l\u2019oggetto globale <code>AICBData<\/code>.<\/li>\n<li><code>restPath<\/code> \u00e8 l&#8217;indirizzo dell&#8217;endpoint; specificarlo qui ti permette di evitare di inserirlo in modo statico nel file JavaScript.<\/li>\n<li><code>nonce<\/code> imposta un token di sicurezza per <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_create_nonce\/\" target=\"_blank\" rel=\"noopener noreferrer\">impedire accessi non autorizzati<\/a>.<\/li>\n<\/ul>\n<h3 id=\"first-ai-pass\">2. Accedere al client AI per estrarre il testo da un file audio<\/h3>\n<p>Il cuore del nostro plugin \u00e8 il metodo <code>handle_generate_request()<\/code>. Questo metodo esegue una sequenza di operazioni, che inizia con i controlli di sicurezza e termina con la generazione del contenuto del post da inserire nell\u2019editor dei blocchi.<\/p>\n<p>Per prima cosa, verifica che il client AI sia disponibile e che il supporto AI non sia stato disabilitato sul sito.<\/p>\n<pre><code class=\"language-php\">public static function handle_generate_request( WP_REST_Request $request ) {\n\tif ( ! function_exists( 'wp_ai_client_prompt' ) ) {\n\t\treturn new WP_Error(\n\t\t\t'ai_client_unavailable',\n\t\t\t'WordPress AI Client is not available. This plugin requires WordPress 7.0 .',\n\t\t\tarray( 'status' =&gt; 500 )\n\t\t);\n\t}\n\n\tif ( function_exists( 'wp_supports_ai' ) && ! wp_supports_ai() ) {\n\t\treturn new WP_Error(\n\t\t\t'ai_disabled',\n\t\t\t'AI support is disabled on this site.',\n\t\t\tarray( 'status' =&gt; 403 )\n\t\t);\n\t}\n\t...\n}<\/code><\/pre>\n<p>In caso di errore, i controlli restituiscono rispettivamente un errore 500 o 403.<\/p>\n<p>Il blocco di codice successivo esegue le seguenti azioni:<\/p>\n<ul>\n<li>Estrae l\u2019ID del file audio dalla richiesta<\/li>\n<li>Si assicura che l\u2019ID del file audio sia un numero intero positivo<\/li>\n<li>Controlla il tipo di file<\/li>\n<li>Recupera il tipo MIME<\/li>\n<li>Estrae e codifica il contenuto del file in Base64<\/li>\n<\/ul>\n<pre><code class=\"language-php\">$audio_id = absint( $request-&gt;get_param( 'audio_id' ) );\nif ( ! $audio_id ) {\n\treturn new WP_Error( 'invalid_audio_id', 'Invalid audio ID.', array( 'status' =&gt; 400 ) );\n}\n\n$attachment = get_post( $audio_id );\nif ( ! $attachment || 'attachment' !== $attachment-&gt;post_type ) {\n\treturn new WP_Error( 'audio_not_found', 'Audio attachment not found.', array( 'status' =&gt; 404 ) );\n}\n\n$mime_type = (string) get_post_mime_type( $audio_id );\nif ( 0 !== strpos( $mime_type, 'audio\/' ) ) {\n\treturn new WP_Error( 'invalid_audio_type', 'Attachment must be an audio file.', array( 'status' =&gt; 400 ) );\n}\n\n$audio_path = get_attached_file( $audio_id );\nif ( ! $audio_path || ! file_exists( $audio_path ) ) {\n\treturn new WP_Error( 'audio_path_missing', 'Audio file path not found on server.', array( 'status' =&gt; 404 ) );\n}\n\n$audio_bytes = file_get_contents( $audio_path );\nif ( false === $audio_bytes ) {\n\treturn new WP_Error( 'audio_read_failed', 'Unable to read audio file.', array( 'status' =&gt; 500 ) );\n}\n\n$audio_base64 = base64_encode( $audio_bytes );<\/code><\/pre>\n<figure id=\"attachment_211767\" aria-describedby=\"caption-attachment-211767\" style=\"width: 1594px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-211767\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/mime-type-error.png\" alt=\"Errore: tipo di file non valido\" width=\"1594\" height=\"1190\"><figcaption id=\"caption-attachment-211767\" class=\"wp-caption-text\">Viene generato un messaggio di errore quando l&#8217;utente prova a elaborare un tipo di file non valido<\/figcaption><\/figure>\n<p>In questo modo, il file binario \u00e8 stato convertito in una stringa che pu\u00f2 essere passata all&#8217;AI Client. Ora possiamo passare all&#8217;estrazione del testo:<\/p>\n<pre><code class=\"language-php\">$output_language = self::get_output_language();\n\n$transcription_builder = wp_ai_client_prompt(\n\t\"Transcribe this voice note accurately into $output_language. Return plain text only.\"\n)\n\t-&gt;with_file( $audio_base64, $mime_type )\n\t-&gt;using_temperature( 0.1 );\n\nif ( ! $transcription_builder-&gt;is_supported_for_text_generation() ) {\n\treturn new WP_Error(\n\t\t'no_supported_model',\n\t\t'No configured AI model can process this request. Configure a provider in Settings &gt; Connectors.',\n\t\tarray( 'status' =&gt; 400 )\n\t);\n}\n\n$transcript = $transcription_builder-&gt;generate_text();<\/code><\/pre>\n<p>Ecco una spiegazione dettagliata di cosa fa il codice qui sopra.<\/p>\n<ul>\n<li><code>get_output_language()<\/code> \u00e8 un metodo statico definito altrove nello script che restituisce le impostazioni locali del sito. (Vedi <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/ai-content-builder.php#L135\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub<\/a>.)<\/li>\n<li><code>wp_ai_client_prompt()<\/code> inizializza una nuova richiesta passando il prompt principale.<\/li>\n<li><code>with_file()<\/code> comunica all\u2019AI Client che stiamo inviando una richiesta multimodale; accetta il contenuto del file in Base64 e il tipo MIME.<\/li>\n<li><code>using_temperature()<\/code>\u00a0permette di specificare il livello di determinismo della risposta. Impostiamo un valore basso per ottenere una trascrizione fedele dell\u2019audio.<\/li>\n<li>Il metodo <code>is_supported_for_text_generation()<\/code>\u00a0verifica se il provider AI \u00e8 in grado di generare testo dai dati forniti; se il provider non supporta l\u2019input multimodale, il plugin si interrompe e restituisce un messaggio di errore.<\/li>\n<li>Il metodo <code>generate_text()<\/code>\u00a0avvia la richiesta HTTP.<\/li>\n<\/ul>\n<h3 id=\"second-ai-pass\">3. Convertire la trascrizione audio in contenuto strutturato<\/h3>\n<p>Ora che abbiamo la trascrizione, il plugin deve comunicare di nuovo con il provider di AI per ottenere una risposta JSON strutturata. Per farlo, dobbiamo definire un array strutturato in formato JSON.<\/p>\n<pre><code class=\"language-php\">$schema = array(\n\t'type'       =&gt; 'object',\n\t'properties' =&gt; array(\n\t\t'title'    =&gt; array( 'type' =&gt; 'string' ),\n\t\t'sections' =&gt; array(\n\t\t\t'type'  =&gt; 'array',\n\t\t\t'items' =&gt; array(\n\t\t\t\t'type'       =&gt; 'object',\n\t\t\t\t'properties' =&gt; array(\n\t\t\t\t\t'heading'    =&gt; array( 'type' =&gt; 'string' ),\n\t\t\t\t\t'level'      =&gt; array(\n\t\t\t\t\t\t'type' =&gt; 'integer',\n\t\t\t\t\t),\n\t\t\t\t\t'paragraphs' =&gt; array(\n\t\t\t\t\t\t'type'  =&gt; 'array',\n\t\t\t\t\t\t'items' =&gt; array( 'type' =&gt; 'string' ),\n\t\t\t\t\t),\n\t\t\t\t\t'bullet_points' =&gt; array(\n\t\t\t\t\t\t'type'  =&gt; 'array',\n\t\t\t\t\t\t'items' =&gt; array( 'type' =&gt; 'string' ),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\t'required'   =&gt; array( 'heading', 'level', 'paragraphs' ),\n\t\t\t),\n\t\t),\n\t),\n\t'required'   =&gt; array( 'title', 'sections' ),\n);<\/code><\/pre>\n<p>Con questa struttura, l\u2019AI risponder\u00e0 con un oggetto JSON contenente un titolo e un array di sezioni. Ogni sezione deve contenere un header, un livello di header, almeno un paragrafo e dei punti elenco.<\/p>\n<p>Ora che lo schema \u00e8 definito, possiamo passare a configurare la seconda richiesta al client IA:<\/p>\n<pre><code class=\"language-php\">$structured_json = wp_ai_client_prompt(\n\t\"Convert the following transcript into a concise, blog-ready draft in $output_language.n\" .\n\t\"Return JSON with a post title and body sections.n\" .\n\t\"Each section must have: heading, level (2 or 3), and paragraphs (array).n\" .\n\t\"If useful, include bullet_points (array) for short actionable lists.n\" .\n\t\"Use short, clear headings and readable paragraph text.nn\" .\n\t\"Transcript:n\" . $transcript\n)\n\t-&gt;using_system_instruction( \"You are a professional WordPress content editor. Always write in $output_language (use appropriate spelling, grammar, and conventions for that language variant).\" )\n\t-&gt;using_temperature( 0.4 )\n\t-&gt;as_json_response( $schema )\n\t-&gt;generate_text();\n\nif ( is_wp_error( $structured_json ) ) {\n\treturn $structured_json;\n}<\/code><\/pre>\n<p>Analizziamo i punti chiave di questo codice:<\/p>\n<ul>\n<li><code>using_system_instruction()<\/code> definisce la personalit\u00e0 del modello.<\/li>\n<li><code>using_temperature( 0.4 )<\/code> imposta un valore di temperatura pi\u00f9 alto, dando all\u2019AI maggiore libert\u00e0 creativa per generare una risposta e produrre una prosa pi\u00f9 fluida e ricca.<\/li>\n<li><code>as_json_response( $schema )<\/code> indica al client di fornire la risposta in un formato strutturato.<\/li>\n<li>Il plugin si interrompe in caso di errore.<\/li>\n<\/ul>\n<p>Il passo successivo \u00e8 decodificare e pulire i dati.<\/p>\n<pre><code class=\"language-php\">$structured = json_decode( (string) $structured_json, true );\n\nif ( ! is_array( $structured ) ) {\n\treturn new WP_Error(\n\t\t'invalid_ai_json',\n\t\t'Could not parse structured AI response.',\n\t\tarray( 'status' =&gt; 500 )\n\t);\n}\n\n$normalized = self::normalize_structured_post( $structured );\n\nif ( '' === $normalized['title'] && empty( $normalized['sections'] ) ) {\n\treturn new WP_Error(\n\t\t'empty_structured_content',\n\t\t'The AI provider returned empty structured content.',\n\t\tarray( 'status' =&gt; 500 )\n\t);\n}<\/code><\/pre>\n<p>Nel codice qui sopra:<\/p>\n<ul>\n<li>La funzione <code>json_decode()<\/code> converte la stringa JSON in un array associativo PHP.<\/li>\n<li>Se il JSON \u00e8 malformato, il controllo seguente restituisce un codice di stato 500 insieme a un messaggio di errore chiaro.<\/li>\n<li>Il metodo statico <code>normalize_structured_post()<\/code> pulisce e normalizza l&#8217;output del provider prima di passarlo a JavaScript (dai un&#8217;occhiata alla definizione di questa funzione su <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/ai-content-builder.php#L476\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub<\/a>).<\/li>\n<\/ul>\n<p>L&#8217;unica cosa che resta da fare ora \u00e8 passare l&#8217;output risultante a JavaScript per generare blocchi Gutenberg nativi.<\/p>\n<h3 id=\"block-generation\">4. Generazione dell\u2019output pronto per Gutenberg<\/h3>\n<p>Il passo successivo consiste nel mappare l\u2019output JSON ai blocchi nativi di Gutenberg. Questa fase avviene sul lato client ed \u00e8 gestita dal file ` <code>editor.js<\/code> `.<\/p>\n<p>Quando l\u2019utente seleziona un file audio, viene eseguito il <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L342\" target=\"_blank\" rel=\"noopener noreferrer\">codice seguente<\/a>:<\/p>\n<pre><code class=\"language-javascript\">function AIContentBuilderSidebar() {\n\n\tconst [ audioId, setAudioId ] = useState( 0 );\n\t...\n\n\tconst onSelectAudio = function ( media ) {\n\t\tif ( ! media || ! media.id ) {\n\t\t\treturn;\n\t\t}\n\t\tsetAudioId( media.id );\n\t\tsetAudioLabel( media.title || media.filename || ( 'Audio #'   media.id ) );\n\t\tsetNotice( null );\n\t};\n\t...\n}<\/code><\/pre>\n<p>Questo codice recupera l\u2019ID del file audio registrato dal database di WordPress.<\/p>\n<p>Quando l\u2019utente clicca sul pulsante <strong>Generate Content<\/strong>, la <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L382\" target=\"_blank\" rel=\"noopener noreferrer\">funzione <code>onGenerate()<\/code><\/a>usa <code>apiFetch()<\/code> per inviare una richiesta POST all\u2019endpoint dell\u2019API, includendo, tra le altre cose, l\u2019ID dell\u2019audio.<\/p>\n<pre><code class=\"language-javascript\">const onGenerate = async function () {\n\n\t...\n\n\ttry {\n\t\tconst response = await apiFetch( {\n\t\t\tpath: AICBData.restPath,\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'X-WP-Nonce': AICBData.nonce,\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\taudio_id: audioId,\n\t\t\t},\n\t\t} );\n\t\t...\n\t}\n\t...\n}<\/code><\/pre>\n<ul>\n<li><code>await<\/code> mette temporaneamente in pausa la funzione per evitare che il browser si blocchi mentre si attende la risposta dell\u2019IA.<\/li>\n<li>Una volta ricevuto, l\u2019oggetto JSON viene memorizzato temporaneamente nella variabile <code>response<\/code>.<\/li>\n<\/ul>\n<p>Il contenuto della variabile <code>response<\/code>\u00a0sar\u00e0 un oggetto strutturato come segue:<\/p>\n<pre><code class=\"language-json\">{\n\ttitle: \"Two Wheels to the Medina: ...\",\n\tsections: [\n\t\t{\n\t\t\theading: \"A Well-Deserved Rest in the Red City\",\n\t\t\tlevel: 2,\n\t\t\tparagraphs: [ \"On April 24th, our group of seven motorcyclists...\" ],\n\t\t\tbullet_points: []\n\t\t},\n\t\t{\n\t\t\theading: \"Diving into the Medina and Jemaa el-Fnaa\",\n\t\t\tlevel: 2,\n\t\t\tparagraphs: [ \"We spent the day exploring the historic Medina...\" ],\n\t\t\tbullet_points: [ \n\t\t\t\t\"Navigating the vibrant, maze-like alleys of the ancient Medina\", \n\t\t\t\t\"Tasting traditional Berber tagines and Moroccan mint tea\",\n\t\t\t\t\"Shopping for handmade leather goods, spices, and lanterns in the souks\" \n\t\t\t]\n\t\t},\n\t\t{...}\n\t],\n\tcontent: \"Fallback plain text...\",\n\ttranscript: \"Full transcript...\"\n}<\/code><\/pre>\n<p>Questo oggetto fornisce i dati necessari per creare i blocchi. Tuttavia, lo script potrebbe ricevere sia una stringa JSON che un JSON annidato all\u2019interno di un oggetto. Pertanto, \u00e8 necessario un ulteriore passaggio di normalizzazione prima di estrarre i dati per la generazione dei blocchi:<\/p>\n<pre><code class=\"language-javascript\">const normalizedSections = normalizeSectionsPayload( response.sections );<\/code><\/pre>\n<ul>\n<li>La funzione <code>normalizeSectionsPayload()<\/code>\u00a0normalizza i payload incerti di <code>sections<\/code>\u00a0trasformandoli in un array. (Vedi <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L171\" target=\"_blank\" rel=\"noopener noreferrer\">il codice su GitHub<\/a>.)<\/li>\n<\/ul>\n<p>Successivamente, la variabile <code>normalizedSections<\/code>\u00a0viene passata come argomento alla <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L60\" target=\"_blank\" rel=\"noopener noreferrer\">funzione che converte<\/a> i campi <code>sections<\/code>\u00a0in blocchi nativi di Gutenberg:<\/p>\n<pre><code class=\"language-javascript\">const structuredBlocks = buildBlocksFromSections( normalizedSections );<\/code><\/pre>\n<p>Ecco un estratto dalla funzione <code>buildBlocksFromSections()<\/code>:<\/p>\n<pre><code class=\"language-javascript\">function buildBlocksFromSections( sections ) {\n\tif ( ! Array.isArray( sections ) ) {\n\t\treturn [];\n\t}\n\n\tconst blocks = [];\n\n\tsections.forEach( function ( section ) {\n\t\tif ( ! section || 'object' !== typeof section ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst heading =\n\t\t\t\t( 'string' === typeof section.heading )\n\t\t\t\t\t? section.heading.trim()\n\t\t\t\t\t: '';\n\n\t\t\tconst level = ( 3 === section.level ) ? 3 : 2;\n\n\t\t\tif ( heading ) {\n\t\t\t\tblocks.push(\n\t\t\t\t\tcreateBlock( 'core\/heading', {\n\t\t\t\t\t\tcontent: heading,\n\t\t\t\t\t\tlevel: level,\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t...\n\n\t\t} );\n\treturn blocks;\n}<\/code><\/pre>\n<p>Nel codice qui sopra, il ciclo <code>forEach()<\/code> scorre l\u2019array di dati, estraendo <code>section.heading<\/code> e <code>section.level<\/code> da usare con la funzione nativa <code>createBlock()<\/code>.<\/p>\n<p>Per la mappatura di <code>section.paragraphs<\/code> e <code>section.bullet_points<\/code>, dai un\u2019occhiata al <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L60\" target=\"_blank\" rel=\"noopener noreferrer\">codice sorgente su GitHub<\/a>.<\/p>\n<h2>Possibilit\u00e0 di estensione infinite<\/h2>\n<p>L\u2019introduzione dell\u2019AI in WordPress apre orizzonti completamente nuovi sia per gli amministratori dei siti che per gli sviluppatori. Mentre prima dovevi costruire un\u2019intera infrastruttura di rete da zero solo per integrare funzionalit\u00e0 di AI nel tuo sito WordPress, ora automatizzare il tuo flusso di lavoro editoriale e aggiungere funzionalit\u00e0 basate sull\u2019AI \u00e8 diventato incredibilmente semplice.<\/p>\n<p>Il plugin di esempio presentato nella seconda parte di questo articolo mette in evidenza solo un singolo caso d\u2019uso. Tuttavia, dimostra chiaramente come ora sia possibile creare strumenti che semplificano drasticamente la gestione del sito e la modifica dei contenuti. Inoltre, questa architettura sblocca funzionalit\u00e0 avanzate che prima erano troppo complesse da implementare o troppo costose.<\/p>\n<p>Eppure, siamo solo all\u2019inizio. L\u2019intelligenza artificiale \u00e8 una realt\u00e0 in continua evoluzione che, senza dubbio, dar\u00e0 il via a un\u2019enorme ondata di innovazione.<\/p>\n<p>A proposito di innovazione&#8230; Hai gi\u00e0 provato l\u2019hosting di Kinsta? Se vuoi potenziare il tuo sito web con la migliore tecnologia disponibile oggi per WordPress, <a href=\"https:\/\/kinsta.com\/it\/prezzi\/\">prova Kinsta senza rischi<\/a> o <a href=\"https:\/\/kinsta.com\/it\/contatta-il-servizio-vendite\/\">contatta il nostro team commerciale<\/a> per saperne di pi\u00f9.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Prima di WordPress 7.0, i plugin che aggiungevano funzionalit\u00e0 di AI dovevano richiedere e gestire una chiave API per comunicare con un provider di AI. Questo &#8230;<\/p>\n","protected":false},"author":36,"featured_media":84679,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[25873],"class_list":["post-84678","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-sviluppo-wordpress"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Integrazione dell&#039;AI in WordPress: architettura ed esempio pratico<\/title>\n<meta name=\"description\" content=\"Esplora la nuova infrastruttura AI di WordPress. Scopri la sua architettura nativa, i flussi di lavoro interni e un caso d\u2019uso reale di conversione da audio a testo.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Integrazione dell&#039;AI in WordPress: un&#039;analisi approfondita dell&#039;architettura e un caso d&#039;uso reale\" \/>\n<meta property=\"og:description\" content=\"Esplora la nuova infrastruttura AI di WordPress. Scopri la sua architettura nativa, i flussi di lavoro interni e un caso d\u2019uso reale di conversione da audio a testo.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-22T12:55:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-23T12:08:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1470\" \/>\n\t<meta property=\"og:image:height\" content=\"735\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Esplora la nuova infrastruttura AI di WordPress. Scopri la sua architettura nativa, i flussi di lavoro interni e un caso d\u2019uso reale di conversione da audio a testo.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Integrazione dell&#8217;AI in WordPress: un&#8217;analisi approfondita dell&#8217;architettura e un caso d&#8217;uso reale\",\"datePublished\":\"2026-07-22T12:55:55+00:00\",\"dateModified\":\"2026-07-23T12:08:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/\"},\"wordCount\":4188,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/\",\"name\":\"Integrazione dell'AI in WordPress: architettura ed esempio pratico\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"datePublished\":\"2026-07-22T12:55:55+00:00\",\"dateModified\":\"2026-07-23T12:08:09+00:00\",\"description\":\"Esplora la nuova infrastruttura AI di WordPress. Scopri la sua architettura nativa, i flussi di lavoro interni e un caso d\u2019uso reale di conversione da audio a testo.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sviluppo di WordPress\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/sviluppo-wordpress\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Integrazione dell&#8217;AI in WordPress: un&#8217;analisi approfondita dell&#8217;architettura e un caso d&#8217;uso reale\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/it\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Integrazione dell'AI in WordPress: architettura ed esempio pratico","description":"Esplora la nuova infrastruttura AI di WordPress. Scopri la sua architettura nativa, i flussi di lavoro interni e un caso d\u2019uso reale di conversione da audio a testo.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/","og_locale":"it_IT","og_type":"article","og_title":"Integrazione dell'AI in WordPress: un'analisi approfondita dell'architettura e un caso d'uso reale","og_description":"Esplora la nuova infrastruttura AI di WordPress. Scopri la sua architettura nativa, i flussi di lavoro interni e un caso d\u2019uso reale di conversione da audio a testo.","og_url":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2026-07-22T12:55:55+00:00","article_modified_time":"2026-07-23T12:08:09+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Esplora la nuova infrastruttura AI di WordPress. Scopri la sua architettura nativa, i flussi di lavoro interni e un caso d\u2019uso reale di conversione da audio a testo.","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","twitter_creator":"@carlodaniele","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Carlo Daniele","Tempo di lettura stimato":"24 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Integrazione dell&#8217;AI in WordPress: un&#8217;analisi approfondita dell&#8217;architettura e un caso d&#8217;uso reale","datePublished":"2026-07-22T12:55:55+00:00","dateModified":"2026-07-23T12:08:09+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/"},"wordCount":4188,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/","url":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/","name":"Integrazione dell'AI in WordPress: architettura ed esempio pratico","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","datePublished":"2026-07-22T12:55:55+00:00","dateModified":"2026-07-23T12:08:09+00:00","description":"Esplora la nuova infrastruttura AI di WordPress. Scopri la sua architettura nativa, i flussi di lavoro interni e un caso d\u2019uso reale di conversione da audio a testo.","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Sviluppo di WordPress","item":"https:\/\/kinsta.com\/it\/argomenti\/sviluppo-wordpress\/"},{"@type":"ListItem","position":3,"name":"Integrazione dell&#8217;AI in WordPress: un&#8217;analisi approfondita dell&#8217;architettura e un caso d&#8217;uso reale"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/it\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/84678","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=84678"}],"version-history":[{"count":8,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/84678\/revisions"}],"predecessor-version":[{"id":84703,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/84678\/revisions\/84703"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/84678\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/84678\/translations\/it"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/84678\/translations\/jp"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/84678\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/84679"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=84678"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=84678"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=84678"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}