Guida completa allo sviluppo di plugin per WordPress: creare da zero plugin PHP professionali

Leggere in 3 minuti.
2026-03-13
2026-06-05
2,071
Guadagno delle commissioni quando fai acquisti tramite i link qui sotto, senza alcun costo aggiuntivo per te.

La struttura di base e i file di un plugin per WordPress

Un plugin standard per WordPress richiede almeno un file principale. Questo file principale prende di solito il nome dello stesso plugin, ad esempio… my-first-plugin.phpAll’inizio di quel file, deve essere presente un commento di intestazione specifico per comunicare al sistema WordPress le informazioni metadati del plugin. Queste informazioni includono il nome del plugin, la descrizione, la versione, l’autore, ecc., e verranno visualizzate sulla pagina di gestione dei plugin nell’area amministrativa.

Oltre al file principale, un plugin ben strutturato di solito include altri directory e file per organizzare il codice. Le strutture di directory più comuni includono quelle destinate al contenimento dei file CSS e JavaScript./assetsIndice, che contiene i file delle classi PHP./includesIl contenuto del “catalogo”, nonché i materiali utilizzati per i modelli delle interfacce utente (user interface templates)./templatesIndice. Questa struttura modulare facilita la manutenzione del codice e la collaborazione tra i membri del team.

Il file principale di un plugin rappresenta il punto di ingresso per l’intera funzionalità del plugin stesso. Oltre a contenere le informazioni di metadati, le sue principali responsabilità includono la registrazione e l’attivazione/deattivazione dei “hook” (meccanismi di interazione con il sistema), l’importazione dei file di dipendenza necessari, nonché l’inizializzazione delle funzionalità centrali del plugin. Grazie a un’organizzazione dei file appropriata, è possibile garantire che il plugin mantenga una struttura chiara, anche quando le sue funzionalità sono complesse.

Si consiglia di leggere Guida all’approccio di base allo sviluppo di plugin per WordPress

Crea il tuo primo plugin di base.

Iniziamo creando il plugin più semplice possibile, “Hello World”, per familiarizzarci con il processo di creazione dei plugin e con il loro ciclo di vita di base.

UltaHost – Hosting per siti WordPress
Garanzia di rimborso entro 30 giorni, larghezza di banda illimitata e accesso ai database, protezione gratuita contro gli attacchi DDoS; sconto del 50% per l’acquisto di un piano valido per 3 anni (da 3 a 4 TB di spazio di archiviazione).

Definire le informazioni del plugin e la funzione principale

Prima di tutto, nella directory di installazione di WordPress sul tuo computer locale…/wp-content/plugins/Nel percorso, crea una nuova cartella chiamata “hello-world”. All’interno di questa cartella, crea un file con il nome…hello-world.phpIl file…

All’inizio di questo file, è necessario aggiungere le informazioni relative alla testa del plugin. Una tipica testa di plugin è la seguente:

<?php
/**
 * Plugin Name:       你好世界示例插件
 * Plugin URI:        https://yourwebsite.com/hello-world
 * Description:       这是一个用于演示的简单WordPress插件。
 * Version:           1.0.0
 * Author:            你的名字
 * Author URI:        https://yourwebsite.com
 * License:           GPL v2 or later
 * Text Domain:       hello-world
 * Domain Path:       /languages
 */

Successivamente, aggiungeremo una funzionalità semplice a questo plugin: inserire automaticamente un testo alla fine del contenuto dell’articolo. Possiamo farlo…the_contentPer implementare il filtro, aggiungete il seguente codice dopo le informazioni presenti all’inizio del file principale:

function hello_world_add_footer_text( $content ) {
    // 仅在单篇文章页面添加
    if ( is_single() ) {
        $footer_text = '<p><em>Questo articolo è stato generato dal plugin “Ciao Mondo”.</em></p>';
        $content .= $footer_text;
    }
    return $content;
}
add_filter( 'the_content', 'hello_world_add_footer_text' );

Attivazione e disattivazione dei plugin

