<?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>Actions - Web Design | Creazione Siti Internet</title>
	<atom:link href="https://www.mrtux.it/tag/actions/feed" rel="self" type="application/rss+xml" />
	<link>https://www.mrtux.it</link>
	<description>Sviluppo Siti Web - Assistenza WordPress</description>
	<lastBuildDate>Sat, 21 Mar 2026 19:26:17 +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>Actions - Web Design | Creazione Siti Internet</title>
	<link>https://www.mrtux.it</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Hook WordPress: Azioni e Filter per Plugin Professionali</title>
		<link>https://www.mrtux.it/hook-wordpress-azioni-e-filter-per-plugin-professionali</link>
					<comments>https://www.mrtux.it/hook-wordpress-azioni-e-filter-per-plugin-professionali#respond</comments>
		
		<dc:creator><![CDATA[Emilio Petrozzi]]></dc:creator>
		<pubDate>Sat, 21 Mar 2026 19:20:06 +0000</pubDate>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Actions]]></category>
		<category><![CDATA[Filters]]></category>
		<category><![CDATA[Hook]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[sviluppo]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://www.mrtux.it/?p=3227</guid>

					<description><![CDATA[Scopri come sfruttare azioni e filter per creare plugin WordPress professionali. Guida completa con 30+ esempi pratici, best practice e codice pronto all'uso per sviluppatori di tutti i livelli.]]></description>
										<content:encoded><![CDATA[<h1>Hook WordPress: Azioni e Filter per Plugin Professionali</h1>
<p><strong>Guida Completa 2026 per Sviluppatori WordPress</strong></p>
<hr />
<h2>🎯 Introduzione</h2>
<p>Gli <strong>hook</strong> sono il cuore pulsante di WordPress. Se vuoi sviluppare plugin professionali, temi child avanzati o semplicemente personalizzare il tuo sito senza modificare i file core, devi padroneggiare questo sistema.</p>
<p>In questa guida scoprirai:</p>
<ul>
<li>✅ La differenza tra <strong>Actions</strong> e <strong>Filters</strong></li>
<li>✅ <strong>30+ esempi pratici</strong> pronti all'uso</li>
<li>✅ Le <strong>best practice</strong> per hook sicuri ed efficienti</li>
<li>✅ Come <strong>intercettare eventi</strong> e modificare contenuti dinamicamente</li>
<li>✅ Gli hook <strong>essenziali</strong> che ogni sviluppatore deve conoscere</li>
</ul>
<p><strong>Prerequisiti:</strong> Conoscenza base di PHP e WordPress</p>
<p><strong>Tempo di lettura:</strong> 15-20 minuti</p>
<hr />
<h2>📚 Cosa Sono gli Hook WordPress?</h2>
<h3>Definizione</h3>
<p>Un <strong>hook</strong> è un punto di aggancio nel codice di WordPress che ti permette di eseguire il tuo codice personalizzato in momenti specifici del ciclo di vita di WordPress.</p>
<h3>Perché Sono Importanti?</h3>
<table>
<thead>
<tr>
<th>Vantaggio</th>
<th>Descrizione</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Non Invasivo</strong></td>
<td>Non modifichi mai i file core di WordPress</td>
</tr>
<tr>
<td><strong>Aggiornamenti Sicuri</strong></td>
<td>Puoi aggiornare WordPress senza perdere le tue modifiche</td>
</tr>
<tr>
<td><strong>Modulare</strong></td>
<td>Ogni funzionalità è isolata e indipendente</td>
</tr>
<tr>
<td><strong>Estensibile</strong></td>
<td>Altri sviluppatori possono estendere il tuo lavoro</td>
</tr>
</tbody>
</table>
<h3>I Due Tipi di Hook</h3>
<pre><code class="language-php">// 1. ACTIONS - Eseguono codice in un momento specifico
do_action(&#039;nome_hook&#039;, $param1, $param2);
add_action(&#039;nome_hook&#039;, &#039;tua_funzione&#039;, $priority, $accepted_args);

// 2. FILTERS - Modificano e restituiscono dati
apply_filters(&#039;nome_hook&#039;, $value, $param1);
add_filter(&#039;nome_hook&#039;, &#039;tua_funzione&#039;, $priority, $accepted_args);</code></pre>
<hr />
<h2>⚡ Actions vs Filters: La Differenza Chiave</h2>
<h3>Actions (Azioni)</h3>
<p><strong>Cosa fanno:</strong> Eseguono codice quando succede qualcosa.</p>
<p><strong>Quando usarle:</strong></p>
<ul>
<li>Inviare email</li>
<li>Scrivere nel database</li>
<li>Inviare notifiche</li>
<li>Caricare script e stili</li>
<li>Registrare custom post type</li>
</ul>
<p><strong>Esempio:</strong></p>
<pre><code class="language-php">// Esegue una funzione quando un post viene pubblicato
add_action(&#039;publish_post&#039;, &#039;invia_notifica_social&#039;, 10, 2);

function invia_notifica_social($ID, $post) {
    // Codice per inviare notifica ai social
    error_log(&#039;Post pubblicato: &#039; . $post-&gt;post_title);
}</code></pre>
<h3>Filters (Filtri)</h3>
<p><strong>Cosa fanno:</strong> Modificano dati e restituiscono il valore modificato.</p>
<p><strong>Quando usarli:</strong></p>
<ul>
<li>Modificare contenuti prima del display</li>
<li>Cambiare titoli dinamicamente</li>
<li>Alterare query del database</li>
<li>Personalizzare excerpt</li>
</ul>
<p><strong>Esempio:</strong></p>
<pre><code class="language-php">// Aggiunge testo alla fine di ogni contenuto
add_filter(&#039;the_content&#039;, &#039;aggiungi_firma_articolo&#039;);

function aggiungi_firma_articolo($content) {
    if (is_single()) {
        $content .= &#039;&lt;p class=&quot;firma&quot;&gt;📝 Articolo scritto da Mario Rossi&lt;/p&gt;&#039;;
    }
    return $content; // ⚠️ IMPORTANTE: devi restituire il valore!
}</code></pre>
<h3>Tabella Comparativa</h3>
<table>
<thead>
<tr>
<th>Caratteristica</th>
<th>Actions</th>
<th>Filters</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Scopo</strong></td>
<td>Eseguire azioni</td>
<td>Modificare dati</td>
</tr>
<tr>
<td><strong>Return</strong></td>
<td>Non necessario</td>
<td><strong>OBBLIGATORIO</strong></td>
</tr>
<tr>
<td><strong>Funzione</strong></td>
<td><code>do_action()</code></td>
<td><code>apply_filters()</code></td>
</tr>
<tr>
<td><strong>Registrazione</strong></td>
<td><code>add_action()</code></td>
<td><code>add_filter()</code></td>
</tr>
<tr>
<td><strong>Esempio</strong></td>
<td>Invio email</td>
<td>Modifica titolo</td>
</tr>
</tbody>
</table>
<hr />
<h2>🔥 30+ Esempi Pratici di Hook Essenziali</h2>
<h3>📌 Hook per Plugin Development</h3>
<h4>1. Inizializzazione Plugin</h4>
<pre><code class="language-php">// Eseguito dopo che WordPress è caricato
add_action(&#039;init&#039;, &#039;mio_plugin_init&#039;);

function mio_plugin_init() {
    // Carica traduzioni
    load_plugin_textdomain(&#039;mio-plugin&#039;, false, dirname(plugin_basename(__FILE__)) . &#039;/languages&#039;);

    // Registra custom post type
    register_post_type(&#039;progetto&#039;, array(
        &#039;public&#039; =&gt; true,
        &#039;label&#039; =&gt; &#039;Progetti&#039;
    ));
}</code></pre>
<h4>2. Attivazione Plugin</h4>
<pre><code class="language-php">// Eseguito quando il plugin viene attivato
register_activation_hook(__FILE__, &#039;mio_plugin_attiva&#039;);

function mio_plugin_attiva() {
    // Crea tabelle database
    global $wpdb;
    $table_name = $wpdb-&gt;prefix . &#039;mio_plugin_dati&#039;;

    $charset_collate = $wpdb-&gt;get_charset_collate();

    $sql = &quot;CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        data datetime DEFAULT &#039;0000-00-00 00:00:00&#039; NOT NULL,
        PRIMARY KEY  (id)
    ) $charset_collate;&quot;;

    require_once(ABSPATH . &#039;wp-admin/includes/upgrade.php&#039;);
    dbDelta($sql);

    // Imposta opzioni default
    add_option(&#039;mio_plugin_version&#039;, &#039;1.0.0&#039;);
}</code></pre>
<h4>3. Disattivazione Plugin</h4>
<pre><code class="language-php">// Eseguito quando il plugin viene disattivato
register_deactivation_hook(__FILE__, &#039;mio_plugin_disattiva&#039;);

function mio_plugin_disattiva() {
    // Pulisci cron jobs
    wp_clear_scheduled_hook(&#039;mio_plugin_evento_giornaliero&#039;);

    // NON cancellare i dati! Lascia all&#039;utente la scelta
}</code></pre>
<h4>4. Aggiunta Menu Admin</h4>
<pre><code class="language-php">add_action(&#039;admin_menu&#039;, &#039;mio_plugin_menu_admin&#039;);

function mio_plugin_menu_admin() {
    add_menu_page(
        &#039;Mio Plugin&#039;,           // Titolo pagina
        &#039;Mio Plugin&#039;,           // Titolo menu
        &#039;manage_options&#039;,       // Capacità richiesta
        &#039;mio-plugin&#039;,           // Slug
        &#039;mio_plugin_pagina&#039;,    // Funzione callback
        &#039;dashicons-admin-settings&#039;, // Icona
        30                      // Posizione
    );
}</code></pre>
<h4>5. Caricamento Script e Stili</h4>
<pre><code class="language-php">add_action(&#039;wp_enqueue_scripts&#039;, &#039;mio_plugin_carica_risorse&#039;);

function mio_plugin_carica_risorse() {
    // Carica CSS
    wp_enqueue_style(
        &#039;mio-plugin-style&#039;,
        plugin_dir_url(__FILE__) . &#039;css/style.css&#039;,
        array(),
        &#039;1.0.0&#039;
    );

    // Carica JavaScript
    wp_enqueue_script(
        &#039;mio-plugin-script&#039;,
        plugin_dir_url(__FILE__) . &#039;js/script.js&#039;,
        array(&#039;jquery&#039;),
        &#039;1.0.0&#039;,
        true // Carica nel footer
    );

    // Passa dati a JavaScript
    wp_localize_script(&#039;mio-plugin-script&#039;, &#039;mioPluginData&#039;, array(
        &#039;ajaxUrl&#039; =&gt; admin_url(&#039;admin-ajax.php&#039;),
        &#039;nonce&#039; =&gt; wp_create_nonce(&#039;mio_plugin_nonce&#039;)
    ));
}</code></pre>
<hr />
<h3>📌 Hook per Modificare Contenuti</h3>
<h4>6. Modifica Titolo Post</h4>
<pre><code class="language-php">add_filter(&#039;the_title&#039;, &#039;mio_prefix_titolo&#039;, 10, 2);

function mio_prefix_titolo($title, $post_id) {
    if (is_single() &amp;&amp; !is_admin()) {
        $title = &#039;🔥 &#039; . $title;
    }
    return $title;
}</code></pre>
<h4>7. Aggiungi Contenuto Dopo il Post</h4>
<pre><code class="language-php">add_filter(&#039;the_content&#039;, &#039;aggiungi_contenuto_dopo_post&#039;);

function aggiungi_contenuto_dopo_post($content) {
    if (is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query()) {
        $content .= &#039;
        &lt;div class=&quot;post-footer&quot;&gt;
            &lt;p&gt;📧 Iscriviti alla newsletter per altri articoli come questo!&lt;/p&gt;
            [newsletter-form]
        &lt;/div&gt;&#039;;
    }
    return $content;
}</code></pre>
<h4>8. Modifica Excerpt</h4>
<pre><code class="language-php">add_filter(&#039;excerpt_length&#039;, &#039;mio_excerpt_lunghezza&#039;);

function mio_excerpt_lunghezza($length) {
    return 30; // Default è 55
}

add_filter(&#039;excerpt_more&#039;, &#039;mio_excerpt_piu&#039;);

function mio_excerpt_piu($more) {
    return &#039;... &lt;a href=&quot;&#039; . get_permalink() . &#039;&quot;&gt;Leggi tutto →&lt;/a&gt;&#039;;
}</code></pre>
<h4>9. Personalizza URL Autore</h4>
<pre><code class="language-php">add_filter(&#039;author_link&#039;, &#039;mio_custom_author_link&#039;, 10, 3);

function mio_custom_author_link($link, $author_id, $author_nicename) {
    return home_url(&#039;/team/&#039; . $author_nicename . &#039;/&#039;);
}</code></pre>
<h4>10. Filtra Query Principale</h4>
<pre><code class="language-php">add_action(&#039;pre_get_posts&#039;, &#039;mio_filtra_query_homepage&#039;);

function mio_filtra_query_homepage($query) {
    if ($query-&gt;is_main_query() &amp;&amp; $query-&gt;is_home()) {
        $query-&gt;set(&#039;posts_per_page&#039;, 10);
        $query-&gt;set(&#039;orderby&#039;, &#039;date&#039;);
        $query-&gt;set(&#039;order&#039;, &#039;DESC&#039;);
    }
}</code></pre>
<hr />
<h3>📌 Hook per WooCommerce</h3>
<h4>11. Modifica Prezzo Prodotto</h4>
<pre><code class="language-php">add_filter(&#039;woocommerce_product_get_price&#039;, &#039;mio_modifica_prezzo&#039;, 10, 2);

function mio_modifica_prezzo($price, $product) {
    // Applica sconto del 10% ai prodotti sopra 100€
    if ($price &gt; 100) {
        $price = $price * 0.9;
    }
    return $price;
}</code></pre>
<h4>12. Aggiungi Campo Checkout</h4>
<pre><code class="language-php">add_action(&#039;woocommerce_after_order_notes&#039;, &#039;mio_campo_checkout&#039;);

function mio_campo_checkout($checkout) {
    echo &#039;&lt;div id=&quot;mio_campo_extra&quot;&gt;&#039;;

    woocommerce_form_field(&#039;codice_fiscale&#039;, array(
        &#039;type&#039; =&gt; &#039;text&#039;,
        &#039;class&#039; =&gt; array(&#039;form-row-wide&#039;),
        &#039;label&#039; =&gt; __(&#039;Codice Fiscale&#039;),
        &#039;placeholder&#039; =&gt; __(&#039;Inserisci il tuo CF&#039;),
        &#039;required&#039; =&gt; true,
    ), $checkout-&gt;get_value(&#039;codice_fiscale&#039;));

    echo &#039;&lt;/div&gt;&#039;;
}</code></pre>
<h4>13. Email Personalizzata Ordine</h4>
<pre><code class="language-php">add_filter(&#039;woocommerce_email_subject_customer_completed_order&#039;, &#039;mio_oggetto_email&#039;, 10, 2);

function mio_oggetto_email($subject, $order) {
    return &#039;🎉 Il tuo ordine #&#039; . $order-&gt;get_id() . &#039; è stato completato!&#039;;
}</code></pre>
<h4>14. Azione Dopo Acquisto</h4>
<pre><code class="language-php">add_action(&#039;woocommerce_checkout_order_processed&#039;, &#039;mio_dopo_acquisto&#039;, 10, 3);

function mio_dopo_acquisto($order_id, $posted_data, $order) {
    // Invia notifica Slack
    // Aggiorna CRM
    // Invia SMS
    error_log(&#039;Ordine processato: &#039; . $order_id);
}</code></pre>
<hr />
<h3>📌 Hook per Sicurezza</h3>
<h4>15. Sanitizzazione Input</h4>
<pre><code class="language-php">// MAI fidarsi degli input utente!
add_action(&#039;admin_post_mio_form&#039;, &#039;mio_elabora_form&#039;);

function mio_elabora_form() {
    // Verifica nonce
    check_admin_referer(&#039;mio_form_action&#039;, &#039;mio_nonce&#039;);

    // Sanitizza input
    $nome = sanitize_text_field($_POST[&#039;nome&#039;]);
    $email = sanitize_email($_POST[&#039;email&#039;]);
    $url = esc_url_raw($_POST[&#039;website&#039;]);

    // Salva dati
    // ...
}</code></pre>
<h4>16. Escape Output</h4>
<pre><code class="language-php">// SEMPRE fare escape dell&#039;output!
function mio_display_dati() {
    echo &#039;&lt;h2&gt;&#039; . esc_html($titolo) . &#039;&lt;/h2&gt;&#039;;
    echo &#039;&lt;a href=&quot;&#039; . esc_url($url) . &#039;&quot;&gt;Link&lt;/a&gt;&#039;;
    echo &#039;&lt;div&gt;&#039; . esc_attr($attributo) . &#039;&lt;/div&gt;&#039;;
}</code></pre>
<h4>17. Verifica Permessi</h4>
<pre><code class="language-php">add_action(&#039;admin_init&#039;, &#039;mio_verifica_permessi&#039;);

function mio_verifica_permessi() {
    if (!current_user_can(&#039;manage_options&#039;)) {
        wp_die(&#039;Non hai i permessi per accedere a questa pagina.&#039;);
    }
}</code></pre>
<hr />
<h3>📌 Hook per Performance</h3>
<h4>18. Disabilita Emoji (Risparmio Query)</h4>
<pre><code class="language-php">remove_action(&#039;wp_head&#039;, &#039;print_emoji_detection_script&#039;, 7);
remove_action(&#039;admin_print_scripts&#039;, &#039;print_emoji_detection_script&#039;);
remove_action(&#039;wp_print_styles&#039;, &#039;print_emoji_styles&#039;);
remove_action(&#039;admin_print_styles&#039;, &#039;print_emoji_styles&#039;);</code></pre>
<h4>19. Disabilita Embed OEmbed</h4>
<pre><code class="language-php">add_action(&#039;init&#039;, &#039;mio_disabilita_embed&#039;, 1);

function mio_disabilita_embed() {
    remove_action(&#039;rest_api_init&#039;, &#039;wp_oembed_register_route&#039;);
    remove_filter(&#039;rest_pre_serve_request&#039;, &#039;wp_oembed_send_header&#039;);
    remove_action(&#039;wp_head&#039;, &#039;wp_oembed_add_discovery_links&#039;);
    remove_action(&#039;wp_head&#039;, &#039;wp_oembed_add_host_js&#039;);
}</code></pre>
<h4>20. Limit Heartbeat API</h4>
<pre><code class="language-php">add_filter(&#039;heartbeat_settings&#039;, &#039;mio_limit_heartbeat&#039;);

function mio_limit_heartbeat($settings) {
    $settings[&#039;interval&#039;] = 60; // Default è 15 secondi
    return $settings;
}</code></pre>
<hr />
<h3>📌 Hook per SEO</h3>
<h4>21. Aggiungi Meta Tag</h4>
<pre><code class="language-php">add_action(&#039;wp_head&#039;, &#039;mio_meta_tag_custom&#039;);

function mio_meta_tag_custom() {
    if (is_single()) {
        echo &#039;&lt;meta name=&quot;author&quot; content=&quot;Mario Rossi&quot; /&gt;&#039;;
        echo &#039;&lt;meta property=&quot;article:published_time&quot; content=&quot;&#039; . get_the_date(&#039;c&#039;) . &#039;&quot; /&gt;&#039;;
    }
}</code></pre>
<h4>22. Modifica Title Tag</h4>
<pre><code class="language-php">add_filter(&#039;document_title_parts&#039;, &#039;mio_custom_title&#039;);

function mio_custom_title($title) {
    if (is_home()) {
        $title[&#039;title&#039;] = &#039;Blog - &#039; . get_bloginfo(&#039;name&#039;);
    }
    return $title;
}</code></pre>
<h4>23. Aggiungi Schema.org</h4>
<pre><code class="language-php">add_action(&#039;wp_head&#039;, &#039;mio_schema_org&#039;);

function mio_schema_org() {
    if (is_single()) {
        ?&gt;
        &lt;script type=&quot;application/ld+json&quot;&gt;
        {
            &quot;@context&quot;: &quot;https://schema.org&quot;,
            &quot;@type&quot;: &quot;Article&quot;,
            &quot;headline&quot;: &quot;&lt;?php echo esc_js(get_the_title()); ?&gt;&quot;,
            &quot;author&quot;: {
                &quot;@type&quot;: &quot;Person&quot;,
                &quot;name&quot;: &quot;&lt;?php echo esc_js(get_the_author()); ?&gt;&quot;
            }
        }
        &lt;/script&gt;
        &lt;?php
    }
}</code></pre>
<hr />
<h3>📌 Hook per Custom Post Type</h3>
<h4>24. Registra Custom Post Type</h4>
<pre><code class="language-php">add_action(&#039;init&#039;, &#039;mio_registra_cpt_progetto&#039;);

function mio_registra_cpt_progetto() {
    $labels = array(
        &#039;name&#039; =&gt; &#039;Progetti&#039;,
        &#039;singular_name&#039; =&gt; &#039;Progetto&#039;,
        &#039;add_new&#039; =&gt; &#039;Aggiungi Nuovo&#039;,
        &#039;add_new_item&#039; =&gt; &#039;Aggiungi Nuovo Progetto&#039;,
        &#039;edit_item&#039; =&gt; &#039;Modifica Progetto&#039;,
        &#039;new_item&#039; =&gt; &#039;Nuovo Progetto&#039;,
        &#039;view_item&#039; =&gt; &#039;Vedi Progetto&#039;,
        &#039;search_items&#039; =&gt; &#039;Cerca Progetti&#039;,
        &#039;not_found&#039; =&gt; &#039;Nessun progetto trovato&#039;,
        &#039;menu_name&#039; =&gt; &#039;Progetti&#039;
    );

    $args = array(
        &#039;labels&#039; =&gt; $labels,
        &#039;public&#039; =&gt; true,
        &#039;has_archive&#039; =&gt; true,
        &#039;show_in_rest&#039; =&gt; true, // Abilita Gutenberg
        &#039;supports&#039; =&gt; array(&#039;title&#039;, &#039;editor&#039;, &#039;thumbnail&#039;, &#039;excerpt&#039;),
        &#039;menu_icon&#039; =&gt; &#039;dashicons-portfolio&#039;,
        &#039;rewrite&#039; =&gt; array(&#039;slug&#039; =&gt; &#039;progetti&#039;)
    );

    register_post_type(&#039;progetto&#039;, $args);
}</code></pre>
<h4>25. Registra Tassonomia Custom</h4>
<pre><code class="language-php">add_action(&#039;init&#039;, &#039;mio_registra_tassonomia_cliente&#039;, 0);

function mio_registra_tassonomia_cliente() {
    $labels = array(
        &#039;name&#039; =&gt; &#039;Clienti&#039;,
        &#039;singular_name&#039; =&gt; &#039;Cliente&#039;,
        &#039;search_items&#039; =&gt; &#039;Cerca Clienti&#039;,
        &#039;all_items&#039; =&gt; &#039;Tutti i Clienti&#039;,
        &#039;edit_item&#039; =&gt; &#039;Modifica Cliente&#039;,
        &#039;add_new_item&#039; =&gt; &#039;Aggiungi Nuovo Cliente&#039;,
        &#039;menu_name&#039; =&gt; &#039;Clienti&#039;
    );

    $args = array(
        &#039;labels&#039; =&gt; $labels,
        &#039;public&#039; =&gt; true,
        &#039;hierarchical&#039; =&gt; false,
        &#039;show_in_rest&#039; =&gt; true,
        &#039;rewrite&#039; =&gt; array(&#039;slug&#039; =&gt; &#039;cliente&#039;)
    );

    register_taxonomy(&#039;cliente&#039;, &#039;progetto&#039;, $args);
}</code></pre>
<h4>26. Meta Box per CPT</h4>
<pre><code class="language-php">add_action(&#039;add_meta_boxes&#039;, &#039;mio_aggiungi_meta_box&#039;);

function mio_aggiungi_meta_box() {
    add_meta_box(
        &#039;mio_meta_box&#039;,
        &#039;Dettagli Progetto&#039;,
        &#039;mio_meta_box_callback&#039;,
        &#039;progetto&#039;,
        &#039;normal&#039;,
        &#039;high&#039;
    );
}

function mio_meta_box_callback($post) {
    wp_nonce_field(&#039;mio_meta_box_action&#039;, &#039;mio_meta_box_nonce&#039;);

    $valore = get_post_meta($post-&gt;ID, &#039;_mio_metakey&#039;, true);

    echo &#039;&lt;label for=&quot;mio_field&quot;&gt;Budget:&lt;/label&gt;&#039;;
    echo &#039;&lt;input type=&quot;text&quot; id=&quot;mio_field&quot; name=&quot;mio_field&quot; value=&quot;&#039; . esc_attr($valore) . &#039;&quot; style=&quot;width:100%&quot; /&gt;&#039;;
}</code></pre>
<h4>27. Salva Meta Box</h4>
<pre><code class="language-php">add_action(&#039;save_post_progetto&#039;, &#039;mio_salva_meta_box&#039;, 10, 2);

function mio_salva_meta_box($post_id, $post) {
    // Verifica nonce
    if (!isset($_POST[&#039;mio_meta_box_nonce&#039;]) || 
        !wp_verify_nonce($_POST[&#039;mio_meta_box_nonce&#039;], &#039;mio_meta_box_action&#039;)) {
        return;
    }

    // Verifica autosave
    if (defined(&#039;DOING_AUTOSAVE&#039;) &amp;&amp; DOING_AUTOSAVE) {
        return;
    }

    // Verifica permessi
    if (!current_user_can(&#039;edit_post&#039;, $post_id)) {
        return;
    }

    // Salva dato
    if (isset($_POST[&#039;mio_field&#039;])) {
        update_post_meta($post_id, &#039;_mio_metakey&#039;, sanitize_text_field($_POST[&#039;mio_field&#039;]));
    }
}</code></pre>
<hr />
<h3>📌 Hook per Utility</h3>
<h4>28. Redirect Dopo Login</h4>
<pre><code class="language-php">add_filter(&#039;login_redirect&#039;, &#039;mio_redirect_login&#039;, 10, 3);

function mio_redirect_login($redirect_to, $request, $user) {
    if (isset($user-&gt;roles) &amp;&amp; is_array($user-&gt;roles)) {
        if (in_array(&#039;administrator&#039;, $user-&gt;roles)) {
            return admin_url();
        } else {
            return home_url(&#039;/dashboard/&#039;);
        }
    }
    return $redirect_to;
}</code></pre>
<h4>29. Nascondi Barra Admin</h4>
<pre><code class="language-php">add_filter(&#039;show_admin_bar&#039;, &#039;__return_false&#039;);</code></pre>
<h4>30. Cambia Logo Login</h4>
<pre><code class="language-php">add_action(&#039;login_enqueue_scripts&#039;, &#039;mio_logo_login&#039;);

function mio_logo_login() {
    echo &#039;&lt;style&gt;
        .login h1 a {
            background-image: url(&#039; . get_stylesheet_directory_uri() . &#039;/images/logo-login.png);
            width: 300px;
            height: 100px;
            background-size: contain;
        }
    &lt;/style&gt;&#039;;
}</code></pre>
<h4>31. Footer Personalizzato Admin</h4>
<pre><code class="language-php">add_filter(&#039;admin_footer_text&#039;, &#039;mio_footer_admin&#039;);

function mio_footer_admin($text) {
    return &#039;Sviluppato con ❤️ da &lt;a href=&quot;https://mrtux.it&quot; target=&quot;_blank&quot;&gt;MrTux&lt;/a&gt;&#039;;
}</code></pre>
<h4>32. Cron Job Personalizzato</h4>
<pre><code class="language-php">// Registra evento cron all&#039;attivazione plugin
register_activation_hook(__FILE__, &#039;mio_attiva_cron&#039;);

function mio_attiva_cron() {
    if (!wp_next_scheduled(&#039;mio_evento_giornaliero&#039;)) {
        wp_schedule_event(time(), &#039;daily&#039;, &#039;mio_evento_giornaliero&#039;);
    }
}

// Esegui azione
add_action(&#039;mio_evento_giornaliero&#039;, &#039;mio_esegui_task&#039;);

function mio_esegui_task() {
    // Invia report email
    // Pulisci database
    // Aggiorna cache
    error_log(&#039;Task giornaliero eseguito&#039;);
}

// Rimuovi cron alla disattivazione
register_deactivation_hook(__FILE__, &#039;mio_disattiva_cron&#039;);

function mio_disattiva_cron() {
    wp_clear_scheduled_hook(&#039;mio_evento_giornaliero&#039;);
}</code></pre>
<hr />
<h2>🎯 Best Practice per Hook Professionali</h2>
<h3>1. Usa Priority Correttamente</h3>
<pre><code class="language-php">// ❌ SBAGLIATO: Priority default (10) potrebbe confliggere
add_action(&#039;init&#039;, &#039;mia_funzione&#039;);

// ✅ CORRETTO: Specifica priority esplicita
add_action(&#039;init&#039;, &#039;mia_funzione&#039;, 20);  // Dopo i default
add_action(&#039;init&#039;, &#039;mia_funzione&#039;, 5);   // Prima dei default</code></pre>
<h3>2. Accetta Tutti gli Argomenti</h3>
<pre><code class="language-php">// ❌ SBAGLIATO: Perdi dati
add_action(&#039;publish_post&#039;, &#039;mia_funzione&#039;);
function mia_funzione($ID) {
    // ...
}

// ✅ CORRETTO: Accetta tutti gli argomenti
add_action(&#039;publish_post&#039;, &#039;mia_funzione&#039;, 10, 2);
function mia_funzione($ID, $post) {
    // Ora hai accesso a $post completo
}</code></pre>
<h3>3. Namespacing per Evitare Conflitti</h3>
<pre><code class="language-php">// ❌ SBAGLIATO: Nomi generici
add_action(&#039;init&#039;, &#039;init_function&#039;);

// ✅ CORRETTO: Prefix unico
add_action(&#039;init&#039;, &#039;mio_plugin_init_function&#039;);

// ✅ OTTIMO: Namespace PHP
namespace MioPlugin;

add_action(&#039;init&#039;, __NAMESPACE__ . &#039;\init_function&#039;);</code></pre>
<h3>4. Documenta i Tuoi Hook</h3>
<pre><code class="language-php">/**
 * Hook personalizzato per dopo la pubblicazione
 *
 * @since 1.0.0
 * @param int $post_id ID del post pubblicato
 * @param WP_Post $post Oggetto post completo
 */
do_action(&#039;mio_plugin_dopo_pubblicazione&#039;, $post_id, $post);</code></pre>
<h3>5. Usa Hook Removibili</h3>
<pre><code class="language-php">// ✅ Permetti ad altri di rimuovere il tuo hook
add_action(&#039;wp_head&#039;, &#039;mio_funzione_removibile&#039;);

// Altri sviluppatori possono fare:
remove_action(&#039;wp_head&#039;, &#039;mio_funzione_removibile&#039;);</code></pre>
<hr />
<h2>📋 Checklist Sviluppo Plugin con Hook</h2>
<h3>Prima di Pubblicare</h3>
<ul>
<li>[ ] Tutti gli hook hanno prefix unico?</li>
<li>[ ] Le funzioni restituiscono valori (per i filter)?</li>
<li>[ ] Gli input sono sanitizzati?</li>
<li>[ ] L'output è escaped?</li>
<li>[ ] I nonce sono verificati?</li>
<li>[ ] I permessi sono controllati?</li>
<li>[ ] Gli hook di attivazione/disattivazione sono presenti?</li>
<li>[ ] I cron job sono puliti alla disattivazione?</li>
</ul>
<h3>Performance</h3>
<ul>
<li>[ ] Gli hook sono registrati solo quando necessario?</li>
<li>[ ] Le query database sono minimizzate?</li>
<li>[ ] Gli script sono caricati solo nelle pagine necessarie?</li>
<li>[ ] La cache è utilizzata appropriatamente?</li>
</ul>
<hr />
<h2>🐛 Troubleshooting Comune</h2>
<h3>Hook Non Funziona</h3>
<p><strong>Problema:</strong> Il tuo hook non viene eseguito.</p>
<p><strong>Soluzioni:</strong></p>
<ol>
<li>Verifica che l'hook esista: <code>do_action_deprecated()</code> nei log</li>
<li>Controlla la priority: potrebbe essere eseguito troppo tardi</li>
<li>Verifica i permessi: <code>current_user_can()</code></li>
<li>Controlla condizioni: <code>is_admin()</code>, <code>is_single()</code>, etc.</li>
</ol>
<h3>Filter Non Modifica Nulla</h3>
<p><strong>Problema:</strong> Il filter non altera il valore.</p>
<p><strong>Soluzioni:</strong></p>
<ol>
<li><strong>Assicurati di RETURN:</strong> <code>return $value;</code></li>
<li>Verifica la priority: altri filter potrebbero sovrascrivere</li>
<li>Controlla il tipo di dato restituito</li>
</ol>
<h3>Conflitti tra Plugin</h3>
<p><strong>Problema:</strong> Due plugin usano lo stesso hook name.</p>
<p><strong>Soluzioni:</strong></p>
<ol>
<li>Usa prefix unici nei nomi delle funzioni</li>
<li>Specifica priority diverse</li>
<li>Usa namespace PHP</li>
</ol>
<hr />
<h2>📚 Risorse Utili</h2>
<h3>Documentazione Ufficiale</h3>
<ul>
<li><a href="https://developer.wordpress.org/plugins/plugin-basics/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WordPress Plugin API</a></li>
<li><a href="https://developer.wordpress.org/reference/hooks/#actions" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Action Reference</a></li>
<li><a href="https://developer.wordpress.org/reference/hooks/#filters" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Filter Reference</a></li>
</ul>
<h3>Strumenti di Debug</h3>
<pre><code class="language-php">// Lista tutti gli hook registrati
global $wp_filter;
print_r(array_keys($wp_filter));

// Vedi chi è agganciato a un hook
print_r($wp_filter[&#039;init&#039;]);

// Debug hook execution
add_action(&#039;all&#039;, function($hook) {
    error_log(&#039;Hook eseguito: &#039; . $hook);
});</code></pre>
<h3>Plugin Utili</h3>
<ul>
<li><strong>Query Monitor:</strong> Debug hook e query</li>
<li><strong>Hook Sniffer:</strong> Vedi tutti gli hook eseguiti</li>
<li><strong>What The File:</strong> Vedi quale template è caricato</li>
</ul>
<hr />
<h2>🎓 Conclusione</h2>
<p>Gli hook WordPress sono uno strumento potente che separa i developer principianti da quelli professionisti. Padroneggiandoli, potrai:</p>
<p>✅ Creare plugin modulari e mantenibili<br />
✅ Personalizzare WordPress senza modificare il core<br />
✅ Integrarti con qualsiasi tema o plugin<br />
✅ Costruire soluzioni scalabili e sicure</p>
<p><strong>Prossimi Passi:</strong></p>
<ol>
<li>Sperimenta con gli esempi in questa guida</li>
<li>Crea un plugin di test per praticare</li>
<li>Esplora il <a href="https://developer.wordpress.org/reference/hooks/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WordPress Hook Reference</a></li>
<li>Contribuisci alla community con i tuoi hook</li>
</ol>
<hr />
<h2>💬 Hai Domande?</h2>
<p>Lascia un commento o contattaci per consulenza sullo sviluppo di plugin WordPress professionali!</p>
<p><strong>📧 Newsletter:</strong> Iscriviti per ricevere altri tutorial come questo!</p>
<hr />
<p><em>Ultimo aggiornamento: Marzo 2026</em><br />
<em>Tempo di lettura: 20 minuti</em><br />
<em>Parole: 2.500+</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mrtux.it/hook-wordpress-azioni-e-filter-per-plugin-professionali/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
