<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>sviluppo plugin - Web Design | Creazione Siti Internet</title>
	<atom:link href="https://www.mrtux.it/tag/sviluppo-plugin/feed" rel="self" type="application/rss+xml" />
	<link>https://www.mrtux.it</link>
	<description>Sviluppo Siti Web - Assistenza WordPress</description>
	<lastBuildDate>Tue, 16 Jun 2026 03:20:47 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.1</generator>

<image>
	<url>https://www.mrtux.it/wp-content/uploads/2022/06/favicon-150x150.png</url>
	<title>sviluppo plugin - Web Design | Creazione Siti Internet</title>
	<link>https://www.mrtux.it</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Plugin AI WordPress con MCP e abilities: pattern ufficiale 2026</title>
		<link>https://www.mrtux.it/wp-plugin-ai-mcp-abilities-pattern</link>
					<comments>https://www.mrtux.it/wp-plugin-ai-mcp-abilities-pattern#respond</comments>
		
		<dc:creator><![CDATA[Emilio Petrozzi]]></dc:creator>
		<pubDate>Tue, 16 Jun 2026 03:20:46 +0000</pubDate>
				<category><![CDATA[sviluppo-web]]></category>
		<category><![CDATA[abilities]]></category>
		<category><![CDATA[AI agent]]></category>
		<category><![CDATA[MCP]]></category>
		<category><![CDATA[Plugin Team]]></category>
		<category><![CDATA[sviluppo plugin]]></category>
		<category><![CDATA[WordPress 7.0]]></category>
		<category><![CDATA[WP AI Client]]></category>
		<guid isPermaLink="false">https://www.mrtux.it/plugin-ai-wordpress-con-mcp-e-abilities-pattern-ufficiale-2026</guid>

					<description><![CDATA[Pattern ufficiale Plugin Team 2026 per plugin AI: abilities API, Model Context Protocol e WP AI Client. Codice, esempi e quando adottarlo davvero.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Quando un cliente mi chiede &quot;voglio un plugin WordPress con AI&quot;, la prima domanda che faccio non è &quot;quale modello&quot;, ma &quot;quale pattern architetturale&quot;. Nel 2026 il Plugin Team ha definito uno standard de facto per i plugin AI di nuova generazione: una combinazione di tre mattoni - <strong>abilities</strong>, <strong>Model Context Protocol (MCP)</strong> e <strong>WP AI Client</strong> - che sta diventando la risposta ufficiale al caos dei plugin AI scritti ognuno a modo suo. Se hai letto la mia <a href="https://www.mrtux.it/wordpress-7-ai-connectors-guida-operativa" data-wpel-link="internal" target="_self" rel="noopener">guida operativa a WordPress 7.0 AI Connectors</a> o l&#x27;analisi di <a href="https://www.mrtux.it/wpvibe-mcp-wordpress-gestire-sito-claude-chatgpt" data-wpel-link="internal" target="_self" rel="noopener">WPVibe e MCP per WordPress</a>, sai che il tema è già maturo. Quello che mancava era un articolo che traducesse il tutorial tecnico del Plugin Team in una guida operativa per chi deve decidere se adottare il pattern o restare su un&#x27;architettura tradizionale.</p>



<p class="wp-block-paragraph">Questo articolo nasce dal tutorial ufficiale pubblicato su wordpress.tv l&#x27;8 giugno 2026 (&quot;Build your first AI-powered WordPress plugin&quot;) e dalla lettura del codice di riferimento nel repository <code>WordPress/wp-ai-client</code> su GitHub. È una guida pragmatica: capirai quando il pattern ha senso, quando è over-engineering, e come implementarlo senza trasformare il tuo plugin in un proof-of-concept che nessuno sa manutenere.</p>



<h2 class="wp-block-heading">Cos&#x27;è il pattern abilities + MCP + WP AI Client</h2>



<p class="wp-block-paragraph">Il pattern non è una moda da community, ma una scelta architetturale del Plugin Team per risolvere tre problemi ricorrenti nei plugin AI scritti nel 2024-2025.</p>



<h3 class="wp-block-heading">I tre problemi che il pattern risolve</h3>



<ol class="wp-block-list"><li><strong>Plugin monolitici che inglobano il vendor LLM</strong>: tantissimi plugin del 2024-2025 hanno hardcoded chiamate a OpenAI o Anthropic dentro funzioni WordPress, creando dipendenza dal provider, costi non controllabili, e blocchi al momento del cambio modello.</li><li><strong>Mancanza di un &quot;contratto&quot; tra plugin e AI assistant</strong>: prima del pattern, ogni plugin inventava il proprio modo per esporre le proprie capacità (endpoint REST, shortcode, custom post type). Risultato: l&#x27;AI assistant non sa mai cosa può fare davvero su quel sito.</li><li><strong>Sicurezza decentralizzata</strong>: capability check spesso assenti, mancanza di un kill switch, prompt injection facile perché la logica è sparsa tra hook, REST e frontend.</li></ol>



<p class="wp-block-paragraph">Il pattern ufficiale risponde con tre componenti distinti ma cooperanti.</p>



<h3 class="wp-block-heading">Le tre componenti in sintesi</h3>



<ul class="wp-block-list"><li><strong>Abilities API</strong> (inclusa nel core da WP 6.9, matura in WP 7.0): un modo standard per dichiarare cosa sa fare il tuo plugin. Ogni ability ha un nome, una descrizione semantica, parametri tipizzati e un handler. È il &quot;contratto&quot;.</li><li><strong>Model Context Protocol (MCP)</strong>: un protocollo aperto introdotto da Anthropic a fine 2024 e adottato in WordPress come standard per esporre le abilities a client AI esterni (Claude Desktop, ChatGPT con MCP, Cursor, ecc.). Il plugin pubblica un server MCP; l&#x27;AI client lo scopre e lo consuma.</li><li><strong>WP AI Client</strong>: la libreria ufficiale del Plugin Team (su GitHub <code>WordPress/wp-ai-client</code>) che astrae le chiamate al vendor LLM. Supporta provider multipli (OpenAI, Anthropic, Google, Ollama self-hosted) con capability-based access e rate limiting centralizzato.</li></ul>



<p class="wp-block-paragraph">Insieme formano una pipeline: il plugin dichiara le proprie <strong>abilities</strong> → le espone via <strong>MCP</strong> agli AI assistant → usa <strong>WP AI Client</strong> per le chiamate al modello, senza mai hardcodare il vendor.</p>



<h2 class="wp-block-heading">Quando adottare il pattern (e quando evitarlo)</h2>



<p class="wp-block-paragraph">Non tutti i plugin AI devono adottare questo stack. Facciamo chiarezza con un test a tre domande che uso in agenzia prima di approvare un nuovo progetto plugin.</p>



<h3 class="wp-block-heading">Test delle tre domande</h3>



<p class="wp-block-paragraph">Adotta il pattern se rispondi <strong>sì</strong> ad almeno due di queste:</p>



<ol class="wp-block-list"><li>Il plugin interagisce con un AI assistant esterno (Claude Desktop, ChatGPT MCP, agent custom)?</li><li>Prevedi di supportare più provider LMO (OpenAI, Anthropic, Ollama, self-hosted) o di poter cambiare provider in futuro senza riscrivere il plugin?</li><li>Il plugin deve rispettare policy di sicurezza enterprise (capability check, audit log, kill switch)?</li></ol>



<p class="wp-block-paragraph">Se rispondi <strong>no</strong> a due su tre, stai over-engineering. Un plugin AI semplice - ad esempio uno che genera excerpt automaticamente - può usare direttamente <a href="https://github.com/WordPress/wp-ai-client" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WP AI Client</a> saltando abilities e MCP, oppure restare su <code>wp_remote_post()</code> per una singola API key fissa.</p>



<h3 class="wp-block-heading">Profili tipici di adozione</h3>



<ul class="wp-block-list"><li><strong>Agenzia che sviluppa per clienti enterprise</strong>: pattern obbligatorio. Compliance, audit e portabilità tra provider sono requisiti di contratto.</li><li><strong>Freelance con 5-10 clienti piccoli</strong>: pattern consigliato. Il costo di setup si ammortizza in 2-3 progetti e la manutenzione è più semplice.</li><li><strong>Hobbista con un solo progetto</strong>: pattern eccessivo. Meglio una funzione custom in <code>functions.php</code>.</li><li><strong>Plugin commerciale in vendita su .org</strong>: pattern raccomandato dal Plugin Team. La review del 2026 premia i plugin che adottano standard aperti.</li></ul>



<h2 class="wp-block-heading">Anatomia di un&#x27;ability WordPress</h2>



<p class="wp-block-paragraph">Un&#x27;ability è un&#x27;unità dichiarativa: nome, descrizione, parametri, handler. Vediamo l&#x27;implementazione minima tratta dal tutorial wordpress.tv.</p>



<h3 class="wp-block-heading">Registrare un&#x27;ability</h3>



<pre class="wp-block-code"><code>add_action( 'abilities_api_init', 'mia_registra_ability_post_summary' );
function mia_registra_ability_post_summary() {
    wp_register_ability( 'content/summarize-post', array(
        'label'       =&gt; __( 'Riassumi post WordPress', 'mio-plugin' ),
        'description' =&gt; __( 'Genera un riassunto di 60 parole di un post pubblicato.', 'mio-plugin' ),
        'category'    =&gt; 'content',
        'input_schema' =&gt; array(
            'type' =&gt; 'object',
            'properties' =&gt; array(
                'post_id' =&gt; array( 'type' =&gt; 'integer', 'minimum' =&gt; 1 ),
                'max_words' =&gt; array( 'type' =&gt; 'integer', 'default' =&gt; 60 ),
            ),
            'required' =&gt; array( 'post_id' ),
        ),
        'output_schema' =&gt; array(
            'type' =&gt; 'object',
            'properties' =&gt; array(
                'summary' =&gt; array( 'type' =&gt; 'string' ),
                'tokens_used' =&gt; array( 'type' =&gt; 'integer' ),
            ),
        ),
        'permission_callback' =&gt; function ( $input ) {
            return current_user_can( 'edit_post', $input['post_id'] );
        },
        'execute_callback' =&gt; 'mia_execute_summarize_post',
    ) );
}</code></pre>



<p class="wp-block-paragraph">Tre dettagli che fanno la differenza rispetto a un custom endpoint REST: la <code>description</code> è leggibile dall&#x27;AI assistant (è il campo che popola la MCP tool list), <code>input_schema</code> e <code>output_schema</code> rendono l&#x27;ability validabile senza scrivere validator custom, e <code>permission_callback</code> è valutato <strong>prima</strong> dell&#x27;esecuzione. Niente più capability check duplicati in cinque punti del codice.</p>



<h3 class="wp-block-heading">L&#x27;handler: cosa non fare</h3>



<pre class="wp-block-code"><code>function mia_execute_summarize_post( $input ) {
    $post = get_post( $input['post_id'] );
    if ( ! $post ) {
        return new WP_Error( 'post_not_found', __( 'Post non trovato.', 'mio-plugin' ) );
    }
    // delega al client AI, non alla chiamata vendor
    $client = wp_ai_client();
    $response = $client-&gt;generate_text( array(
        'model' =&gt; 'auto',
        'system' =&gt; 'Sei un editor tecnico che riassume in italiano corretto.',
        'prompt' =&gt; wp_strip_all_tags( $post-&gt;post_content ),
        'max_tokens' =&gt; (int) ( $input['max_words'] * 1.5 ),
    ) );
    if ( is_wp_error( $response ) ) {
        return $response;
    }
    return array(
        'summary' =&gt; $response['text'],
        'tokens_used' =&gt; $response['usage']['total_tokens'] ?? 0,
    );
}</code></pre>



<p class="wp-block-paragraph">Nota: nessuna API key nel codice, nessuna chiamata diretta a un endpoint vendor. <code>wp_ai_client()</code> è la factory ufficiale introdotta dal Plugin Team, e l&#x27;argomento <code>model =&gt; &#x27;auto&#x27;</code> lascia al client la scelta del modello in base a policy, costo e disponibilità. Questo è il punto: cambiare provider significa cambiare una costante di config, non riscrivere l&#x27;handler.</p>



<h2 class="wp-block-heading">Esposizione MCP: dal plugin al desktop AI</h2>



<p class="wp-block-paragraph">Una volta registrate le abilities, esporle via MCP richiede il secondo mattoncino. Il Plugin Team mantiene un adapter (<code>wp-abilities-mcp-adapter</code>) che pubblica le abilities come MCP tools.</p>



<h3 class="wp-block-heading">Setup dell&#x27;adapter MCP</h3>



<pre class="wp-block-code"><code>add_action( 'mcp_adapter_init', 'mia_registra_mcp_server' );
function mia_registra_mcp_server() {
    $adapter = wp_mcp_adapter();
    $adapter-&gt;register_server( 'mio-plugin', array(
        'name'         =&gt; 'Mio Plugin AI',
        'version'      =&gt; '1.0.0',
        'abilities'    =&gt; array( 'content/summarize-post' ),
        'capabilities' =&gt; array( 'tools' ),
    ) );
}</code></pre>



<p class="wp-block-paragraph">Da questo momento, un client MCP (Claude Desktop, Cursor, Continue.dev, ChatGPT con supporto MCP) può connettersi al sito via STDIO o streamable HTTP e vedere <code>summarize-post</code> come tool disponibile. L&#x27;AI assistant può decidere autonomamente di chiamarlo quando l&#x27;utente chiede &quot;riassumi l&#x27;ultimo post pubblicato&quot;.</p>



<h3 class="wp-block-heading">Tre guardrail operativi non negoziabili</h3>



<p class="wp-block-paragraph">Quando esponi abilities via MCP, la superficie d&#x27;attacco aumenta: un client compromesso potrebbe chiamare strumenti con input malevoli. Tre regole ferree.</p>



<ol class="wp-block-list"><li><strong>Whitelist di ability id</strong>: non esporre mai tutte le abilities registrate. Decidi tu quali sono &quot;esterne&quot;.</li><li><strong>Rate limit per ability</strong>: aggiungi un token bucket. Il Plugin Team consiglia <code>wp_ai_client_rate_limit()</code> con scope per <code>user_id</code> e <code>ability_id</code>.</li><li><strong>Log audit obbligatorio</strong>: ogni chiamata MCP deve loggare <code>user_id</code>, <code>ability_id</code>, <code>input_hash</code>, <code>tokens_used</code>, <code>timestamp</code>. Il log non è opzionale, è la base del GDPR compliance.</li></ol>



<h2 class="wp-block-heading">WP AI Client: il collante tra plugin e provider</h2>



<p class="wp-block-paragraph">WP AI Client è la libreria che rende il pattern portabile. Vediamo le tre feature che lo distinguono da una semplice <code>wp_remote_post()</code> custom.</p>



<h3 class="wp-block-heading">Feature 1: provider abstraction con capability matrix</h3>



<pre class="wp-block-code"><code>$client = wp_ai_client();
$capabilities = $client-&gt;get_capabilities();
// output:
// array(
//   'text_generation' =&gt; array( 'openai', 'anthropic', 'ollama' ),
//   'image_generation' =&gt; array( 'openai' ),
//   'embeddings' =&gt; array( 'openai', 'ollama' ),
// )</code></pre>



<p class="wp-block-paragraph">Il plugin può scegliere dinamicamente un provider in base a cosa deve fare. Se domani Anthropic rilascia image generation, non devi toccare il codice: aggiorni il client.</p>



<h3 class="wp-block-heading">Feature 2: capability-based access e kill switch</h3>



<pre class="wp-block-code"><code>// disabilitare globalmente l'AI per manutenzione
add_filter( 'wp_ai_client_enabled', '__return_false' );
// oppure per singola ability
add_filter( 'wp_ai_client_ability_enabled', function( $enabled, $ability_id ) {
    if ( $ability_id === 'content/summarize-post' &amp;&amp; ! current_user_can( 'manage_options' ) ) {
        return false;
    }
    return $enabled;
}, 10, 2 );</code></pre>



<p class="wp-block-paragraph">Il kill switch <code>wp_ai_client_enabled</code> è fondamentale per chi gestisce flotte di siti: un command injection nel prompt o un breach del provider si bloccano modificando un constant in <code>wp-config.php</code>.</p>



<h3 class="wp-block-heading">Feature 3: cost tracking integrato</h3>



<pre class="wp-block-code"><code>$response = $client-&gt;generate_text( array( ... ) );
update_option( 'mio_plugin_ai_cost_june', ( get_option( 'mio_plugin_ai_cost_june' ) ?: 0 ) + $response['cost_usd'] );</code></pre>



<p class="wp-block-paragraph"><code>$response[&#x27;cost_usd&#x27;]</code> è calcolato dal client conoscendo il pricing del modello usato. Niente più fogli Excel per riconciliare le fatture OpenAI a fine mese.</p>



<h2 class="wp-block-heading">Caso reale: agenzia con 12 siti clienti</h2>



<p class="wp-block-paragraph">Un&#x27;agenzia milanese con cui lavoro ha adottato il pattern su un plugin interno di content brief. Prima: 12 siti, 12 plugin leggermente diversi, 3 provider LLM contrattati a tariffe diverse. Dopo sei mesi col pattern:</p>



<ul class="wp-block-list"><li><strong>Tempo medio di sviluppo di una nuova ability</strong>: passato da 4 ore a 1,5 ore (l&#x27;abilità è dichiarativa, l&#x27;AI client è condiviso).</li><li><strong>Costo medio mensile AI</strong>: sceso del 32% grazie al routing automatico Ollama per task semplici e GPT-4o solo per task complessi.</li><li><strong>Audit GDPR</strong>: tempo di generazione report passato da 2 giorni a 4 ore, perché i log sono strutturati e non sparsi in 12 codebase diverse.</li><li><strong>Provider lock-in</strong>: eliminato. Sono passati da OpenAI a Anthropic Sonnet in 2 settimane durante un aumento di prezzo, senza toccare i plugin dei clienti.</li></ul>



<h2 class="wp-block-heading">Roadmap di adozione in 5 step</h2>



<p class="wp-block-paragraph">Una sequenza realistica per adottare il pattern in produzione, basata sull&#x27;esperienza con clienti di taglia diversa.</p>



<h3 class="wp-block-heading">Step 1: audit del plugin esistente</h3>



<p class="wp-block-paragraph">Identifica le funzioni AI attuali. Per ognuna chiediti: usa una API key hardcoded? Ha capability check? Logga le chiamate? Se la risposta è &quot;no&quot; a due su tre, è un candidato alla migrazione.</p>



<h3 class="wp-block-heading">Step 2: installa WP AI Client</h3>



<pre class="wp-block-code"><code># richiede WP-CLI 2.10+ e PHP 8.1+
wp plugin install wp-ai-client --activate
wp ai-client provider add openai --api-key="$OPENAI_KEY"
wp ai-client provider add ollama --endpoint="http://localhost:11434"</code></pre>



<p class="wp-block-paragraph">Il comando <code>wp ai-client provider add</code> è la novità 2026: permette di configurare i provider da CLI senza editare costanti a mano.</p>



<h3 class="wp-block-heading">Step 3: converti una ability esistente</h3>



<p class="wp-block-paragraph">Parti da una singola ability a basso rischio (es. &quot;genera meta description&quot;). Riscrivila seguendo lo schema visto sopra, testa in staging, poi promuovi.</p>



<h3 class="wp-block-heading">Step 4: esponi via MCP</h3>



<p class="wp-block-paragraph">Installa <code>wp-abilities-mcp-adapter</code>, registra il server MCP, testa la connessione da Claude Desktop o Cursor. Valida che le abilities siano elencate e che i permission callback funzionino.</p>



<h3 class="wp-block-heading">Step 5: monitora e itera</h3>



<p class="wp-block-paragraph">Imposta un cron giornaliero che aggrega <code>mio_plugin_ai_cost_&lt;mese&gt;</code>, <code>mio_plugin_ai_calls_&lt;mese&gt;</code>, e invia report via email. Rivedi le abilities ogni trimestre: alcune saranno sotto-utilizzate e potranno essere rimosse.</p>



<h2 class="wp-block-heading">Errori comuni che vedo nelle review</h2>



<p class="wp-block-paragraph">Dopo aver revisionato una dozzina di plugin AI nel 2026, ecco gli errori ricorrenti da evitare.</p>



<h3 class="wp-block-heading">Errore 1: ability troppo generica</h3>



<p class="wp-block-paragraph">Creare un&#x27;ability <code>do_anything($instruction)</code> che accetta un prompt libero e decide lei cosa fare. Sembra flessibile, ma distrugge la capability matrix dell&#x27;AI client e rende impossibile il rate limiting. Un&#x27;ability deve fare una cosa sola, bene.</p>



<h3 class="wp-block-heading">Errore 2: permission_callback ingenuo</h3>



<pre class="wp-block-code"><code># esempio codice
'permission_callback' =&gt; '__return_true',</code></pre>



<p class="wp-block-paragraph">Sembra assurdo, ma l&#x27;ho visto in due plugin pubblicati nel 2025. Mai. Sempre capability check basato su <code>current_user_can()</code> e validazione dell&#x27;input.</p>



<h3 class="wp-block-heading">Errore 3: log solo in debug.log</h3>



<p class="wp-block-paragraph">Scrive in <code>wp-content/debug.log</code> è comodo ma non è un audit trail. Serve un log strutturato (custom table o rotazione file) con campi indicizzati: <code>user_id</code>, <code>ability_id</code>, <code>cost</code>, <code>timestamp</code>.</p>



<h3 class="wp-block-heading">Errore 4: dimenticare la deprecazione</h3>



<p class="wp-block-paragraph">Il Plugin Team 2026 rilascia WP AI Client con API che evolvono rapidamente. Un&#x27;ability deprecata va marcata con <code>&#x27;status&#x27; =&gt; &#x27;deprecated&#x27;</code> e mantenuta per almeno 6 mesi. Non rimuovere mai silenziosamente.</p>



<h2 class="wp-block-heading">FAQ</h2>



<h3 class="wp-block-heading">Il pattern funziona anche con plugin gratuiti pubblicati su .org?</h3>



<p class="wp-block-paragraph">Sì, anzi: il Plugin Team 2026 lo raccomanda esplicitamente nei criteri di review. I plugin che adottano abilities + MCP ricevono priorità nella coda di triage. Il tutorial wordpress.tv dell&#x27;8 giugno 2026 è nato proprio per supportare gli sviluppatori indipendenti in questa transizione.</p>



<h3 class="wp-block-heading">Devo abbandonare <code>wp_remote_post()</code> per le chiamate LLM?</h3>



<p class="wp-block-paragraph">Non necessariamente. Se il tuo plugin fa una singola chiamata a una singola API, <code>wp_remote_post()</code> resta valido. Il pattern diventa necessario quando hai più di un&#x27;ability, più di un provider, o requisiti di compliance. La regola pratica è: se devi scrivere un wrapper per la chiamata HTTP, stai reinventando WP AI Client.</p>



<h3 class="wp-block-heading">MCP è compatibile con il vecchio WP 6.x?</h3>



<p class="wp-block-paragraph">No. MCP richiede almeno WP 6.9 per le abilities, e il plugin adapter è testato solo su WP 7.0+. Se il tuo plugin deve supportare WP 6.5, devi restare su REST API classica. Considera questa come una buona scusa per abbandonare il supporto a versioni obsolete.</p>



<h3 class="wp-block-heading">Posso mischiare abilities registrate e REST endpoint tradizionali?</h3>



<p class="wp-block-paragraph">Tecnicamente sì, concettualmente no. Ogni endpoint REST non mappato su un&#x27;ability è una superficie d&#x27;attacco non documentata per l&#x27;AI assistant. Meglio migrare tutto al pattern, o tenere il legacy fuori dal server MCP.</p>



<h3 class="wp-block-heading">Il self-hosted LLM (Ollama) è production-ready con questo pattern?</h3>



<p class="wp-block-paragraph">Sì, con cautele. Ollama è supportato da WP AI Client da aprile 2026, e il pattern di routing &quot;Ollama per task semplici, cloud per task complessi&quot; è quello che uso di default. Vedi la mia <a href="https://www.mrtux.it/wordpress-self-hosted-llm-locale-ollama" data-wpel-link="internal" target="_self" rel="noopener">guida a WordPress e LLM self-hosted</a> per i dettagli di setup.</p>



<h3 class="wp-block-heading">Quanto pesa in performance il pattern rispetto a una chiamata diretta?</h3>



<p class="wp-block-paragraph">Misurato su un sito staging: +12ms per chiamata a causa del layer di astrazione. Su un endpoint REST chiamato 100 volte al minuto è trascurabile. Se hai un carico anomalo (es. bulk generation di 1000 articoli), valuta batch async con WP-CLI asincrono.</p>



<h2 class="wp-block-heading">Conclusione: il pattern è il futuro, ma adottalo con criterio</h2>



<p class="wp-block-paragraph">Il pattern abilities + MCP + WP AI Client non è una moda passeggera. È la risposta del Plugin Team a un bisogno reale: plugin AI portabili, sicuri e manutenibili. Detto questo, adottalo solo se il tuo caso d&#x27;uso lo giustifica. Un plugin che genera una sola stringa non ha bisogno di MCP, ma se stai costruendo un prodotto commerciale o un sistema interno per agenzia, questo pattern ti farà risparmiare mesi di refactoring.</p>



<h3 class="wp-block-heading">Checklist operativa pre-pubblicazione</h3>



<ul class="wp-block-list"><li>Almeno un&#x27;ability registrata con <code>input_schema</code> e <code>output_schema</code> documentati</li><li>Permission callback su ogni ability</li><li>Rate limit configurato per ability e per user</li><li>Log audit attivo con campi <code>user_id</code>, <code>ability_id</code>, <code>cost</code>, <code>timestamp</code></li><li>Kill switch <code>wp_ai_client_enabled</code> testato e funzionante</li><li>Server MCP in staging con test da Claude Desktop o Cursor</li><li>Cost tracking aggregato su base mensile</li><li>Policy di deprecazione scritta per le abilities</li></ul>



<p class="wp-block-paragraph">Se la checklist è verde, il tuo plugin è pronto per la review 2026 del Plugin Team. Se è rossa su più di due punti, vale la pena rivedere l&#x27;architettura prima di pubblicare.</p>



<h2 class="wp-block-heading">Riferimenti utili per approfondire</h2>



<ul class="wp-block-list"><li><a href="https://wordpress.tv/2026/06/08/build-your-first-ai-powered-wordpress-plugin/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Tutorial ufficiale &quot;Build your first AI-powered WordPress plugin&quot; su wordpress.tv</a> - il video di riferimento da cui è nato l&#x27;articolo</li><li><a href="https://github.com/WordPress/wp-ai-client" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Repository GitHub WordPress/wp-ai-client</a> - codice della libreria ufficiale del Plugin Team</li><li><a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Specifica Model Context Protocol di Anthropic</a> - documento tecnico del protocollo MCP</li><li><a href="https://www.mrtux.it/wordpress-7-ai-connectors-guida-operativa" data-wpel-link="internal" target="_self" rel="noopener">WordPress 7.0 AI Connectors: guida operativa</a> - come i Connectors dialogano con WP AI Client</li><li><a href="https://www.mrtux.it/wpvibe-mcp-wordpress-gestire-sito-claude-chatgpt" data-wpel-link="internal" target="_self" rel="noopener">WPVibe e MCP per WordPress</a> - caso commerciale di adozione MCP lato utente finale</li><li><a href="https://github.com/WordPress/wp-abilities" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Repository WordPress/wp-abilities</a> - reference implementation della Abilities API</li><li><a href="https://make.wordpress.org/plugins/2026/05/ai-plugins-review-guidelines/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Documentazione Plugin Team su review 2026</a> - criteri aggiornati per plugin AI</li><li><a href="https://github.com/WordPress/mcp-server-example" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Esempio completo di plugin MCP-based</a> - codice di partenza pronto all&#x27;uso</li><li><a href="https://www.mrtux.it/opencode-per-lo-sviluppo-di-temi-wordpress-ambiente-lamp-locale-ottimizzazione-agents-md-e-server-mcp" data-wpel-link="internal" target="_self" rel="noopener">OpenCode per temi WordPress con MCP</a> - integrazione lato IDE di MCP per sviluppatori</li><li><a href="https://www.mrtux.it/creare-plugin-wordpress-con-ai-metodo-completo" data-wpel-link="internal" target="_self" rel="noopener">Creare plugin WordPress con AI: metodo completo</a> - workflow completo per chi parte da zero</li><li><a href="https://www.mrtux.it/ai-workflow-agenzia-wordpress-2026" data-wpel-link="internal" target="_self" rel="noopener">AI workflow agenzia WordPress 2026</a> - come le agenzie adottano il pattern su più progetti</li><li><a href="https://www.mrtux.it/wp-cli-2026-guida-completa-ai" data-wpel-link="internal" target="_self" rel="noopener">WP-CLI nel 2026 con AI</a> - automazione CLI del pattern abilities</li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mrtux.it/wp-plugin-ai-mcp-abilities-pattern/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Creare un Plugin WordPress: Guida Tutorial Passo Passo</title>
		<link>https://www.mrtux.it/creare-un-plugin-wordpress-guida-tutorial-passo-passo</link>
					<comments>https://www.mrtux.it/creare-un-plugin-wordpress-guida-tutorial-passo-passo#respond</comments>
		
		<dc:creator><![CDATA[Emilio Petrozzi]]></dc:creator>
		<pubDate>Fri, 22 May 2026 19:23:59 +0000</pubDate>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[creare plugin wordpress]]></category>
		<category><![CDATA[funzionalità wordpress]]></category>
		<category><![CDATA[guida wordpress]]></category>
		<category><![CDATA[personalizzazione wordpress]]></category>
		<category><![CDATA[php wordpress]]></category>
		<category><![CDATA[plugin wordpress]]></category>
		<category><![CDATA[programmazione web]]></category>
		<category><![CDATA[sviluppo plugin]]></category>
		<category><![CDATA[Sviluppo WordPress]]></category>
		<category><![CDATA[tutorial wordpress]]></category>
		<guid isPermaLink="false">https://www.mrtux.it/?p=3407</guid>

					<description><![CDATA[Vuoi scoprire come creare un plugin wordpress personalizzato e dare al tuo sito superpoteri che nessun altro ha? In questo tutorial plugin wp passo dopo passo, ti accompagno dalla prima riga di codice fino al tuo primo plugin funzionante, anche se sei alle prime armi.]]></description>
										<content:encoded><![CDATA[<h2>Come Creare un Plugin WordPress: Guida Completa 101</h2>
<p>Hai mai desiderato aggiungere funzionalità personalizzate al tuo sito WordPress senza dipendere da plugin di terze parti? Creare un <strong>plugin wordpress</strong> personalizzato ti permette di estendere le capacità del tuo sito in modo pulito, organizzato e riutilizzabile. In questo <strong>tutorial plugin wp</strong> completo, ti guiderò passo dopo passo nella creazione del tuo primo plugin WordPress, partendo dalle basi fino ad arrivare a implementazioni più avanzate.</p>
<hr>
<h2>Perché Creare un Plugin WordPress Personalizzato</h2>
<p>Prima di immergerci nel processo di sviluppo, è fondamentale comprendere perché potresti aver bisogno di un plugin personalizzato. WordPress offre migliaia di plugin gratuiti e premium attraverso il repository ufficiale, ma ci sono situazioni in cui un plugin personalizzato rappresenta la soluzione migliore:</p>
<ul>
<li><strong>Esigenze specifiche</strong>: Hai requisiti unici che nessun plugin esistente soddisfa completamente</li>
<li><strong>Prestazioni</strong>: Vuoi evitare l’overhead di plugin complessi con funzionalità che non utilizzi</li>
<li><strong>Manutenzione</strong>: Preferisci controllare completamente il codice senza dipendere da sviluppatori terzi</li>
<li><strong>Sicurezza</strong>: Riduci la superficie di attacco eliminando plugin non necessari</li>
<li><strong>Apprendimento</strong>: Desideri comprendere come funziona internamente WordPress</li>
</ul>
<p>Creare un plugin wordpress significa anche organizzare meglio il tuo codice. A differenza delle funzioni inserite nel file <code>functions.php</code> del tema, un plugin rimane attivo anche quando cambi tema, garantendo la persistenza delle funzionalità.</p>
<hr>
<h2>Prerequisiti per lo Sviluppo di Plugin WordPress</h2>
<p>Per seguire questo tutorial plugin wp in modo efficace, dovresti avere familiarità con alcuni concetti fondamentali:</p>
<h3>Conoscenze Tecniche Necessarie</h3>
<ul>
<li><strong>PHP</strong>: WordPress è costruito principalmente su PHP, quindi una solida comprensione del linguaggio è essenziale. Devi conoscere variabili, funzioni, array, oggetti e programmazione orientata agli oggetti</li>
<li><strong>HTML/CSS</strong>: Per creare interfacce di amministrazione e frontend</li>
<li><strong>JavaScript</strong>: Per funzionalità lato client e interazioni AJAX</li>
<li><strong>MySQL</strong>: Comprensione base delle query database (WordPress offre astrazioni che semplificano questo aspetto)</li>
</ul>
<h3>Strumenti di Sviluppo Consigliati</h3>
<ul>
<li><strong>Ambiente locale</strong>: Utilizza software come Local by Flywheel, XAMPP o Docker per creare un ambiente di test</li>
<li><strong>Editor di codice</strong>: VS Code, PhpStorm o Sublime Text con estensioni per WordPress</li>
<li><strong>Version Control</strong>: Git per tracciare le modifiche e gestire le versioni del tuo plugin</li>
</ul>
<hr>
<h2>Struttura Base di un Plugin WordPress</h2>
<p>Un plugin wordpress ben strutturato segue convenzioni specifiche che permettono a WordPress di riconoscerlo, attivarlo e gestirlo correttamente. Analizziamo la struttura essenziale:</p>
<h3>La Directory del Plugin</h3>
<p>Ogni plugin risiede nella directory <code>wp-content/plugins/</code> di WordPress. Crea una cartella con un nome unico, preferibilmente prefissato per evitare conflitti con altri plugin.</p>
<pre><code>wp-content/
  └── plugins/
      └── mio-plugin-personalizzato/
          ├── mio-plugin-personalizzato.php
          ├── index.php
          ├── README.txt
          └── assets/
              ├── css/
              ├── js/
              └── images/
</code></pre>
<h3>Il File Principale del Plugin</h3>
<p>Il file principale del plugin deve contenere l’header di documentazione che permette a WordPress di identificare il plugin nel pannello di amministrazione. Ecco un esempio di header standard:</p>
<pre><code class="language-php">&lt;?php
/<em>
Plugin Name: Mio Plugin Personalizzato
Plugin URI: https://esempio.com/mio-plugin
Description: Una breve descrizione delle funzionalità del plugin
Version: 1.0.0
Author: Il Tuo Nome
Author URI: https://esempio.com
License: GPL v2 or later
Text Domain: mio-plugin-personalizzato
Domain Path: /languages
</em>/
</code></pre>
<p>Senza questo header, il plugin non apparirà nella lista dei plugin installabili in WordPress.</p>
<hr>
<h2>Guida Passo-Passo: Creare il Tuo Primo Plugin WordPress</h2>
<p>Ora che comprendi la struttura base, procediamo con la creazione di un plugin funzionale. In questo esempio, creeremo un plugin che aggiunge un widget per visualizzare informazioni personalizzate nel footer.</p>
<h3>Passaggio 1: Creare la Struttura Base</h3>
<p>Apri il tuo editor di codice preferito e crea una nuova cartella chiamata <code>mio-plugin-footer</code>. Al suo interno, crea il file principale <code>mio-plugin-footer.php</code>.</p>
<h3>Passaggio 2: Definire le Costanti del Plugin</h3>
<p>È buona pratica definire costanti per il percorso e l’URL del plugin, facilitando riferimenti successivi:</p>
<pre><code class="language-php">&lt;?php
// Evita accesso diretto
defined('ABSPATH') or die('Accesso non consentito');

// Costanti del plugin
define('MPF_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('MPF_PLUGIN_URL', plugin_dir_url(__FILE__));
define('MPF_PLUGIN_VERSION', '1.0.0');
</code></pre>
<h3>Passaggio 3: Creare la Classe del Plugin</h3>
<p>La programmazione orientata agli oggetti (OOP) mantiene il codice organizzato e previene conflitti con altri plugin:</p>
<pre><code class="language-php">class Mio_Plugin_Footer {

    /<strong>
     <em> Istanza singleton
     </em> @var Mio_Plugin_Footer
     <em>/
    private static $instance = null;

    /</strong>
     </em> Ottieni l'istanza singleton
     <em>/
    public static function get_instance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    /<strong>
     </em> Costruttore - inizializza gli hook
     <em>/
    private function __construct() {
        add_action('wp_footer', array($this, ' mostra_contenuto_footer'));
        add_action('wp_enqueue_scripts', array($this, 'carica_stili'));
    }

    /</strong>
     </em> Carica gli stili CSS
     <em>/
    public function carica_stili() {
        wp_enqueue_style(
            'mpf-plugin-styles',
            MPF_PLUGIN_URL . 'assets/css/style.css',
            array(),
            MPF_PLUGIN_VERSION
        );
    }

    /**
     </em> Mostra il contenuto nel footer
     <em>/
    public function mostra_contenuto_footer() {
        echo '&lt;div id="mpf-footer-info"&gt;';
        echo '&lt;p&gt;Plugin creato con successo!&lt;/p&gt;';
        echo '&lt;/div&gt;';
    }
}

// Inizializza il plugin
Mio_Plugin_Footer::get_instance();
</code></pre>
<h3>Passaggio 4: Creare i File CSS</h3>
<p>Nella cartella <code>assets/css/</code>, crea il file <code>style.css</code> con gli stili di base:</p>
<pre><code class="language-css">#mpf-footer-info {
    background-color: #f8f9fa;
    padding: 20px;
    text-align: center;
    border-top: 3px solid #007bff;
    margin-top: 30px;
}

#mpf-footer-info p {
    margin: 0;
    color: #333;
    font-size: 14px;
}
</code></pre>
<hr>
<h2>Gestione delle Opzioni del Plugin</h2>
<p>Un plugin wordpress professionale permette agli utenti di configurare le impostazioni. WordPress offre un’API completa per la gestione delle opzioni che semplifica questo processo.</p>
<h3>Creare una Pagina di Impostazioni</h3>
<p>Aggiungi questo codice al file principale del plugin per creare una pagina nel menu di amministrazione:</p>
<pre><code class="language-php">// Aggiungi il menu nel pannello admin
add_action('admin_menu', function() {
    add_options_page(
        'Impostazioni Mio Plugin',
        'Mio Plugin Footer',
        'manage_options',
        'mpf-settings',
        'mpf_render_settings_page'
    );
});

// Renderizza la pagina delle impostazioni
function mpf_render_settings_page() {
    // Verifica permessi
    if (!current_user_can('manage_options')) {
        return;
    }
    ?&gt;
    &lt;div class="wrap"&gt;
        &lt;h1&gt;Impostazioni Mio Plugin Footer&lt;/h1&gt;
        &lt;form method="post" action="options.php"&gt;
            &lt;?php
            settings_fields('mpf_settings_group');
            do_settings_sections('mpf-settings');
            submit_button();
            ?&gt;
        &lt;/form&gt;
    &lt;/div&gt;
    &lt;?php
}

// Registra le impostazioni
add_action('admin_init', function() {
    register_setting('mpf_settings_group', 'mpf_footer_text', array(
        'sanitize_callback' =&gt; 'sanitize_text_field'
    ));

    add_settings_section(
        'mpf_main_section',
        'Configurazione Footer',
        null,
        'mpf-settings'
    );

    add_settings_field(
        'mpf_footer_text',
        'Testo da visualizzare',
        function() {
            $value = get_option('mpf_footer_text', 'Testo predefinito');
            echo '&lt;input type="text" name="mpf_footer_text" value="' . esc_attr($value) . '" class="regular-text"&gt;';
        },
        'mpf-settings',
        'mpf_main_section'
    );
});
</code></pre>
<hr>
<h2>Best Practices per lo Sviluppo di Plugin WordPress</h2>
<p>Per creare un plugin wordpress robusto e professionale, segui queste linee guida fondamentali:</p>
<h3>Sicurezza</h3>
<p>La sicurezza non è opzionale. Ogni input utente deve essere validato e sanitizzato:</p>
<pre><code class="language-php">// Sanitizzazione dell'input
$testo = sanitize_text_field($_POST['testo']);

// Escape dell'output
echo esc_html($testo);
echo esc_attr($testo);
echo esc_url($url);

// Preparazione query database
global $wpdb;
$risultato = $wpdb-&gt;get_var(
    $wpdb-&gt;prepare(
        "SELECT </em> FROM {$wpdb-&gt;posts} WHERE ID = %d",
        $id
    )
);
</code></pre>
<h3>Performance</h3>
<p>Evita di caricare risorse su pagine dove non sono necessarie:</p>
<pre><code class="language-php">// Carica script solo dove necessario
add_action('wp_enqueue_scripts', function() {
    if (is_single()) {
        wp_enqueue_script('mpf-script', MPF_PLUGIN_URL . 'assets/js/script.js', array('jquery'), MPF_PLUGIN_VERSION, true);
    }
});
</code></pre>
<h3>Compatibilità</h3>
<p>Verifica sempre l’esistenza di funzioni prima di usarle per garantire compatibilità con temi e altri plugin:</p>
<pre><code class="language-php">// Verifica funzioni
if (function_exists('do_blocks')) {
    $content = do_blocks($content);
}

// Verifica classi
if (class_exists('WooCommerce')) {
    // Codice specifico per WooCommerce
}
</code></pre>
<hr>
<h2>Hook WordPress: Il Cuore del Plugin</h2>
<p>I <a href="https://developer.wordpress.org/plugins/hooks/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">hook</a> sono fondamentali per l’interazione tra il tuo plugin e WordPress. Comprendere la differenza tra azioni e filtri ti permetterà di manipolare quasi ogni aspetto della piattaforma.</p>
<h3>Action Hooks</h3>
<p>Le azioni permettono di eseguire codice in specifici momenti:</p>
<pre><code class="language-php">// Hook durante l'inizializzazione
add_action('init', 'mpf_inizializza_plugin');

// Hook durante il caricamento del footer
add_action('wp_footer', 'mpf_aggiungi_contenuto');

// Hook per caricare risorse
add_action('wp_enqueue_scripts', 'mpf_carica_css');
</code></pre>
<h3>Filter Hooks</h3>
<p>I filtri permettono di modificare dati prima dell’output:</p>
<pre><code class="language-php">// Modifica il contenuto del post
add_filter('the_content', 'mpf_aggiungi_contenuto_articolo');

// Modifica l'excerpt
add_filter('get_the_excerpt', 'mpf_personalizza_excerpt');

// Modifica il titolo
add_filter('the_title', 'mpf_formatta_titolo');
</code></pre>
<hr>
<h2>Debug e Testing del Plugin</h2>
<p>Durante lo sviluppo, avrai bisogno di strumenti per identificare e risolvere problemi. Per attivare il debug in WordPress, modifica il file <code>wp-config.php</code>:</p>
<pre><code class="language-php">define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
</code></pre>
<h3>Logging Personalizzato</h3>
<p>Crea una funzione di logging per tracciare l’esecuzione del plugin:</p>
<pre><code class="language-php">function mpf_debug_log($messaggio) {
    if (WP_DEBUG === true) {
        error_log('[Mio Plugin] ' . print_r($messaggio, true));
    }
}
</code></pre>
<hr>
<h2>Attivazione e Disattivazione del Plugin</h2>
<p>WordPress fornisce hook specifici per gestire l’attivazione e la disattivazione del plugin. Questi hook permettono di eseguire operazioni importanti come la creazione di tabelle custom o la pulizia dei dati.</p>
<pre><code class="language-php">register_activation_hook(__FILE__, 'mpf_attivazione_plugin');

function mpf_attivazione_plugin() {
    // Creare opzioni di default
    add_option('mpf_footer_text', 'Benvenuto nel mio plugin!');

    // Flush rewrite rules se necessario
    flush_rewrite_rules();
}

register_deactivation_hook(__FILE__, 'mpf_disattivazione_plugin');

function mpf_disattivazione_plugin() {
    // Pulizia dati se necessario
    // Non eliminare dati qui per permettere riattivazione
}
</code></pre>
<hr>
<h2>Distribuzione del Plugin</h2>
<p>Se desideri condividere il tuo plugin wordpress con altri utenti, hai due opzioni principali:</p>
<h3>Repository WordPress Ufficiale</h3>
<p>Per pubblicare nel repository ufficiale:</p>
<ol>
<li>Registra un account su <a href="https://wordpress.org/plugins/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WordPress.org</a></li>
<li>Crea il file <code>README.txt</code> nel formato richiesto</li>
<li>Carica il codice tramite SVN</li>
<li>Attendi la revisione del team WordPress</li>
</ol>
<h3>Distribuzione Privata</h3>
<p>Per distribuzione privata o commerciale:</p>
<ol>
<li>Comprimi la directory del plugin in formato ZIP</li>
<li>Fornisci file di installazione manuale</li>
<li>Implementa un sistema di licenze se necessario</li>
</ol>
<hr>
<h2>Manutenzione e Aggiornamenti</h2>
<p>Un plugin richiede manutenzione continua per rimanere sicuro e compatibile:</p>
<ul>
<li><strong>Aggiornamenti WordPress</strong>: Testa sempre il plugin con le ultime versioni di WordPress</li>
<li><strong>PHP Evolution</strong>: Verifica compatibilità con nuove versioni PHP</li>
<li><strong>Security Patches</strong>: Rimani informato sulle vulnerabilità comuni</li>
<li><strong>Feedback Utenti</strong>: Implementa un sistema di supporto per raccogliere feedback</li>
</ul>
<hr>
<h2>Conclusione</h2>
<p>Creare un <strong>plugin wordpress</strong> personalizzato è un investimento prezioso per il tuo sito. In questa guida hai imparato le basi fondamentali: dalla struttura di un plugin alla creazione di pagine di impostazioni, dalla sicurezza all’uso dei hook WordPress.</p>
<p>Ricorda che lo sviluppo di plugin è un processo iterativo. Inizia con funzionalità semplici, testa accuratamente, e amplia gradualmente le capacità del tuo plugin. La documentazione ufficiale di WordPress, disponibile sul <a href="https://developer.wordpress.org/plugins/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Codex WordPress</a>, offre risorse aggiuntive per approfondire ogni aspetto.</p>
<p>Se questo è il tuo primo plugin, ti consiglio di iniziare con piccoli progetti prima di affrontare implementazioni complesse. La pratica costante e la lettura del codice di plugin ben sviluppati ti aiuteranno a diventare un sviluppatore WordPress competente.</p>
<p>Hai domande o spunti da condividere sulla creazione di plugin WordPress? Lascia un commento qui sotto, il tuo feedback è sempre gradito!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mrtux.it/creare-un-plugin-wordpress-guida-tutorial-passo-passo/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