I plugin professionali dovrebbero gestire correttamente la logica relativa all’attivazione e alla disattivazione. Ad esempio, all’attivazione di un plugin potrebbe essere necessario creare tabelle nel database o impostare opzioni predefinite; in caso di disattivazione, potrebbe essere necessario eliminare i dati temporanei. Noi utilizziamo…register_activation_hookregister_deactivation_hookLa funzione viene utilizzata per registrare i relativi “hook” (meccanismi di interazione).

Si consiglia di leggere Sviluppo di plugin per WordPress: dall'introduzione alla perfezione: creazione di funzionalità personalizzate e di estensioni efficienti

Aggiungi il codice al file principale:

// 插件激活时执行的操作
function hello_world_activate() {
    // 例如:添加一个选项到数据库
    if ( ! get_option( 'hello_world_installed' ) ) {
        add_option( 'hello_world_installed', time() );
    }
    // 可以在这里刷新固定链接规则,以确保新注册的URL结构生效
    flush_rewrite_rules();
}
register_activation_hook( __FILE__, 'hello_world_activate' );

// 插件停用时执行的操作
function hello_world_deactivate() {
    // 例如:删除我们创建的临时选项(谨慎操作,用户数据通常不删除)
    // delete_option( 'hello_world_installed' );
    // 清理重写规则
    flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'hello_world_deactivate' );

Dopo aver completato i passaggi precedenti, potrai vedere e attivare il “Plugin di esempio ”Ciao Mondo“” nella pagina “Plugin” del pannello di amministrazione di WordPress. Una volta attivato, visitando qualsiasi articolo, noterai il testo aggiunto in fondo al contenuto.

Potenziare le funzionalità utilizzando l’API di base di WordPress

WordPress offre un’API estremamente ricca, che consente agli sviluppatori di plugin di interagire in modo sicuro e standardizzato con il sistema di base. Conoscere queste API è fondamentale per svolgere attività di sviluppo professionale.

hosting.com Hosting condiviso
Prestazioni elevate con CPU AMD EPYC, storage SSD NVMe e LiteSpeed, supporto interno di esperti 24 ore su 24, 7 giorni su 7, misure di sicurezza avanzate, tra cui SSL, brute force, malware e protezione DDoS, risparmi fino a 73%

Utilizzare gli action hook e i filtri

Gli “Action Hooks” ti permettono di inserire e eseguire il tuo codice in momenti specifici. Ad esempio, quando un articolo viene pubblicato, WordPress attiva automaticamente degli Action Hooks.save_postAzioni. È possibile procedere in questo modo…add_action()La funzione monta la propria funzione su questo “gancio” (hook).

function hello_world_on_post_publish( $post_id, $post, $update ) {
    // 检查是否不是修订版本,并且是发布操作
    if ( wp_is_post_revision( $post_id ) || $post->post_status != 'publish' ) {
        return;
    }
    // 发送邮件通知或执行其他逻辑
    // wp_mail( '[email protected]', '新文章已发布', '文章标题:' . $post->post_title );
}
add_action( 'save_post', 'hello_world_on_post_publish', 10, 3 );

I “Filter Hooks” ti permettono di modificare i dati. Come detto in precedenza…the_contentUn esempio rappresenta un tipico utilizzo di un filtro. Un altro esempio comune è la modifica dei titoli degli articoli.

function hello_world_modify_title( $title ) {
    return '【推荐】' . $title;
}
// add_filter( 'the_title', 'hello_world_modify_title' ); // 谨慎使用,这会修改所有标题

Creare una pagina di menu di gestione e opzioni.

Molti plugin richiedono un’interfaccia di back-end per la configurazione delle impostazioni. WordPress offre funzioni per aggiungere facilmente menu principali o sottomenu nel pannello di amministrazione.

Si consiglia di leggere Imparare a sviluppare plugin per WordPress: costruire moduli personalizzati ed efficienti da zero

Il codice seguente mostra come creare una semplice pagina di opzioni e utilizzare l’API di configurazione di WordPress per salvare in modo sicuro un’opzione.

