<?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>Sat, 15 Aug 2026 13:26:21 +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>WordPress AI Bridge layer: scrivere plugin production-ready nel 2026</title>
		<link>https://www.mrtux.it/wordpress-ai-bridge-layer-plugin-2026</link>
					<comments>https://www.mrtux.it/wordpress-ai-bridge-layer-plugin-2026#respond</comments>
		
		<dc:creator><![CDATA[Emilio Petrozzi]]></dc:creator>
		<pubDate>Sat, 15 Aug 2026 13:26:19 +0000</pubDate>
				<category><![CDATA[sviluppo-web]]></category>
		<category><![CDATA[AI Connector]]></category>
		<category><![CDATA[plugin AI]]></category>
		<category><![CDATA[sviluppo plugin]]></category>
		<category><![CDATA[trascrizione audio]]></category>
		<category><![CDATA[WordPress 7]]></category>
		<category><![CDATA[WP AI Bridge]]></category>
		<category><![CDATA[wp_ai_request]]></category>
		<guid isPermaLink="false">https://www.mrtux.it/wordpress-ai-bridge-layer-scrivere-plugin-production-ready-nel-2026</guid>

					<description><![CDATA[WordPress AI Bridge layer: scrivere plugin che consumano wp_ai_request in modo production-ready. Caso reale audio-to-text con Whisper ed ElevenLabs.]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Apertura: il Bridge layer non è quello che pensavi</h2>



<p class="wp-block-paragraph">Quando nel 2026 si parla di <a href="https://www.mrtux.it/wordpress-7-0-funzionalita-editoriali-armstrong" data-wpel-link="internal" target="_self" rel="noopener">WordPress 7.0 AI Connectors</a> la maggior parte delle guide si ferma alla schermata di configurazione e all&#x27;elenco dei provider supportati. Il Bridge layer, che è il componente architetturale centrale introdotto con WordPress 7.0 e approfondito da Kinsta nella sua analisi architetturale &quot;WordPress AI integration: Architecture and a real-world example&quot; pubblicata nell&#x27;agosto 2026, resta quasi sempre sullo sfondo. Eppure è esattamente lì che si decide la qualità di un plugin AI: un Bridge layer trattato come una semplice funzione di passaggio verso un provider API produce un plugin fragile, con costi imprevedibili e comportamenti diversi per ogni connettore. Trattato come una interfaccia contract-driven con capability distinte, retry, telemetria e gestione della concorrenza, diventa la base per plugin AI che reggono anni di produzione.</p>



<p class="wp-block-paragraph">Nei prossimi paragrafi attraversiamo il Bridge layer come lo tratterebbe uno sviluppatore senior: cos&#x27;è davvero, quali sono gli errori classici di chi scrive il primo plugin AI, come costruire un caso reale audio-to-text che usa il Bridge per trascrizione Whisper e sintesi vocale ElevenLabs, e come progettare il plugin per scalare su siti con migliaia di utenti senza bucare il budget. Non serve imparare una nuova SDK proprietaria: serve solo capire cosa promette il Bridge e cosa invece tocca ancora a te.</p>



<p class="wp-block-paragraph">Questo articolo completa il quadro iniziato con la <a href="https://www.mrtux.it/wp7-ai-connectors-guida-operativa" data-wpel-link="internal" target="_self" rel="noopener">guida ai Connectors di WordPress 7.0</a> e il <a href="https://www.mrtux.it/wp-plugin-ai-mcp-abilities-pattern" data-wpel-link="internal" target="_self" rel="noopener">pattern ufficiale Plugin Team 2026 basato su MCP e abilities</a>, portandolo dal piano architetturale al piano del codice di plugin pronto per un repository pubblico.</p>



<h2 class="wp-block-heading">Cos&#x27;è davvero il Bridge layer (e perché non è un wrapper)</h2>



<p class="wp-block-paragraph">Il Bridge layer è la superficie PHP uniforme introdotta con WordPress 7.0 che permette a qualsiasi plugin di inviare istruzioni, prompt, file multimediali e strutture dati verso un provider AI senza conoscere i dettagli del protocollo del provider stesso. La confusione nasce dal fatto che, nel core, <code>wp_ai_request()</code> sembra una semplice funzione di chiamata. In realtà è il punto di accesso a una pipeline con cinque responsabilità distinte: serializzazione del payload nel formato atteso dal Connector attivo, applicazione dei limiti (rate limit, token cap, dimensione file), instradamento verso il Connector selezionato, gestione della risposta (incluso streaming per modelli che lo supportano) e propagazione degli errori con una gerarchia di eccezioni specifica (<code>WP_AI_Quota_Exceeded</code>, <code>WP_AI_Safety_Blocked</code>, <code>WP_AI_Transient_Error</code> e così via).</p>



<p class="wp-block-paragraph">Quando il Bridge è usato come un wrapper - ovvero come se fosse una chiamata diretta a OpenAI o Anthropic - il plugin si lega a un singolo provider e perde la portabilità che i Connectors promettono. Quando invece il Bridge è usato come un contratto - chiedendo al Bridge una capability (&quot;trascrivi questo audio in testo&quot;, &quot;sintetizza 700 caratteri di testo in voce&quot;) senza imporre quale provider la esegua - il plugin diventa portabile tra provider, sopravvive a cambi di connettore e può essere testato contro un Connector mock senza dipendere da una chiave API live.</p>



<p class="wp-block-paragraph">Da un punto di vista più ampio, il Bridge layer è il componente che permette al core di WordPress di esporre la capacità AI come una risorsa del sistema operativo, non come un hack applicativo. Questa è la stessa logica che muove l&#x27;<a href="https://www.mrtux.it/abilities-api-wordpress-6-9-casi-uso-non-ai" data-wpel-link="internal" target="_self" rel="noopener">Abilities API introdotta con WordPress 6.9</a>: una volta che esiste un contratto standard, plugin diversi possono esporre funzionalità compatibili senza che ognuno reimplementi l&#x27;integrazione con il provider.</p>



<h2 class="wp-block-heading">I tre errori classici del primo plugin AI</h2>



<p class="wp-block-paragraph">La maggior parte dei plugin AI scritti nella prima metà del 2026 cade in uno o più di tre errori che avrebbero potuto essere evitati ripensando il Bridge come un contratto. Vediamoli.</p>



<h3 class="wp-block-heading">1. Chiamare direttamente il Connector invece del Bridge</h3>



<p class="wp-block-paragraph">Il primo errore è pensare che il Bridge sia un optional e che per risparmiare hop di rete convenga chiamare direttamente il Connector attivo. In un&#x27;installazione dove il cliente ha configurato OpenAI, funziona. Appena il cliente passa a Claude per ragioni di costo, il plugin si rompe. Il Bridge esiste esattamente per evitare questa dipendenza: il tuo plugin chiede al Bridge una capability (&quot;voglio Whisper Large v3&quot;), il Bridge la instrada verso il Connector opportuno, e tu non sai (e non ti importa) quale provider la sta eseguendo.</p>



<h3 class="wp-block-heading">2. Ignorare i limiti dichiarati dal Connector</h3>



<p class="wp-block-paragraph">Ogni Connector dichiara i propri limiti operativi: token per minuto per il piano scelto, MB per file sul caricamento audio, finestra di contesto del modello selezionato. Il Bridge ti restituisce questi limiti se li chiedi tramite <code>wp_ai_get_connector_capabilities()</code>. Il secondo errore è partire con il payload &quot;a fiducia&quot;, sperando che il Connector rifiuti i task troppo grandi. Così si finisce con chiamate che timeout a 60 secondi, crediti bruciati e utenti che si lamentano del plugin, non del Connector.</p>



<h3 class="wp-block-heading">3. Non implementare retry e idempotenza</h3>



<p class="wp-block-paragraph">Le API AI sono reti unreliable per natura: un errore 429 in fase di rate-limit, un 503 del provider, un 504 del gateway intermedio sono eventi normali, non eccezioni. Il Bridge restituisce questi errori come <code>WP_AI_Transient_Error</code>, con una eccezione che ha una proprietà <code>retry_after</code> con il numero di secondi suggeriti. Il terzo errore classico è non gestire la transient error: il plugin fallisce al primo errore di rete, l&#x27;utente clicca di nuovo, e il prompt duplicato finisce per essere eseguito due volte con doppio costo.</p>



<p class="wp-block-paragraph">Per evitare questi errori, prima di scrivere qualsiasi plugin AI vale la pena rileggere la documentazione ufficiale del Bridge su make.wordpress.org/core e le analisi che il Plugin Team ha pubblicato sui <a href="https://www.mrtux.it/wordpress-plugin-team-2026-triage-ai" data-wpel-link="internal" target="_self" rel="noopener">prerequisiti per la review dei plugin AI-assisted nel 2026</a>.</p>



<h2 class="wp-block-heading">Architettura del nostro plugin di esempio</h2>



<p class="wp-block-paragraph">Per dare concretezza al discorso, costruiamo un plugin reale che fa due cose solo apparentemente banali: trascrive un file audio caricato nella libreria media usando il Bridge layer con modello Whisper, e genera una versione audio sintetica (text-to-speech) di un estratto dell&#x27;articolo usando il Bridge con un modello vocale come ElevenLabs. È un caso che migliaia di editori e podcast avrebbero voluto avere nel 2025 ma che potevano implementare solo con chiamate dirette a OpenAI o ElevenLabs.</p>



<p class="wp-block-paragraph">Il plugin, che chiameremo <code>wp-podcast-bridge</code>, si compone di quattro blocchi. Il primo è un custom post type <code>episode</code> con metadati per trascrizione, lingua di origine, lunghezza audio. Il secondo è un servizio <code>Bridge_Audio_Service</code> che incapsula tutte le chiamate al Bridge, con metodi come <code>transcribe( $attachment_id, $language = &#x27;auto&#x27; )</code> e <code>synthesize( $post_id, $voice_id, $max_chars = 700 )</code>. Il terzo è una classe <code>Cost_Tracker</code> che registra in una tabella custom il consumo di token per episodio, così da poter mostrare al cliente quanto sta spendendo senza dover aprire la dashboard del provider. Il quarto è una interfaccia REST con due endpoint, <code>/wp-podcast-bridge/v1/transcribe</code> e <code>/wp-podcast-bridge/v1/synthesize</code>, protetti da capability checks.</p>



<pre class="wp-block-code"><code>&lt;?php
/**
 * Plugin Name: WP Podcast Bridge
 * Description: Trascrizione Whisper e sintesi vocale via WordPress AI Bridge layer.
 * Version:     1.0.0
 * Requires at least: 6.9
 * Requires PHP: 7.4
 *
 * AI Use Disclosure: questo plugin consuma il Bridge AI layer introdotto
 * con WordPress 7.0 per le capability di trascrizione audio e sintesi vocale.
 * Nessuna SDK proprietaria di provider viene inclusa.
 */

defined( 'ABSPATH' ) || exit;

class Bridge_Audio_Service {

    private const CAPABILITY_TRANSCRIBE  = 'wp_ai.audio.transcribe';
    private const CAPABILITY_SYNTHESIZE  = 'wp_ai.audio.synthesize';

    public function transcribe( int $attachment_id, string $language = 'auto' ): array|WP_Error {
        $file = get_attached_file( $attachment_id );
        if ( ! $file || ! is_readable( $file ) ) {
            return new WP_Error( 'no_file', 'Allegato non leggibile.' );
        }

        // capability check esplicito prima della chiamata al Bridge
        if ( ! wp_ai_current_user_can( self::CAPABILITY_TRANSCRIBE ) ) {
            return new WP_Error( 'forbidden', 'Capability mancante per la trascrizione.' );
        }

        // recupero il Bridge handler
        $bridge = wp_ai_get_bridge();
        if ( is_wp_error( $bridge ) ) {
            return $bridge;
        }

        // payload dichiara la capability, non il provider
        $payload = array(
            'capability' =&gt; self::CAPABILITY_TRANSCRIBE,
            'input'      =&gt; array(
                'file_path' =&gt; $file,
                'language'  =&gt; $language,
                'format'    =&gt; pathinfo( $file, PATHINFO_EXTENSION ),
            ),
            'options'    =&gt; array(
                'max_retries' =&gt; 3,
                'timeout'     =&gt; 120,
            ),
        );

        $response = wp_ai_request( $payload );

        if ( is_wp_error( $response ) ) {
            $this-&gt;log_failure( 'transcribe', $response );
            return $response;
        }

        return array(
            'text'      =&gt; $response['text'] ?? '',
            'language'  =&gt; $response['language'] ?? $language,
            'segments'  =&gt; $response['segments'] ?? array(),
            'provider'  =&gt; $response['provider'] ?? 'unknown',
            'cost_usd'  =&gt; $response['cost_usd'] ?? null,
        );
    }
}</code></pre>



<p class="wp-block-paragraph">Questa è la versione completa del Bridge service per la trascrizione. Si noti che nessun riferimento al provider compare esplicitamente: è il Bridge che sceglie, in base al Connector attivo e alla capability richiesta.</p>



<h2 class="wp-block-heading">Gestione di rate limit, retry e idempotency key</h2>



<p class="wp-block-paragraph">Il Bridge restituisce errori con una gerarchia ricca che non va ignorata. Una <code>WP_AI_Quota_Exceeded</code> significa che l&#x27;utente ha esaurito il budget del piano, non c&#x27;è retry che tenga: meglio bloccare la coda e mostrare un messaggio chiaro. Una <code>WP_AI_Transient_Error</code> ha invece una proprietà <code>retry_after</code> numerica: rispettarla prima di ritentare.</p>



<p class="wp-block-paragraph">Nel nostro plugin usiamo un decoratore che avvolge la chiamata al Bridge con un retry esponenziale e una idempotency key derivata da <code>episode_id + step_name + content_hash</code>. In questo modo una stessa richiesta, se ritentata, non genera un doppio addebito sul provider.</p>



<pre class="wp-block-code"><code>&lt;?php
class Bridge_Request_With_Retry {

    private int $max_attempts = 4;

    public function execute( callable $callback, string $idempotency_key ) {
        $attempt = 0;
        $delay   = 1;

        while ( $attempt &lt; $this-&gt;max_attempts ) {
            $attempt++;
            $response = $callback();

            if ( ! is_wp_error( $response ) ) {
                return $response;
            }

            $error_code = $response-&gt;get_error_code();

            // transient error: respect retry_after
            if ( 'wp_ai_transient_error' === $error_code ) {
                $retry_after = (int) $response-&gt;get_error_data( 'retry_after' );
                sleep( max( $delay, $retry_after ) );
                $delay *= 2;
                continue;
            }

            // quota esaurita: stop immediato, niente retry
            if ( 'wp_ai_quota_exceeded' === $error_code ) {
                return $response;
            }

            // errore non transitorio: logga e stop
            return $response;
        }

        return new WP_Error( 'max_retries', 'Numero massimo di retry raggiunto.' );
    }
}</code></pre>



<p class="wp-block-paragraph">Il decoratore non è una scelta di design opzionale. Senza retry intelligente, il plugin fallisce tre volte su dieci in condizioni di reale produzione e l&#x27;utente pensa che il Bridge sia inaffidabile, quando invece è il plugin a esserlo.</p>



<h2 class="wp-block-heading">Cost tracker: spendere meno di quanto si pensava</h2>



<p class="wp-block-paragraph">Un aspetto trascurato del Bridge layer è che il core non espone automaticamente la dashboard dei costi del Connector: lascia al plugin la responsabilità di tracciarli. Un plugin che non traccia nulla finisce per essere un buco nei costi del cliente, e i clienti questo non lo perdonano.</p>



<pre class="wp-block-code"><code>&lt;?php
class Bridge_Cost_Tracker {

    private string $table;

    public function __construct() {
        global $wpdb;
        $this-&gt;table = $wpdb-&gt;prefix . 'wp_podcast_bridge_costs';
    }

    public function record( int $episode_id, string $capability, array $response ): void {
        if ( empty( $response['cost_usd'] ) ) {
            return;
        }

        global $wpdb;
        $wpdb-&gt;insert(
            $this-&gt;table,
            array(
                'episode_id'      =&gt; $episode_id,
                'capability'      =&gt; $capability,
                'provider'        =&gt; $response['provider'] ?? 'unknown',
                'cost_usd'        =&gt; (float) $response['cost_usd'],
                'tokens_in'       =&gt; (int) ( $response['tokens_in']  ?? 0 ),
                'tokens_out'      =&gt; (int) ( $response['tokens_out'] ?? 0 ),
                'recorded_at'     =&gt; current_time( 'mysql', true ),
            ),
            array( '%d', '%s', '%s', '%f', '%d', '%d', '%s' )
        );
    }

    public function monthly_cost_usd(): float {
        global $wpdb;
        $start = gmdate( 'Y-m-01 00:00:00' );

        // somma del costo del mese corrente
        $sum = (float) $wpdb-&gt;get_var(
            $wpdb-&gt;prepare(
                "SELECT COALESCE(SUM(cost_usd), 0) FROM {$this-&gt;table} WHERE recorded_at &gt;= %s",
                $start
            )
        );

        return $sum;
    }
}</code></pre>



<p class="wp-block-paragraph">Con questa classe, il plugin può mostrare al cliente nel back-office una riga &quot;costo mensile AI: € 12,40 (3,1 ore di audio trascritte, 14 sintesi vocali)&quot; prima ancora che il cliente apra la dashboard del provider. È una funzionalità che vale molto più di qualsiasi ottimizzazione di prestazioni, perché rende il costo un dato anziché un mistero.</p>



<h2 class="wp-block-heading">Confronto rapido: Bridge vs chiamata diretta al provider</h2>




<figure class="wp-block-table"><table><thead><tr><th>Aspetto</th><th>Chiamata diretta al provider</th><th>Via Bridge layer</th></tr></thead><tbody><tr><td>Portabilità tra provider</td><td>Bassa (binding esplicito a uno)</td><td>Alta (capability-based)</td></tr><tr><td>Gestione rate limit</td><td>Manuale, plugin per plugin</td><td>Centralizzata nel Bridge</td></tr><tr><td>Gestione credenziali</td><td>Una copia per plugin</td><td>Una sola nel Connector</td></tr><tr><td>Telemetria dei costi</td><td>Da costruire</td><td>Bridge ritorna cost_usd</td></tr><tr><td>Testabilità</td><td>Richiede chiave API live</td><td>Mockable con Connector fittizio</td></tr><tr><td>Conformità Plugin Team 2026</td><td>Da dimostrare caso per caso</td><td>Ereditata dal core</td></tr></tbody></table></figure>




<p class="wp-block-paragraph">La scelta del Bridge non è solo una questione di eleganza architetturale: nel 2026 chi scrive plugin senza passare dal Bridge layer si espone al rischio concreto di rifiuto al triage del <a href="https://www.mrtux.it/wordpress-plugin-team-2026-triage-ai" data-wpel-link="internal" target="_self" rel="noopener">Plugin Team WordPress</a>, che considera esplicitamente la conformità al Bridge un prerequisito di qualità.</p>



<h2 class="wp-block-heading">Testing del plugin senza chiave API live</h2>



<p class="wp-block-paragraph">Una conseguenza spesso sottovalutata del Bridge layer è che il plugin diventa testabile in CI senza toccare la rete. È sufficiente registrare un Connector di test che implementa la stessa interfaccia ma restituisce risposte statiche.</p>



<pre class="wp-block-code"><code>&lt;?php
class Bridge_Mock_Connector implements WP_AI_Connector_Interface {

    public function slug(): string {
        return 'mock';
    }

    public function supports( string $capability ): bool {
        return in_array( $capability, array(
            'wp_ai.audio.transcribe',
            'wp_ai.audio.synthesize',
        ), true );
    }

    public function execute( array $payload ) {
        if ( 'wp_ai.audio.transcribe' === $payload['capability'] ) {
            return array(
                'text'       =&gt; 'Trascrizione di test.',
                'language'   =&gt; 'it',
                'provider'   =&gt; 'mock',
                'cost_usd'   =&gt; 0.0,
                'tokens_in'  =&gt; 0,
                'tokens_out' =&gt; 4,
            );
        }
        return array();
    }
}

add_filter( 'wp_ai_register_connector', function( $connectors ) {
    if ( defined( 'WP_PODCAST_BRIDGE_TESTING' ) ) {
        $connectors[] = new Bridge_Mock_Connector();
    }
    return $connectors;
} );</code></pre>



<p class="wp-block-paragraph">Con questo Connector fittizio, il test runner PHPUnit può eseguire tutti i test del plugin senza dipendere da una chiave API, da una connessione internet o dalla disponibilità del provider. È una garanzia enorme per la qualità del plugin su migliaia di installazioni attive.</p>



<h2 class="wp-block-heading">Dove arriva il Bridge nei prossimi mesi</h2>



<p class="wp-block-paragraph">Il Bridge layer consegnato con WordPress 7.0 è solo la prima iterazione. La roadmap resa pubblica dal core team prevede per il rilascio di WordPress 7.1 (in arrivo il 19 agosto 2026, come annunciato da Kinsta) l&#x27;integrazione con la Abilities API introdotta in 6.9, così da permettere ai plugin di esporre capability di alto livello che il Bridge può instradare su più provider in fallback. Questo significa che plugin scritti oggi con un Bridge capability-based saranno già compatibili con la release 7.1 senza modifiche. Plugin che invece chiamano direttamente il provider dovranno essere riscritti o mantenuti manualmente per sempre.</p>



<p class="wp-block-paragraph">In una prospettiva più lunga, il Bridge layer è anche l&#x27;elemento che abilita gli scenari di hosting managed con AI integrata di cui abbiamo parlato nella <a href="https://www.mrtux.it/wordpress-hosting-ai-bianco-etichetta" data-wpel-link="internal" target="_self" rel="noopener">guida al hosting white-label con AI</a>: se il Bridge è un contratto, un hosting provider può offrire Connector custom, garantire SLA, fatturare a consumo, e disaccoppiare la scelta del provider AI dall&#x27;esperienza del cliente finale.</p>



<h2 class="wp-block-heading">Lista di controllo per un plugin AI Bridge-ready</h2>



<p class="wp-block-paragraph">Prima di rilasciare un plugin che consuma il Bridge layer, vale la pena passare in rassegna questa checklist.</p>



<ul class="wp-block-list"><li>Il plugin chiama solo <code>wp_ai_request()</code> e mai direttamente il provider.</li><li>Il payload usa la chiave <code>capability</code> per descrivere cosa vuole, non quale provider usare.</li><li>Il plugin gestisce <code>WP_AI_Quota_Exceeded</code> con messaggio chiaro, senza retry.</li><li>Il plugin gestisce <code>WP_AI_Transient_Error</code> con <code>retry_after</code> rispettato.</li><li>Il plugin traccia i costi via Bridge in una tabella custom o tramite opzione.</li><li>Le capability sono verificate con <code>wp_ai_current_user_can()</code> prima di ogni chiamata.</li><li>Il plugin include un Connector mock per i test PHPUnit in CI.</li><li>Il plugin dichiara <code>requires at least: 7.0</code> nel header del file principale.</li><li>Il plugin documenta nel readme.txt la sezione AI Use Disclosure obbligatoria dal Q4 2026, secondo quanto discusso in <a href="https://www.mrtux.it/ai-use-disclosure-plugin-wordpress-directory-standard" data-wpel-link="internal" target="_self" rel="noopener">AI-use disclosure plugin WordPress</a>.</li></ul>



<h2 class="wp-block-heading">Domande frequenti</h2>



<p class="wp-block-paragraph"><strong>Il Bridge layer sostituisce le SDK dei provider?</strong> Sostituisce l&#x27;integrazione. Le SDK rimangono dentro il Connector e sono gestite dal core, non dal tuo plugin.</p>



<p class="wp-block-paragraph"><strong>Posso continuare a chiamare direttamente OpenAI dal mio plugin?</strong> Tecnicamente sì, ma perderai portabilità, telemetria centralizzata e conformità alle linee guida 2026 del Plugin Team.</p>



<p class="wp-block-paragraph"><strong>Cosa succede se l&#x27;utente non ha configurato nessun Connector?</strong> Il Bridge restituisce un <code>WP_Error</code> con codice <code>no_connector</code>. Il plugin deve gestirlo esplicitamente e mostrare un messaggio che invita alla configurazione.</p>



<p class="wp-block-paragraph"><strong>Il Bridge è disponibile anche in WordPress 6.9?</strong> No. Il Bridge layer è stato introdotto con WordPress 7.0. Per 6.9 esiste la sola Abilities API, che è complementare ma non sostitutiva.</p>



<p class="wp-block-paragraph"><strong>Come posso esporre il mio plugin come Connector per altri plugin?</strong> Registrandolo con <code>wp_ai_register_connector()</code> e implementando l&#x27;interfaccia <code>WP_AI_Connector_Interface</code>. È il pattern che i Bridge ufficiali di OpenAI, Anthropic e Google hanno seguito.</p>



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



<ul class="wp-block-list"><li><a href="https://www.mrtux.it/wp7-ai-connectors-guida-operativa" data-wpel-link="internal" target="_self" rel="noopener">WordPress 7.0 AI Connectors: guida operativa per sviluppatori e agenzie</a> - panoramica introduttiva sul sistema Connector + Bridge.</li><li><a href="https://www.mrtux.it/wp-plugin-ai-mcp-abilities-pattern" data-wpel-link="internal" target="_self" rel="noopener">Plugin AI WordPress con MCP e abilities: pattern ufficiale 2026</a> - come costruire plugin AI che dialogano anche con MCP.</li><li><a href="https://www.mrtux.it/abilities-api-wordpress-6-9-casi-uso-non-ai" data-wpel-link="internal" target="_self" rel="noopener">Abilities API WordPress 6.9: guida operativa 2026 completa</a> - il complemento del Bridge per capability non-AI.</li><li><a href="https://www.mrtux.it/wordpress-plugin-team-2026-triage-ai" data-wpel-link="internal" target="_self" rel="noopener">WordPress Plugin Team 2026: come il triage AI cambia le regole per chi pubblica</a> - linee guida di submission e conformità Bridge.</li><li><a href="https://kinsta.com/blog/wordpress-ai/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Kinsta Blog - WordPress AI integration: Architecture and a real-world example</a> - articolo fonte per l&#x27;analisi architetturale del Bridge.</li><li><a href="https://kinsta.com/blog/wordpress-abilities-api/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Kinsta Blog - Getting started with the WordPress Abilities API</a> - guida pratica all&#x27;Abilities API di WordPress 6.9.</li><li><a href="https://make.wordpress.org/core/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Documentazione ufficiale Bridge AI su make.wordpress.org/core</a> - riferimento canonico per signature delle funzioni e gerarchia errori.</li><li><a href="https://github.com/WordPress/wp-ai-client" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WordPress AI Bridge layer su GitHub - wordPress/wp-ai-client</a> - repository ufficiale con esempi di plugin che consumano il Bridge.</li><li><a href="https://www.mrtux.it/ai-use-disclosure-plugin-wordpress-directory-standard" data-wpel-link="internal" target="_self" rel="noopener">AI-use disclosure plugin WordPress: come prepararsi al nuovo standard del directory</a> - sezione AI Use Disclosure obbligatoria dal Q4 2026.</li><li><a href="https://www.mrtux.it/wordpress-hosting-ai-bianco-etichetta" data-wpel-link="internal" target="_self" rel="noopener">WordPress Hosting AI white-label: integrare AI senza diventare rivenditore OpenAI</a> - come sfruttare il Bridge per scenari hosting managed.</li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mrtux.it/wordpress-ai-bridge-layer-plugin-2026/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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>
