{"id":84784,"date":"2026-07-30T07:23:14","date_gmt":"2026-07-30T06:23:14","guid":{"rendered":"https:\/\/kinsta.com\/it\/?p=84784&#038;preview=true&#038;preview_id=84784"},"modified":"2026-07-31T11:32:46","modified_gmt":"2026-07-31T10:32:46","slug":"api-abilities-wordpress","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/","title":{"rendered":"Guida pratica per cominciare a usare l&#8217;API Abilities di WordPress"},"content":{"rendered":"<p>L\u2019API Abilities, introdotta in <a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-6-9\/#abilities-api\">WordPress 6.9<\/a>, definisce un linguaggio comune che permette a tutti i componenti di WordPress \u2014 sia del core che dei plugin \u2014 di esporre le proprie funzionalit\u00e0 in modo unificato e comprensibile sia per le persone che per le macchine. Questo rende il tuo sito WordPress pronto per l\u2019integrazione con strumenti di automazione esterni in modo standardizzato e sicuro.<\/p>\n<p>Se ti stai chiedendo quali potrebbero essere alcuni casi d\u2019uso dell\u2019API Abilities, pensa a un modello di intelligenza artificiale che guida un utente attraverso il processo di acquisto e gli permette persino di completare l\u2019acquisto senza visitare il tuo sito e-commerce. Oppure pensa a una <a href=\"https:\/\/kinsta.com\/it\/blog\/come-creare-una-pipeline-ci-cd\/\">pipeline CI\/CD su GitHub Actions<\/a> che elabora il testo estratto da un file audio o video e lo invia a WordPress per la pubblicazione. I casi d\u2019uso sono infiniti.<\/p>\n<p>L\u2019API Abilities cambia il ruolo stesso di WordPress all\u2019interno dell\u2019ecosistema. Non \u00e8 pi\u00f9 solo un blog, n\u00e9 tantomeno un CMS; oggi, WordPress funge da motore di esecuzione distribuito che pu\u00f2 essere orchestrato dall\u2019esterno, come una sorta di sistema operativo, pronto per gli agenti autonomi.<\/p>\n<p>Non vedi l&#8217;ora di saperne di pi\u00f9? Approfondiamo l\u2019argomento.<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>A cosa serve un &#8220;ability&#8221;<\/h2>\n<p>Un <em>ability<\/em>, o abilit\u00e0, \u00e8 una funzionalit\u00e0 individuabile e utilizzabile su un sito WordPress che consente operazioni specifiche per entit\u00e0 esterne (come i modelli di AI) o componenti interni.<\/p>\n<p>L\u2019API pu\u00f2 essere usata per cose come:<\/p>\n<ul>\n<li>Cercare contenuti o eseguire operazioni specifiche sul database<\/li>\n<li>Leggere le impostazioni di configurazione del sito<\/li>\n<li>Creare un post<\/li>\n<li>Convertire una struttura JSON in blocchi Gutenberg<\/li>\n<\/ul>\n<p>Rendere pubblica un\u2019abilit\u00e0 significa rendere interoperabile una funzionalit\u00e0 specifica. Prima che un\u2019abilit\u00e0 possa essere individuata e utilizzata, deve essere registrata in un catalogo centralizzato. Solo cos\u00ec WordPress e i modelli di AI potranno individuarla, comprenderne l\u2019intento e richiamarla quando necessario.<br \/>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>\u00c8 necessario un chiarimento: un modello di AI non ha mai accesso diretto al tuo sito. Pu\u00f2 solo chiedere a WordPress di eseguire un\u2019operazione (ad esempio, \u00abdammi il numero totale di post sul sito\u00bb) necessaria per portare a termine il suo compito.<\/p>\n<\/aside>\n<\/p>\n<p>Per impostazione predefinita, le funzionalit\u00e0 dei tuoi plugin sono completamente isolate. Registrando una capacit\u00e0, dichiari che la logica sottostante \u00e8 disponibile come servizio per l\u2019intero ecosistema.<\/p>\n<p>Vediamo un esempio. Se il tuo plugin ha una funzione che converte un oggetto JSON iniziale in contenuto strutturato pronto per i blocchi di Gutenberg, puoi registrarla come ability. Questo permette ad altri strumenti con le autorizzazioni necessarie di attivare esattamente la stessa funzione.<\/p>\n<p>Nel nostro precedente <a href=\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/\">tutorial sul WordPress AI Client<\/a>, il plugin gestiva la logica principale dell\u2019invio di un file audio al modello di AI, che restituiva una risposta strutturata in JSON per generare i blocchi Gutenberg. Tuttavia, quella funzionalit\u00e0 rimaneva limitata al nostro plugin. Registrando questo processo come &#8220;ability&#8221;, si disaccoppia l\u2019esecuzione e qualsiasi entit\u00e0 esterna pu\u00f2 attivare l\u2019intera logica del plugin semplicemente passando un oggetto JSON contenente l\u2019ID di un file audio.<\/p>\n<p><strong>Un\u2019abilit\u00e0 funge da contratto formale<\/strong> tra la logica PHP sottostante e qualsiasi entit\u00e0 che ne richieda l\u2019esecuzione. Il contratto specifica i dati che l\u2019abilit\u00e0 si aspetta come input, il suo intento e lo schema dei dati che restituisce come output.<\/p>\n<p>Quando registri un\u2019abilit\u00e0, questa viene aggiunta al <a href=\"https:\/\/make.wordpress.org\/ai\/2025\/07\/17\/abilities-api\/\" target=\"_blank\" rel=\"noopener noreferrer\">registro delle abilit\u00e0<\/a> del tuo sito. Da quel momento in poi, <strong>WordPress funge da gateway sicuro<\/strong>: verifica l\u2019autenticazione e convalida i dati in entrata rispetto allo schema stabilito dal contratto. WordPress inoltra la richiesta alla funzione PHP sottostante solo se il payload rispetta rigorosamente il contratto.<\/p>\n<p><strong>Un\u2019abilit\u00e0 \u00e8 indipendente dall\u2019entit\u00e0.<\/strong> WordPress non ha bisogno di conoscere l\u2019entit\u00e0 specifica che richiede l\u2019accesso; verifica solo che la richiesta sia autorizzata e soddisfi i vincoli del contratto.<\/p>\n<p>Registrando un\u2019abilit\u00e0, il tuo plugin non \u00e8 pi\u00f9 solo un\u2019estensione con una propria logica interna; diventa un fornitore di servizi per l\u2019intero ecosistema. Che si tratti di un\u2019app mobile, di uno script di automazione come Make.com o <a href=\"https:\/\/kinsta.com\/it\/blog\/woocommerce-zapier\/\">Zapier<\/a>, di un agente AI o di un server che comunica tramite il <a href=\"https:\/\/kinsta.com\/it\/blog\/mcp-server-api-kinsta\/\">protocollo MCP<\/a>, queste entit\u00e0 sapranno esattamente come attivare operazioni strutturate sul tuo sito.<\/p>\n<h2>Come funziona l\u2019API Abilities<\/h2>\n<p>L\u2019API Abilities offre un <a href=\"https:\/\/github.com\/WordPress\/abilities-api\/blob\/trunk\/docs\/php-api.md\" target=\"_blank\" rel=\"noopener noreferrer\">set completo di funzioni<\/a> che permettono di individuare le abilit\u00e0 registrate sul tuo sito, attivarle, registrarle e cancellarle.<br \/>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc><\/p>\n<h3>Gestire le ability del sito<\/h3>\n<p>Puoi recuperare un elenco di tutte le abilit\u00e0 registrate o recuperare un singolo oggetto abilit\u00e0. Puoi anche verificare alcune condizioni, ad esempio se una specifica abilit\u00e0 \u00e8 registrata o se l\u2019agente ha i permessi per attivarla.<br \/>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h4\" count-number=\"4\" sub-toc=\"true\"><\/kinsta-auto-toc><\/p>\n<h4>Ottieni un elenco delle abilit\u00e0 registrate sul tuo sito<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_abilities\/\" target=\"_blank\" rel=\"noopener noreferrer\">La funzione <code>wp_get_abilities()<\/code><\/a> restituisce un array contenente tutte le abilit\u00e0 registrate. Puoi provarla usando <a href=\"https:\/\/kinsta.com\/it\/blog\/wp-cli\/\">WP-CLI<\/a>. Una eseguita la <a href=\"https:\/\/kinsta.com\/it\/blog\/sviluppo-remoto-wordpress-kinsta-ssh\/\">connessione al sito tramite SSH<\/a>, vai nella directory principale del sito, dove si trova <a href=\"https:\/\/kinsta.com\/it\/blog\/wp-config-php\/\">il file <code>wp-config.php<\/code><\/a>, usando i seguenti comandi:<\/p>\n<pre><code class=\"language-bash\">cd \/path\/to\/your\/site\nls wp-config.php<\/code><\/pre>\n<p>Poi, assicurati che WP-CLI riconosca l\u2019installazione del tuo sito:<\/p>\n<pre><code class=\"language-bash\">wp core is-installed\nwp option get siteurl<\/code><\/pre>\n<p>Se ottieni l\u2019URL del sito, puoi eseguire il comando seguente:<\/p>\n<pre><code class=\"language-bash\">wp eval '$abilities = wp_get_abilities(); foreach ( $abilities as $a ) { echo $a-&gt;get_name() . PHP_EOL; }'<\/code><\/pre>\n<p>Questo comando esegue <a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/eval\/\" target=\"_blank\" rel=\"noopener noreferrer\">il codice PHP nel tuo terminale<\/a>. Il codice PHP richiede i nomi di tutte le abilit\u00e0 registrate sul sito e, per impostazione predefinita, dovrebbe fornire la seguente risposta:<\/p>\n<pre><code class=\"language-bash\">core\/get-site-info\ncore\/get-user-info\ncore\/get-environment-info<\/code><\/pre>\n<p>Puoi richiedere un set di dati pi\u00f9 completo con il seguente comando:<\/p>\n<pre><code class=\"language-bash\">wp eval '\n$all_abilities = wp_get_abilities();\n\nforeach ( $all_abilities as $ability ) {\n\techo \"Ability Name: \" . esc_html( $ability-&gt;get_name() ) . \"n\";\n\techo \"Label: \" . esc_html( $ability-&gt;get_label() ) . \"n\";\n\techo \"Category: \" . esc_html( $ability-&gt;get_category() ) . \"n\";\n\techo \"Description: \" . esc_html( $ability-&gt;get_description() ) . \"n\";\n\techo \"---n\";\n}\n'<\/code><\/pre>\n<p>Quando esegui questo comando su un sito <a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-7-0\/\">WordPress 7.0<\/a> appena installato, il terminale mostrer\u00e0 la seguente risposta:<\/p>\n<pre><code>Ability Name: core\/get-site-info\nLabel: Get Site Information\nCategory: site\nDescription: Returns site information configured in WordPress. By default returns all fields, or optionally a filtered subset.\n---\nAbility Name: core\/get-user-info\nLabel: Get User Information\nCategory: user\nDescription: Returns profile details for the current authenticated user to support personalization, auditing, and access-aware behavior. By default returns all fields, or optionally a filtered subset.\n---\nAbility Name: core\/get-environment-info\nLabel: Get Environment Info\nCategory: site\nDescription: Returns core details about the site's runtime context for diagnostics and compatibility (environment, PHP runtime, database server info, WordPress version). By default returns all fields, or optionally a filtered subset.\n---<\/code><\/pre>\n<h4>Ottenere un oggetto &#8220;ability&#8221;<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">La funzione <code>wp_get_ability()<\/code><\/a> restituisce un singolo oggetto &#8220;ability&#8221; in base al suo nome. Puoi provarla in WP-CLI con il seguente comando:<\/p>\n<pre><code class=\"language-bash\">wp eval '\n$ability = wp_get_ability( \"core\/get-site-info\" );\n\nif ( ! $ability ) {\n\techo \"Ability not foundn\";\n\texit( 1 );\n}\n\necho \"Name: \" . $ability-&gt;get_name() . \"n\";\necho \"Label: \" . $ability-&gt;get_label() . \"n\";\necho \"Category: \" . $ability-&gt;get_category() . \"n\";\necho \"Description: \" . $ability-&gt;get_description() . \"n\";\necho \"nInput Schema:n\";\nvar_dump( $ability-&gt;get_input_schema() );\necho \"nOutput Schema:n\";\nvar_dump( $ability-&gt;get_output_schema() );\necho \"nMeta:n\";\nvar_dump( $ability-&gt;get_meta() );\n'<\/code><\/pre>\n<p>Se l\u2019abilit\u00e0 \u00e8 registrata correttamente sul tuo sito, riceverai la seguente risposta nel tuo terminale:<\/p>\n<pre><code>Name: core\/get-site-info\nLabel: Get Site Information\nCategory: site\nDescription: Returns site information configured in WordPress. By default returns all fields, or optionally a filtered subset.\n\nInput Schema:\narray(4) {\n  [\"type\"]=&gt;\n  string(6) \"object\"\n  [\"properties\"]=&gt;\n  array(1) {\n\t[\"fields\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(5) \"array\"\n\t  [\"items\"]=&gt;\n\t  array(2) {\n\t\t[\"type\"]=&gt;\n\t\tstring(6) \"string\"\n\t\t[\"enum\"]=&gt;\n\t\tarray(8) {\n\t\t  [0]=&gt;\n\t\t  string(4) \"name\"\n\t\t  [1]=&gt;\n\t\t  string(11) \"description\"\n\t\t  [2]=&gt;\n\t\t  string(3) \"url\"\n\t\t  [3]=&gt;\n\t\t  string(5) \"wpurl\"\n\t\t  [4]=&gt;\n\t\t  string(11) \"admin_email\"\n\t\t  [5]=&gt;\n\t\t  string(7) \"charset\"\n\t\t  [6]=&gt;\n\t\t  string(8) \"language\"\n\t\t  [7]=&gt;\n\t\t  string(7) \"version\"\n\t\t}\n\t  }\n\t  [\"description\"]=&gt;\n\t  string(81) \"Optional: Limit response to specific fields. If omitted, all fields are returned.\"\n\t}\n  }\n  [\"additionalProperties\"]=&gt;\n  bool(false)\n  [\"default\"]=&gt;\n  array(0) {\n  }\n}\n\nOutput Schema:\narray(3) {\n  [\"type\"]=&gt;\n  string(6) \"object\"\n  [\"properties\"]=&gt;\n  array(8) {\n\t[\"name\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(10) \"Site Title\"\n\t  [\"description\"]=&gt;\n\t  string(15) \"The site title.\"\n\t}\n\t[\"description\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(7) \"Tagline\"\n\t  [\"description\"]=&gt;\n\t  string(17) \"The site tagline.\"\n\t}\n\t[\"url\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(18) \"Site Address (URL)\"\n\t  [\"description\"]=&gt;\n\t  string(94) \"The public URL where visitors access the site. May differ from the WordPress installation URL.\"\n\t}\n\t[\"wpurl\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(23) \"WordPress Address (URL)\"\n\t  [\"description\"]=&gt;\n\t  string(83) \"The URL where WordPress core files are served. May differ from the public site URL.\"\n\t}\n\t[\"admin_email\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(28) \"Administration Email Address\"\n\t  [\"description\"]=&gt;\n\t  string(37) \"The site administrator email address.\"\n\t}\n\t[\"charset\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(12) \"Site Charset\"\n\t  [\"description\"]=&gt;\n\t  string(28) \"The site character encoding.\"\n\t}\n\t[\"language\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(13) \"Site Language\"\n\t  [\"description\"]=&gt;\n\t  string(42) \"The site locale in dash form (e.g. en-US).\"\n\t}\n\t[\"version\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(17) \"WordPress Version\"\n\t  [\"description\"]=&gt;\n\t  string(48) \"The WordPress core version running on this site.\"\n\t}\n  }\n  [\"additionalProperties\"]=&gt;\n  bool(false)\n}\n\nMeta:\narray(2) {\n  [\"annotations\"]=&gt;\n  array(3) {\n\t[\"readonly\"]=&gt;\n\tbool(true)\n\t[\"destructive\"]=&gt;\n\tbool(false)\n\t[\"idempotent\"]=&gt;\n\tbool(true)\n  }\n  [\"show_in_rest\"]=&gt;\n  bool(true)\n}<\/code><\/pre>\n<h4>Verificare se un&#8217;abilit\u00e0 \u00e8 registrata<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_has_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">La funzione<code>wp_has_ability()<\/code><\/a> ti permette di verificare se un&#8217;abilit\u00e0 \u00e8 registrata. In WP-CLI, puoi usarla in questo modo:<\/p>\n<pre><code class=\"language-bash\">wp eval '\nif ( wp_has_ability( \"core\/get-site-info\" ) ) {\n\techo \"\u2713 core\/get-site-info is registeredn\";\n} else {\n\techo \"\u2717 core\/get-site-info not foundn\";\n}\n'<\/code><\/pre>\n<p>Se l\u2019abilit\u00e0 \u00e8 stata registrata, sul terminale apparir\u00e0 il seguente messaggio:<\/p>\n<pre><code class=\"language-bash\">\u2713 core\/get-site-info is registered<\/code><\/pre>\n<h4>Verificare i permessi dell\u2019agente<\/h4>\n<p>Puoi verificare se l\u2019utente corrente ha i permessi per eseguire un\u2019abilit\u00e0 utilizzando il <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_ability\/check_permissions\/\" target=\"_blank\" rel=\"noopener noreferrer\">metodo <code>check_permissions()<\/code><\/a> dell\u2019oggetto <code>$ability<\/code>. Questo restituisce &#8220;true&#8221;, &#8220;false&#8221; o un oggetto <code>WP_Error<\/code>. Proviamo a chiamare questo metodo dal terminale utilizzando il seguente comando WP-CLI:<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"core\/get-site-info\" );\nif ( $ability ) {\n\t$has_permissions = $ability-&gt;check_permissions();\n\tif ( true === $has_permissions ) {\n\t\techo \"You have permissions to execute this ability.\";\n\t} else {\n\t\tif ( is_wp_error( $has_permissions ) ) {\n\t\t\terror_log( \"Permissions check failed: \" . $has_permissions-&gt;get_error_message() );\n\t\t}\n\t\techo \"You do not have permissions to execute this ability.\";\n\t}\n} else {\n\techo \"Ability not found.\";\n}\n'<\/code><\/pre>\n<p>Qui abbiamo impostato <code>--user=1<\/code>, ed \u00e8 per questo che riceverai la seguente risposta:<\/p>\n<pre><code class=\"language-bash\">You have permissions to execute this ability.<\/code><\/pre>\n<h3>Registrare un\u2019abilit\u00e0<\/h3>\n<p>\u00c8 ora il momento di registrare un\u2019abilit\u00e0. Per illustrare un caso d\u2019uso reale, estenderemo il plugin descritto nel <a href=\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/\">nostro articolo sul WordPress AI Client<\/a>. Il plugin invia un file audio al modello di AI per estrarre il testo e attivare la generazione di blocchi Gutenberg. In questa sezione vedremo come registrare questo processo come ability, in modo che qualsiasi entit\u00e0 con i permessi necessari possa individuarlo e utilizzarlo.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Per gli esempi qui sotto, mostriamo solo il codice essenziale. Per sperimentare in prima persona il codice fornito in questa sezione, ti consigliamo di scaricare il plugin <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\" target=\"_blank\" rel=\"noopener noreferrer\">AI Content Builder Next<\/a> da GitHub e installarlo manualmente su un sito WordPress locale o di staging.<\/p>\n<\/aside>\n\n<p>Prima di registrare una nuova abilit\u00e0, devi registrare una nuova categoria di ability.<\/p>\n<p>Per farlo, dovrai agganciare la <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_ability_category\/\" target=\"_blank\" rel=\"noopener noreferrer\">funzione <code>wp_register_ability_category()<\/code><\/a> all\u2019hook \u00a0<code>wp_abilities_api_categories_init<\/code>.<\/p>\n<p>La funzione accetta uno slug univoco della categoria e un array associativo di argomenti.<\/p>\n<p>Ecco come registrare la tua categoria ability:<\/p>\n<pre><code class=\"language-php\">function aicb_register_ability_category(): void {\n\n\tif ( ! function_exists( 'wp_register_ability_category' ) ) {\n\t\treturn;\n\t}\n\n\twp_register_ability_category(\n\t\t'content-generation',\n\t\tarray(\n\t\t\t'label'       =&gt; 'Content Generation',\n\t\t\t'description' =&gt; 'AI-powered content transformation and structuring abilities',\n\t\t)\n\t);\n}\nadd_action( 'wp_abilities_api_categories_init', 'aicb_register_ability_category' );<\/code><\/pre>\n<p>Il passo successivo \u00e8 registrare l\u2019abilit\u00e0. Per farlo, dovrai collegare la <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">funzione<code>wp_register_ability()<\/code> <\/a> all\u2019azione <code>wp_abilities_api_init<\/code>.<\/p>\n<p>La funzione accetta due argomenti: il nome dell\u2019abilit\u00e0, compreso il suo namespace, e un array di argomenti per la configurazione dell\u2019abilit\u00e0.<\/p>\n<p>Ecco la registrazione dell\u2019abilit\u00e0 per il <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\/blob\/main\/abilities.php\" target=\"_blank\" rel=\"noopener noreferrer\">plugin AI Content Builder<\/a>:<\/p>\n<pre><code class=\"language-php\">function aicb_register_audio_to_gutenberg_blocks_ability(): void {\n\n\tif ( ! function_exists( 'wp_register_ability' ) ) {\n\t\treturn;\n\t}\n\n\t$input_schema = array( ... );\n\n\t$output_schema = array( ... );\n\n\twp_register_ability(\n\t\t'ai-content-builder\/audio-to-gutenberg-blocks',\n\t\tarray(\n\t\t\t'category'            =&gt; 'content-generation',\n\t\t\t'label'               =&gt; 'Audio to Gutenberg Blocks',\n\t\t\t'description'         =&gt; 'Transcribes audio and converts the content into WordPress Gutenberg-compatible block objects.',\n\t\t\t'input_schema'        =&gt; $input_schema,\n\t\t\t'output_schema'       =&gt; $output_schema,\n\t\t\t'execute_callback'    =&gt; 'aicb_audio_to_gutenberg_blocks_callback',\n\t\t\t'permission_callback' =&gt; static function (): bool {\n\t\t\t\treturn current_user_can( 'edit_posts' );\n\t\t\t},\n\t\t\t'meta'                =&gt; array(\n\t\t\t\t'show_in_rest' =&gt; true,\n\t\t\t\t'annotations'  =&gt; array(\n\t\t\t\t\t'readonly'     =&gt; false,\n\t\t\t\t\t'destructive'  =&gt; false,\n\t\t\t\t\t'idempotent'   =&gt; false,\n\t\t\t\t\t'instructions' =&gt; 'Processes an audio attachment: transcribes it, generates structured blog content via AI, and returns Gutenberg-ready block objects.',\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t);\n}\nadd_action( 'wp_abilities_api_init', 'aicb_register_audio_to_gutenberg_blocks_ability' );<\/code><\/pre>\n<p>Nella chiamata alla funzione <code>wp_register_ability<\/code>, abbiamo configurato i seguenti argomenti:<\/p>\n<ul>\n<li><code>category<\/code>: la categoria a cui appartiene l\u2019abilit\u00e0.<\/li>\n<li><code>label<\/code>: il nome visualizzato dell\u2019abilit\u00e0.<\/li>\n<li><code>description<\/code>: una breve descrizione di cosa fa l\u2019abilit\u00e0 e del suo scopo.<\/li>\n<li><code>input_schema<\/code>: lo schema dei dati per gli argomenti di input in entrata.<\/li>\n<li><code>output_schema<\/code>: lo schema dei dati fornito e restituito dall&#8217;abilit\u00e0.<\/li>\n<li><code>execute_callback<\/code>: la funzione di callback da eseguire quando l\u2019abilit\u00e0 viene attivata.<\/li>\n<li><code>permission_callback<\/code>: una funzione di callback che viene eseguita per verificare che l\u2019agente abbia i permessi necessari per eseguire l\u2019abilit\u00e0.<\/li>\n<li><code>meta<\/code>: un array di campi di metadati aggiuntivi per l\u2019abilit\u00e0.<\/li>\n<li><code>show_in_rest<\/code>: determina se rendere visibile o meno l\u2019abilit\u00e0 all\u2019interno dell\u2019API REST di WordPress.<\/li>\n<li><code>annotations<\/code>: un array di elementi descrittivi che definiscono il comportamento dell&#8217;abilit\u00e0.<\/li>\n<\/ul>\n<p><code>input_schema<\/code> \u00e8 un array che definisce il contratto di input dell\u2019abilit\u00e0. Rappresenta la definizione dello schema JSON per la convalida dell\u2019input dell\u2019abilit\u00e0. Nel nostro caso specifico, \u00e8 definito come segue:<\/p>\n<pre><code class=\"language-php\">$input_schema = array(\n\t'type'       =&gt; 'object',\n\t'properties' =&gt; array(\n\t\t'audio_id' =&gt; array(\n\t\t\t'type'        =&gt; 'integer',\n\t\t\t'description' =&gt; 'The ID of the audio attachment to process and convert into Gutenberg blocks.',\n\t\t),\n\t),\n\t'required'   =&gt; array( 'audio_id' ),\n);<\/code><\/pre>\n<p>Questo JSON Schema rappresenta il formato che i dati di input devono seguire per utilizzare questa ability.<\/p>\n<p><code>output_schema<\/code> \u00e8 il contratto di output restituito dall&#8217;abilit\u00e0. Nel nostro esempio, ogni elemento \u00e8 un oggetto che rappresenta un blocco JSON:<\/p>\n<pre><code class=\"language-php\">$output_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( 'type' =&gt; 'object' ),\n\t\t),\n\t\t'blocks'     =&gt; array(\n\t\t\t'type'  =&gt; 'array',\n\t\t\t'items' =&gt; array( 'type' =&gt; 'object' ),\n\t\t),\n\t\t'transcript' =&gt; array( 'type' =&gt; 'string' ),\n\t),\n\t'required'   =&gt; array( 'blocks' ),\n);<\/code><\/pre>\n<p>Il passo successivo \u00e8 definire la funzione di callback che si esegue quando l\u2019abilit\u00e0 viene attivata (guarda il <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\/blob\/main\/abilities.php#L483\" target=\"_blank\" rel=\"noopener noreferrer\">codice completo su GitHub<\/a>):<\/p>\n<pre><code class=\"language-php\">function aicb_audio_to_gutenberg_blocks_callback( array $args ) {\n\n\t\/\/ missing code\n\t\/\/ see GitHub\n\t...\n\n\t$structured_json = wp_ai_client_prompt( $prompt )\n\t\t-&gt;using_system_instruction( $instructions )\n\t\t-&gt;using_temperature( 0.4 )\n\t\t-&gt;as_json_response( $schema )\n\t\t-&gt;generate_text();\n\n\tif ( is_wp_error( $structured_json ) ) {\n\t\treturn $structured_json;\n\t}\n\n\t$structured = json_decode( (string) $structured_json, true );\n\tif ( ! is_array( $structured ) ) {\n\t\treturn new WP_Error(\n\t\t\t'invalid_ai_json',\n\t\t\t'Could not parse structured AI response.',\n\t\t\tarray( 'status' =&gt; 500 )\n\t\t);\n\t}\n\n\t\/\/ Normalize the output.\n\t$normalized = aicb_normalize_structured_post( $structured );\n\n\tif ( '' === $normalized['title'] && empty( $normalized['sections'] ) ) {\n\t\treturn new WP_Error(\n\t\t\t'empty_structured_content',\n\t\t\t'The AI provider returned empty structured content.',\n\t\t\tarray( 'status' =&gt; 500 )\n\t\t);\n\t}\n\n\t\/\/ Convert to Gutenberg blocks.\n\t$blocks = aicb_sections_to_blocks( $normalized['title'], $normalized['sections'] );\n\n\treturn $blocks;\n}<\/code><\/pre>\n<p>Questa funzione chiama due funzioni personalizzate. La prima (<code>aicb_normalize_structured_post<\/code>) normalizza l\u2019output dell\u2019AI in un formato predefinito e pulisce i dati:<\/p>\n<pre><code class=\"language-php\">function aicb_normalize_structured_post( array $structured ): array {\n\t$title = isset( $structured['title'] )\n\t\t? sanitize_text_field( (string) $structured['title'] )\n\t\t: '';\n\n\t$sections = array();\n\n\tif ( isset( $structured['sections'] ) && is_array( $structured['sections'] ) ) {\n\t\tforeach ( $structured['sections'] as $section ) {\n\t\t\tif ( ! is_array( $section ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$heading = isset( $section['heading'] )\n\t\t\t\t? sanitize_text_field( (string) $section['heading'] )\n\t\t\t\t: '';\n\n\t\t\t$level = 2;\n\n\t\t\t$paragraphs = array();\n\t\t\tif ( isset( $section['paragraphs'] ) && is_array( $section['paragraphs'] ) ) {\n\t\t\t\tforeach ( $section['paragraphs'] as $paragraph ) {\n\t\t\t\t\t$clean_paragraph = trim( sanitize_textarea_field( (string) $paragraph ) );\n\t\t\t\t\tif ( '' !== $clean_paragraph ) {\n\t\t\t\t\t\t$paragraphs[] = $clean_paragraph;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$bullet_points = array();\n\t\t\tif ( isset( $section['bullet_points'] ) && is_array( $section['bullet_points'] ) ) {\n\t\t\t\tforeach ( $section['bullet_points'] as $bullet_point ) {\n\t\t\t\t\t$clean_bullet_point = trim( sanitize_text_field( (string) $bullet_point ) );\n\t\t\t\t\tif ( '' !== $clean_bullet_point ) {\n\t\t\t\t\t\t$bullet_points[] = $clean_bullet_point;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( '' === $heading || empty( $paragraphs ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$sections[] = array(\n\t\t\t\t'heading'       =&gt; $heading,\n\t\t\t\t'level'         =&gt; $level,\n\t\t\t\t'paragraphs'    =&gt; $paragraphs,\n\t\t\t\t'bullet_points' =&gt; $bullet_points,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn array(\n\t\t'title'    =&gt; $title,\n\t\t'sections' =&gt; $sections,\n\t);\n}<\/code><\/pre>\n<p>La funzione accetta un array strutturato di oggetti JSON, normalizza e pulisce i dati, quindi restituisce un array contenente il titolo e le sezioni.<\/p>\n<p>La seconda funzione (<code>aicb_sections_to_blocks<\/code>) converte i dati normalizzati in oggetti descrittori di blocchi ed \u00e8 definita come segue:<\/p>\n<pre><code class=\"language-php\">function aicb_sections_to_blocks( string $title, array $sections ): array {\n\t$blocks = array();\n\n\tforeach ( $sections as $section ) {\n\t\tif ( ! is_array( $section ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$heading = isset( $section['heading'] ) ? trim( (string) $section['heading'] ) : '';\n\t\tif ( '' === $heading ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$paragraphs = array();\n\t\tif ( isset( $section['paragraphs'] ) && is_array( $section['paragraphs'] ) ) {\n\t\t\tforeach ( $section['paragraphs'] as $paragraph ) {\n\t\t\t\t$clean = trim( (string) $paragraph );\n\t\t\t\tif ( '' !== $clean ) {\n\t\t\t\t\t$paragraphs[] = $clean;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $paragraphs ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$blocks[] = array(\n\t\t\t'name'       =&gt; 'core\/heading',\n\t\t\t'attributes' =&gt; array(\n\t\t\t\t'content' =&gt; $heading,\n\t\t\t\t'level'   =&gt; 2,\n\t\t\t),\n\t\t);\n\n\t\tforeach ( $paragraphs as $paragraph ) {\n\t\t\t$blocks[] = array(\n\t\t\t\t'name'       =&gt; 'core\/paragraph',\n\t\t\t\t'attributes' =&gt; array(\n\t\t\t\t\t'content' =&gt; $paragraph,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif ( isset( $section['bullet_points'] ) && is_array( $section['bullet_points'] ) ) {\n\t\t\t$bullet_items_html = '';\n\n\t\t\tforeach ( $section['bullet_points'] as $bullet_point ) {\n\t\t\t\t$clean_bullet = trim( sanitize_text_field( (string) $bullet_point ) );\n\t\t\t\tif ( '' === $clean_bullet ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t\/\/ core\/list expects HTML in the `values` attribute.\n\t\t\t\t$bullet_items_html .= '&lt;li&gt;' . esc_html( $clean_bullet ) . '&lt;\/li&gt;';\n\t\t\t}\n\n\t\t\tif ( '' !== $bullet_items_html ) {\n\t\t\t\t$blocks[] = array(\n\t\t\t\t\t'name'       =&gt; 'core\/list',\n\t\t\t\t\t'attributes' =&gt; array(\n\t\t\t\t\t\t'values' =&gt; '&lt;ul&gt;' . $bullet_items_html . '&lt;\/ul&gt;',\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $blocks;\n}<\/code><\/pre>\n<p>Ecco i punti chiave di questa funzione:<\/p>\n<ul>\n<li>La funzione accetta 2 argomenti: una stringa che rappresenta il titolo del post e un array delle sezioni generate dal modello di AI.<\/li>\n<li>Per ogni sezione, la funzione genera un titolo e almeno un paragrafo.<\/li>\n<li>Se ci sono elenchi puntati, genera un numero corrispondente di voci dell\u2019elenco.<\/li>\n<li>La funzione restituisce un array <code>$blocks<\/code> di oggetti descrittori di blocchi, che \u00e8 il contratto di output restituito dall\u2019abilit\u00e0 (<code>$output_schema<\/code>).<\/li>\n<\/ul>\n<p>Nota che l\u2019output della funzione non \u00e8 il markup grezzo del blocco. Questo verr\u00e0 generato lato client utilizzando la funzione JavaScript <code>createBlock<\/code>.<\/p>\n<p>Ad esempio, l\u2019elemento di intestazione di una sezione \u00e8 rappresentato dal seguente oggetto:<\/p>\n<pre><code class=\"language-php\">if ( '' !== $heading ) {\n\t$blocks[] = array(\n\t\t'name'       =&gt; 'core\/heading',\n\t\t'attributes' =&gt; array(\n\t\t\t'content' =&gt; $heading,\n\t\t\t'level'   =&gt; ( 3 === $level ) ? 3 : 2,\n\t\t),\n\t);\n}<\/code><\/pre>\n<p>Una volta registrata la tua ability, puoi eseguire nel terminale gli stessi comandi WP-CLI visti sopra per ottenere i dettagli. Il codice seguente generer\u00e0 lo schema di input per la tua ability:<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"ai-content-builder\/audio-to-gutenberg-blocks\" );\n\nif ( ! $ability ) {\n    echo \"Ability not foundn\";\n    exit( 1 );\n}\n\necho \"Input Schema:n\";\nvar_dump( $ability-&gt;get_input_schema() );\n'<\/code><\/pre>\n<p>Ecco il risultato nel terminale:<\/p>\n<pre><code>Input Schema:\narray(3) {\n\t[\"type\"]=&gt;\n\tstring(6) \"object\"\n\t[\"properties\"]=&gt;\n\tarray(1) {\n\t\t[\"audio_id\"]=&gt;\n\t\tarray(2) {\n\t\t\t[\"type\"]=&gt;\n\t\t\tstring(7) \"integer\"\n\t\t\t[\"description\"]=&gt;\n\t\t\tstring(76) \"The ID of the audio attachment to process and convert into Gutenberg blocks.\"\n\t\t}\n\t}\n\t[\"required\"]=&gt;\n\tarray(1) {\n\t\t[0]=&gt;\n\t\tstring(8) \"audio_id\"\n\t}\n}<\/code><\/pre>\n<p>Allo stesso modo, puoi recuperare lo schema di output dell&#8217;abilit\u00e0:<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"ai-content-builder\/audio-to-gutenberg-blocks\" );\n\nif ( ! $ability ) {\n    echo \"Ability not foundn\";\n    exit( 1 );\n}\n\necho \"Output Schema:n\";\nvar_dump( $ability-&gt;get_output_schema() );\n'<\/code><\/pre>\n<p>Puoi anche visualizzare l\u2019oggetto completo della tua abilit\u00e0 con il seguente comando:<\/p>\n<pre><code class=\"language-bash\">wp eval '\n$ability = wp_get_ability( \"ai-content-builder\/audio-to-gutenberg-blocks\" );\n\nif ( ! $ability ) {\n\techo \"Ability not foundn\";\n\texit( 1 );\n}\n\necho \"Name: \" . $ability-&gt;get_name() . \"n\";\necho \"Label: \" . $ability-&gt;get_label() . \"n\";\necho \"Category: \" . $ability-&gt;get_category() . \"n\";\necho \"Description: \" . $ability-&gt;get_description() . \"n\";\necho \"nInput Schema:n\";\nvar_dump( $ability-&gt;get_input_schema() );\necho \"nOutput Schema:n\";\nvar_dump( $ability-&gt;get_output_schema() );\n'<\/code><\/pre>\n<h3>Eseguire un&#8217;abilit\u00e0<\/h3>\n<p>Per eseguire un\u2019abilit\u00e0, userai il metodo \u00a0<code>execute()<\/code> dell\u2019oggetto <code>$ability<\/code>. Puoi provare a eseguire il codice PHP qui sotto tramite WP-CLI per attivare l\u2019abilit\u00e0 <code>core\/get-site-info<\/code>:<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"core\/get-site-info\" );\n\nif ( ! $ability ) {\n\techo \"Ability not foundn\";\n\texit(1);\n}\n\n$result = $ability-&gt;execute();\n\nif ( is_wp_error( $result ) ) {\n\techo \"ERROR: \" . $result-&gt;get_error_message() . \"n\";\n\texit(1);\n}\n\necho json_encode( $result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ) . \"n\";\n'<\/code><\/pre>\n<p>Quando esegui questo comando, l\u2019abilit\u00e0 fornir\u00e0 un oggetto JSON simile al seguente:<\/p>\n<pre><code>{\n\t\"name\": \"WordPress 7.0\",\n\t\"description\": \"\",\n\t\"url\": \"http:\/\/yoursite.kinsta.cloud\",\n\t\"wpurl\": \"http:\/\/yoursite.kinsta.cloud\",\n\t\"admin_email\": \"yourname@youremail.com\",\n\t\"charset\": \"UTF-8\",\n\t\"language\": \"en-US\",\n\t\"version\": \"7.1-alpha-62550\"\n}<\/code><\/pre>\n<p>Quello che vedi sopra \u00e8 solo un semplice esempio di ability che fornisce dati per il tuo sito.<\/p>\n<p>Come detto prima, un ability pu\u00f2 richiedere dati in ingresso, eseguire operazioni su quei dati e restituire un output strutturato. Possiamo vedere un esempio di questo con l&#8217;ability che abbiamo registrato nella sezione precedente.<\/p>\n<p>Sempre nel tuo terminale, vai nella directory principale del sito ed esegui il seguente codice PHP:<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"ai-content-builder\/audio-to-gutenberg-blocks\" );\n\nif ( ! $ability ) {\n\techo \"Ability not foundn\";\n\texit( 1 );\n}\n\n$input = array( \"audio_id\" =&gt; 1755 );\n\n$result = $ability-&gt;execute( $input );\n\nif ( is_wp_error( $result ) ) {\n\techo \"ERROR: \" . $result-&gt;get_error_message() . \"n\";\n\texit( 1 );\n}\n\necho json_encode( $result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ) . \"n\";\n'<\/code><\/pre>\n<p>Il metodo <code>execute<\/code> passa i dati di input strutturati all&#8217;abilit\u00e0, che restituisce un array di oggetti pronti per essere convertiti in blocchi Gutenberg:<\/p>\n<pre><code>[\n\t{\n\t\t\"name\": \"core\/heading\",\n\t\t\"attributes\": {\n\t\t\t\"content\": \"A Well-Deserved Rest Day in Marrakech\",\n\t\t\t\"level\": 2\n\t\t}\n\t},\n\t{\n\t\t\"name\": \"core\/paragraph\",\n\t\t\"attributes\": {\n\t\t\t\"content\": \"On April 24th, our group of seven motorcyclists took a break from the open road...\"\n\t\t}\n\t},\n\t{\n\t\t\"name\": \"core\/heading\",\n\t\t\"attributes\": {\n\t\t\t\"content\": \"Exploring Jemaa el-Fnaa and the Medina\",\n\t\t\t\"level\": 2\n\t\t}\n\t},\n\t{\n\t\t\"name\": \"core\/paragraph\",\n\t\t\"attributes\": {\n\t\t\t\"content\": \"Our journey led us straight to Jemaa el-Fnaa, the legendary main square of Marrakech...\"\n\t\t}\n\t},\n\t{\n\t\t\"name\": \"core\/list\",\n\t\t\"attributes\": {\n\t\t\t\"values\": \"&lt;ul&gt;&lt;li&gt;Navigating the bustling souks and narrow alleys of the ancient Medina.&lt;\/li&gt;&lt;li&gt;Savoring traditional Moroccan and Berber dishes.&lt;\/li&gt;&lt;li&gt;Experiencing the vibrant street performances and food stalls of Jemaa el-Fnaa at night.&lt;\/li&gt;&lt;\/ul&gt;\"\n\t\t}\n\t},\n\t...\n]<\/code><\/pre>\n<h2>Integrazione con l\u2019API REST<\/h2>\n<p>L\u2019Abilities API di WordPress offre una struttura di routing unificata che permette agli agenti esterni di interrogare a livello di programmazione le categorie di abilit\u00e0 disponibili (<code>\/categories<\/code>), esaminare contratti di abilit\u00e0 specifici (<code>\/abilities\/{name}<\/code>) ed eseguire un\u2019abilit\u00e0 specifica utilizzando l\u2019endpoint di esecuzione standard (<code>\/abilities\/{name}\/run<\/code>).<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Tutte le richieste all\u2019API REST di WordPress richiedono l\u2019autenticazione. Per script esterni o strumenti di terze parti come Postman, usa <a href=\"https:\/\/developer.wordpress.org\/advanced-administration\/security\/application-passwords\/\" target=\"_blank\" rel=\"noopener noreferrer\">le password dell\u2019applicazione WordPress<\/a>.<\/p>\n<\/aside>\n\n<p>Ecco, ad esempio, una richiesta GET che restituisce l\u2019elenco delle categorie dal nostro sito di prova:<\/p>\n<pre><code>https:\/\/yoursite.kinsta.cloud\/wp-json\/wp-abilities\/v1\/categories<\/code><\/pre>\n<figure id=\"attachment_212438\" aria-describedby=\"caption-attachment-212438\" style=\"width: 1372px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-212438\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-26-alle-19.07.03.png\" alt=\"Richiesta GET per le categorie di abilit\u00e0 in Postman\" width=\"1372\" height=\"496\"><figcaption id=\"caption-attachment-212438\" class=\"wp-caption-text\">Tutte le richieste devono essere autorizzate<\/figcaption><\/figure>\n<p>Quando abbiamo registrato l&#8217;ability nell\u2019esempio precedente, abbiamo impostato il parametro <code>show_in_rest<\/code> su <code>true<\/code>. In questo modo, abbiamo reso la nostra ability automaticamente accessibile tramite questi endpoint nativi dell\u2019API REST di WordPress all\u2019interno dello spazio dei nomi centralizzato del core (<code>wp-abilities\/v1<\/code>).<\/p>\n<p>Questo significa che non devi registrare manualmente percorsi personalizzati da zero per richiamare un\u2019abilit\u00e0 da un ambiente esterno. Gli agenti esterni possono individuare ed eseguire la tua abilit\u00e0 utilizzando richieste HTTP standard.<\/p>\n<p>Puoi esaminare il contratto specifico della nostra abilit\u00e0 con la seguente richiesta GET:<\/p>\n<pre><code>https:\/\/yoursite.kinsta.cloud\/wp-json\/wp-abilities\/v1\/abilities\/ai-content-builder\/audio-to-gutenberg-blocks<\/code><\/pre>\n<p>Infine, puoi attivare l&#8217;ability con una richiesta POST autenticata:<\/p>\n<pre><code>https:\/\/yoursite.kinsta.cloud\/wp-json\/wp-abilities\/v1\/abilities\/ai-content-builder\/audio-to-gutenberg-blocks\/run<\/code><\/pre>\n<p>Quando invii questo tipo di richiesta, assicurati di aver specificato i dati di input. Nel nostro esempio, abbiamo impostato il seguente JSON nel corpo della richiesta:<\/p>\n<pre><code class=\"language-json\">{\n\t\"input\": {\n\t\t\"audio_id\": YOUR_AUDIO_ID\n\t}\n}<\/code><\/pre>\n<figure id=\"attachment_212446\" aria-describedby=\"caption-attachment-212446\" style=\"width: 1378px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-212446\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/run-ability-via-rest-1.png\" alt=\"Esecuzione di un\u2019abilit\u00e0 tramite richiesta HTTP in Postman\" width=\"1378\" height=\"1286\"><figcaption id=\"caption-attachment-212446\" class=\"wp-caption-text\">Esecuzione di un\u2019abilit\u00e0 tramite richiesta HTTP in Postman<\/figcaption><\/figure>\n<p>La nostra abilit\u00e0 ha elaborato l\u2019audio e l\u2019ha inviato al modello di AI configurato sul sito. Il modello ha restituito un output strutturato che \u00e8 stato successivamente normalizzato e sanificato, restituendo infine il seguente array di oggetti contenente gli attributi del blocco:<\/p>\n<pre><code class=\"language-json\">{\n\t\"blocks\": [\n\t\t{\n\t\t\t\"name\": \"core\/heading\",\n\t\t\t\"attributes\": { \"content\": \"A Welcome Rest Day in Marrakech\", \"level\": 2 }\n\t\t},\n\t\t{\n\t\t\t\"name\": \"core\/paragraph\",\n\t\t\t\"attributes\": { \"content\": \"On April 24, our group of seven motorcyclists paused our journey...\" }\n\t\t}\n\t]\n}<\/code><\/pre>\n<p>Ed \u00e8 proprio questo il risultato che volevamo ottenere.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>A partire dalla versione 7.0 di WordPress, l\u2019Abilities API \u00e8 ora disponibile anche tramite JavaScript, grazie all\u2019implementazione dell\u2019Abilities API lato client. Gli sviluppatori possono utilizzare i due pacchetti <code>@wordpress\/abilities<\/code> e <code>@wordpress\/core-abilities<\/code> per registrare le ability \u2014 complete di schemi di input e output, callback e annotazioni \u2014 e implementare ability lato client. Per un\u2019analisi approfondita, dai un\u2019occhiata alla nota per gli sviluppatori <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/client-side-abilities-api-in-wordpress-7-0\/\" target=\"_blank\" rel=\"noopener noreferrer\">sull\u2019API Abilities lato client<\/a> e alla <a href=\"https:\/\/github.com\/WordPress\/abilities-api\/blob\/trunk\/docs\/javascript-client.md\" target=\"_blank\" rel=\"noopener noreferrer\">documentazione per i client JavaScript<\/a>.<\/p>\n<\/aside>\n\n<h2>Il futuro di WordPress \u00e8 &#8220;agentico&#8221;<\/h2>\n<p>Mentre <a href=\"https:\/\/kinsta.com\/it\/blog\/ai-wordpress\/\">l\u2019AI Client e la nuova architettura dei connettori<\/a> portano le capacit\u00e0 di elaborazione dell\u2019AI all\u2019interno di WordPress, l\u2019Abilities API ridefinisce il modo in cui WordPress interagisce con il mondo esterno. Stiamo assistendo a un drastico cambiamento di paradigma, passando da un\u2019architettura web tradizionale \u2014 basata sull\u2019interazione manuale dell\u2019utente, in cui ogni integrazione richiedeva endpoint personalizzati e mappature manuali \u2014 a un\u2019architettura basata sull\u2019intento, progettata da zero per l\u2019automazione.<\/p>\n<p>Per gli sviluppatori di WordPress, la nuova API Abilities rappresenta una svolta architettonica, caratterizzata dal disaccoppiamento delle funzionalit\u00e0 dai plugin che ne contengono la logica, dal rafforzamento della sicurezza attraverso il contratto di input\/output e dall\u2019abilitazione dell\u2019interoperabilit\u00e0 nativa nell\u2019intero ecosistema.<\/p>\n<p>Nel loro insieme, queste caratteristiche assicurano che l\u2019API Abilities non sia solo l\u2019ennesima API, ma un vero e proprio motore di esecuzione distribuito che offre uno sguardo su un futuro sempre pi\u00f9 \u201cagentico\u201d per WordPress.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>L\u2019API Abilities, introdotta in WordPress 6.9, definisce un linguaggio comune che permette a tutti i componenti di WordPress \u2014 sia del core che dei plugin \u2014 &#8230;<\/p>\n","protected":false},"author":36,"featured_media":84785,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[26232,25873],"class_list":["post-84784","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-api","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>Introduzione all&#039;API Abilities di WordPress: una guida pratica<\/title>\n<meta name=\"description\" content=\"Scopri come utilizzare l&#039;API Abilities di WordPress per trasformare le funzionalit\u00e0 del tuo plugin in servizi sicuri, basati su contratti e pronti per l&#039;automazione tramite AI.\" \/>\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\/api-abilities-wordpress\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Guida pratica per cominciare a usare l&#039;API Abilities di WordPress\" \/>\n<meta property=\"og:description\" content=\"Scopri come utilizzare l&#039;API Abilities di WordPress per trasformare le funzionalit\u00e0 del tuo plugin in servizi sicuri, basati su contratti e pronti per l&#039;automazione tramite AI.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/api-abilities-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-30T06:23:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-31T10:32:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.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=\"Scopri come utilizzare l&#039;API Abilities di WordPress per trasformare le funzionalit\u00e0 del tuo plugin in servizi sicuri, basati su contratti e pronti per l&#039;automazione tramite AI.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.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=\"13 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Guida pratica per cominciare a usare l&#8217;API Abilities di WordPress\",\"datePublished\":\"2026-07-30T06:23:14+00:00\",\"dateModified\":\"2026-07-31T10:32:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/\"},\"wordCount\":2350,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/\",\"name\":\"Introduzione all'API Abilities di WordPress: una guida pratica\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"datePublished\":\"2026-07-30T06:23:14+00:00\",\"dateModified\":\"2026-07-31T10:32:46+00:00\",\"description\":\"Scopri come utilizzare l'API Abilities di WordPress per trasformare le funzionalit\u00e0 del tuo plugin in servizi sicuri, basati su contratti e pronti per l'automazione tramite AI.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/api\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Guida pratica per cominciare a usare l&#8217;API Abilities di WordPress\"}]},{\"@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":"Introduzione all'API Abilities di WordPress: una guida pratica","description":"Scopri come utilizzare l'API Abilities di WordPress per trasformare le funzionalit\u00e0 del tuo plugin in servizi sicuri, basati su contratti e pronti per l'automazione tramite AI.","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\/api-abilities-wordpress\/","og_locale":"it_IT","og_type":"article","og_title":"Guida pratica per cominciare a usare l'API Abilities di WordPress","og_description":"Scopri come utilizzare l'API Abilities di WordPress per trasformare le funzionalit\u00e0 del tuo plugin in servizi sicuri, basati su contratti e pronti per l'automazione tramite AI.","og_url":"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2026-07-30T06:23:14+00:00","article_modified_time":"2026-07-31T10:32:46+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Scopri come utilizzare l'API Abilities di WordPress per trasformare le funzionalit\u00e0 del tuo plugin in servizi sicuri, basati su contratti e pronti per l'automazione tramite AI.","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","twitter_creator":"@carlodaniele","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Carlo Daniele","Tempo di lettura stimato":"13 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Guida pratica per cominciare a usare l&#8217;API Abilities di WordPress","datePublished":"2026-07-30T06:23:14+00:00","dateModified":"2026-07-31T10:32:46+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/"},"wordCount":2350,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/","url":"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/","name":"Introduzione all'API Abilities di WordPress: una guida pratica","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","datePublished":"2026-07-30T06:23:14+00:00","dateModified":"2026-07-31T10:32:46+00:00","description":"Scopri come utilizzare l'API Abilities di WordPress per trasformare le funzionalit\u00e0 del tuo plugin in servizi sicuri, basati su contratti e pronti per l'automazione tramite AI.","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/api-abilities-wordpress\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"API","item":"https:\/\/kinsta.com\/it\/argomenti\/api\/"},{"@type":"ListItem","position":3,"name":"Guida pratica per cominciare a usare l&#8217;API Abilities di WordPress"}]},{"@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\/84784","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=84784"}],"version-history":[{"count":6,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/84784\/revisions"}],"predecessor-version":[{"id":84802,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/84784\/revisions\/84802"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/84784\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/84784\/translations\/it"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/84784\/translations\/jp"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/84784\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/84785"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=84784"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=84784"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=84784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}