// 步骤1:向管理后台添加一个菜单项
function hello_world_add_admin_menu() {
    add_menu_page(
        '你好世界设置',       // 页面标题
        '你好世界插件',       // 菜单标题
        'manage_options',     // 所需权限
        'hello-world-settings', // 菜单slug
        'hello_world_settings_page', // 用于渲染页面的回调函数
        'dashicons-admin-generic', // 图标(可选)
        80                    // 菜单位置
    );
}
add_action( ‘admin_menu‘, ‘hello_world_add_admin_menu’ );

// 步骤2:定义设置页面的HTML内容
function hello_world_settings_page() {
    ?&gt;
    <div class="”wrap”">
        <h1>Impostazioni del plugin “Hello World”</h1>
        <form method="”post”" action="/it/”options.php”/" data-trp-original-action="”options.php”">
            <?php
                settings_fields( ‘hello_world_settings_group’ ); // 输出设置字段和非ce字段
                do_settings_sections( ‘hello-world-settings’ ); // 输出设置部分
                submit_button(); // 输出提交按钮
            ?>
        <input type="hidden" name="trp-form-language" value="it"/></form>
    </div>
    &lt;?php
}

// 步骤3:注册设置、字段和章节
function hello_world_settings_init() {
    // 注册一个新的设置项到“hello_world_settings_group”组
    register_setting( ‘hello_world_settings_group’, ‘hello_world_custom_message’ );

// 在页面中新增一个章节
    add_settings_section(
        ‘hello_world_settings_section’,
        ‘自定义消息设置’,
        ‘hello_world_settings_section_callback’,
        ‘hello-world-settings‘
    );

// 向章节中添加一个字段
    add_settings_field(
        ‘hello_world_message_field’,
        ‘前台显示的消息’,
        ‘hello_world_message_field_render’,
        ‘hello-world-settings’,
        ‘hello_world_settings_section’
    );
}
add_action( ‘admin_init’, ‘hello_world_settings_init’ );

// 章节描述的回调函数
function hello_world_settings_section_callback() {
    echo ‘<p>Qui si configura il contenuto del messaggio che verrà visualizzato sul frontend tramite il plugin.</p>’;
}

// 字段渲染的回调函数
function hello_world_message_field_render() {
    $option = get_option( ‘hello_world_custom_message’, ‘这是默认消息’ );
    echo ‘<input type="”text”" name="”hello_world_custom_message”" value="”‘" . esc_attr( $option ) ‘“ size ="”40”" />’;
}

Con il codice sopra riportato, hai creato una pagina di configurazione che rispetta gli standard di WordPress e consente di salvare i dati in modo sicuro.

Hosting condiviso InterServer
Hosting condiviso $2,50 USD al mese, primo mese $0,1 USD codice promozionale tryinterserver, 461 script di applicazioni cloud, installazione con un clic.

Sicurezza dei plugin, prestazioni e preparazione alla pubblicazione

Prima di condividere un plugin con altri o di inviarlo al catalogo ufficiale, è essenziale assicurarsi che sia sicuro, efficiente e facile da utilizzare.

Seguire le migliori pratiche di sicurezza.

La sicurezza è la priorità assoluta nello sviluppo di plugin. Il principio fondamentale è: non fidarsi mai degli input forniti dagli utenti. Tutti i dati provenienti dagli utenti o da fonti esterne devono essere trattati con cautela, senza dare per scontata la loro affidabilità.$_GET$_POST$_COOKIEPrima di utilizzarli per interrogare i database, visualizzarli su pagine web o eseguire comandi di sistema, è necessario verificarli, pulirli o escaparli.

Per i contenuti che vengono visualizzati in HTML, utilizzare…esc_html()esc_attr()wp_kses_post()È necessario eseguire l'escape delle funzioni come, ad esempio, print().

`echo ‘`‘<div class="”“‘" . esc_attr( $user_provided_class ) ‘“>’ . esc_html( $user_provided_content ) . ‘</div>’;

Per le query al database, assolutamente non si dovrebbero concatenare direttamente le variabili alle istruzioni SQL. È necessario utilizzare metodi appropriati per inserirle nel codice.$wpdb->prepare()Il metodo viene utilizzato per l’elaborazione preliminare dei dati.

global $wpdb;
$user_id = 123;
$query = $wpdb->prepare(
    “SELECT * FROM {$wpdb->prefix}my_table WHERE user_id = %d”,
    $user_id
);
$results = $wpdb->get_results( $query );

Inoltre, tutte le funzioni di callback accessibili agli utenti (sia tramite AJAX sul front-end che tramite operazioni sul back-end) devono utilizzare…current_user_can()check_ajax_referer()Utilizzare funzioni come queste per effettuare verifiche sui diritti di accesso e sulla sicurezza.

Ottimizzare le prestazioni dei plugin

I plugin con prestazioni scarse possono influenzare negativamente l’esperienza d’uso di tutto il sito web. L’ottimizzazione può essere avviata da diversi aspetti: utilizzare correttamente la cache per evitare che vengano eseguite query complesse al database o chiamate a API remote ad ogni caricamento della pagina. WordPress offre l’opzione delle API transienti (instantaneous APIs).(Transients API)Permette di memorizzare facilmente dati temporanei.

// 尝试从缓存获取数据
$data = get_transient( ‘my_plugin_expensive_data’ );
if ( false === $data ) {
    // 缓存中没有,执行昂贵操作
    $data = expensive_database_query();
    // 将结果缓存12小时
    set_transient( ‘my_plugin_expensive_data’, $data, 12 * HOUR_IN_SECONDS );
}

In secondo luogo, assicurarsi che i file CSS e JavaScript vengano caricati soltanto sulle pagine necessarie. Per farlo, è possibile utilizzare tecniche di caricamento dinamico dei file, in base alle esigenze dell’utente o alle condizioni dell’interfaccia.wp_enqueue_script()wp_enqueue_style()Le funzioni permettono di controllare con precisione il caricamento dei risorse e le loro relazioni di dipendenza. Per i risorse di backend, è possibile montarle (ovvero farle disponibili all’applicazione) in modo appropriato.admin_enqueue_scriptsGancio; per i risorse front-end, viene effettuato il montaggio su di esso.wp_enqueue_scriptsGancio.

Prepararsi per l’internazionalizzazione e la pubblicazione.

Per permettere agli utenti di tutto il mondo di utilizzare il plugin, l’internazionalizzazione (i18n) è un passaggio essenziale. Ciò significa che è necessario avvolgere tutte le stringhe destinate agli utenti all’interno di funzioni specifiche.

Cambiare le stringhe presenti nel plugin da:

echo “Hello World!”;

Cambia in:

echo __( ‘Hello World!’, ‘hello-world’ );

Among them‘hello-world’È stato tu a definirlo all’interno del file di configurazione del plugin.Text DomainPoi, puoi utilizzare strumenti come Poedit per generare il contenuto desiderato..potI file dei modelli, in base ai quali i traduttori possono creare versioni in diverse lingue..po.moFile: Posizionare questi file di traduzione all’interno della parte iniziale del plugin.Domain PathIl directory specificato (ad esempio…)/languagesBasta cliccare qui sotto.

Prima della pubblicazione, assicurati di redigere un testo dettagliato.readme.txtIl file deve essere conforme ai requisiti ufficiali di WordPress e contenere una descrizione del plugin, istruzioni per l’installazione, informazioni sui problemi più comuni, ecc. Questo è un requisito obbligatorio per la pubblicazione nel catalogo di plugin di WordPress. Inoltre, è importante aggiungere commenti dettagliati in PHP nel codice del plugin: non solo aiuterà gli altri a comprendere il funzionamento del codice, ma rappresenterà anche un segno di professionalità.

Riassumendo

Questo articolo presenta in modo sistematico l’intero processo di sviluppo di un plugin WordPress professionale partendo da zero. Iniziamo comprendendo la struttura di base di un plugin, per poi creare il primo plugin semplice che include la logica di attivazione/disattivazione. Successivamente, esploriamo in dettaglio il potente sistema di hook di azioni e filtri di WordPress, nonché il modo in cui essi possono essere integrati in profondità con il core del sistema, creando pagine di configurazione standard. Infine, sottolineiamo le norme di sicurezza essenziali nello sviluppo di plugin, i metodi per ottimizzare le prestazioni e i preparativi necessari per la pubblicazione a livello globale. Acquisendo queste conoscenze e competenze fondamentali, sarai in grado di creare plugin WordPress di livello professionale sicuri, efficienti e facili da mantenere, per soddisfare sia esigenze personali che quelle di un pubblico più ampio.

FAQ - Domande frequenti

Per sviluppare plugin per WordPress, è necessario padroneggiare alcune nozioni di base. Ecco alcune delle competenze essenziali:

Per sviluppare plugin per WordPress, è necessario disporre di una solida conoscenza della programmazione in PHP, poiché il codice dei plugin è composto principalmente da questo linguaggio. Inoltre, è fondamentale avere una conoscenza di base di HTML, CSS e JavaScript per gestire la visualizzazione e l’interazione dell’interfaccia utente. La cosa più importante è essere familiari con i concetti fondamentali di WordPress, come gli “hook” (meccanismi di integrazione), i “shortcode” (stringhe di codice utilizzabili per creare contenuti dinamici), i tipi di articoli personalizzabili (Custom Post Types – CPT) e le operazioni sul database.$wpdbL’uso di…

Come si debugga un plugin per WordPress che si sta sviluppando?

Un metodo efficace per il debug è attivare le funzionalità di debug di WordPress.WP_DEBUG“Modello… Nel tuo…”wp-config.phpNel documento, verrà indicato che...define( ‘WP_DEBUG’, false );Cambia in:define( ‘WP_DEBUG’, true );Puoi anche abilitare più funzionalità contemporaneamente.WP_DEBUG_LOGRegistra gli errori in un file di log, oppure attiva questa funzionalità.WP_DEBUG_DISPLAYMostrare gli errori sullo schermo (solo nell’ambiente di sviluppo). Inoltre, l’utilizzo degli strumenti di sviluppo del browser ( scheda Console, scheda Network) è essenziale per il debug del JavaScript front-end e delle richieste AJAX.

Come posso garantire che il mio plugin sia compatibile con altri plugin?

Il segreto per garantire una buona compatibilità consiste nel seguire gli standard di codifica di WordPress e nell’utilizzare con attenzione le variabili globali nonché i nomi delle funzioni. Aggiungere un prefisso unico alle funzioni, alle classi e alle costanti del tuo plugin è la migliore pratica per evitare conflitti di nomi; ad esempio, è possibile utilizzare un prefisso specifico per identificare i componenti del plugin.myplugin_Oppure utilizzare abbreviazioni relative ai sviluppatori come prefisso. Quando modifichi contenuti che potrebbero essere correlati ad altri plugin (ad esempio, il testo degli articoli o i titoli), assicurati che la funzione di callback del tuo filtro abbia la priorità appropriata.add_filterIl terzo parametro… e prestare attenzione al formato del valore restituito. Utilizzarlo in modo appropriato.class_exists()function_exists()Per verificare se una certa classe o funzione è già stata definita, è possibile implementare un meccanismo di caricamento condizionale o fornire una soluzione alternativa.

È necessario padroneggiare la programmazione orientata agli oggetti (OOP) per sviluppare plugin?

虽然使用传统的面向过程编程方式也可以开发功能完整的插件,但强烈推荐学习和使用面向对象编程(OOP)。OOP能够更好地组织代码,通过类(Class)来封装功能,提高代码的可复用性和可维护性。对于中大型插件项目,使用OOP结合命名空间(Namespaces)和自动加载(Autoloading)是行业内的标准做法,它能让你更清晰地区分不同模块,并显著降低代码的耦合度。