{"id":1936,"date":"2026-04-30T15:11:00","date_gmt":"2026-04-30T15:11:00","guid":{"rendered":"https:\/\/studioimmens.com\/personalizzare-functions-php-di-wordpress\/"},"modified":"2026-07-16T17:05:22","modified_gmt":"2026-07-16T15:05:22","slug":"personalizzare-functions-php-di-wordpress","status":"publish","type":"post","link":"https:\/\/studioimmens.com\/en\/personalizzare-functions-php-di-wordpress\/","title":{"rendered":"Personalizzare functions.php di WordPress"},"content":{"rendered":"<h2>Cos&#8217;\u00e8 functions.php e come funziona<\/h2>\n<p>Il file functions.php \u00e8 il cuore della personalizzazione di un tema WordPress. Agisce come un plugin integrato nel tema, eseguendo codice PHP per modificare, estendere o aggiungere funzionalit\u00e0 al sito. WordPress carica automaticamente questo file a ogni pagina visitata, sia nel frontend che nel backend, rendendolo il punto di ingresso ideale per qualsiasi modifica programmatica.<\/p>\n<p>Ogni tema WordPress (sia gratuito che premium) ha il proprio functions.php. Le modifiche vanno sempre fatte nel tema child, mai nel tema parent. Se modifichi direttamente il tema parent, perderai tutte le personalizzazioni al primo aggiornamento del tema.<\/p>\n<h2>Functions.php nel tema vs child theme<\/h2>\n<p>Un tema child eredita tutte le funzionalit\u00e0 del tema parent ma permette di sovrascriverle senza modificare i file originali. Il functions.php del child theme viene caricato PRIMA di quello del parent, consentendo di: aggiungere nuove funzioni, sovrascrivere funzioni del parent (se dichiarate con if\/function_exists), e mantenere le personalizzazioni dopo gli aggiornamenti del tema parent. La struttura minima di un tema child richiede: style.css (con Template: nome-tema-parent) e functions.php (con wp_enqueue_scripts per il CSS parent).<\/p>\n<h2>Aggiungere snippet PHP personalizzati<\/h2>\n<h3>Enqueue di script e stili<\/h3>\n<p>Per caricare CSS e JavaScript nel tema, usa wp_enqueue_style() e wp_enqueue_script() all&#8217;interno della funzione wp_enqueue_scripts. Non usare link diretti nell&#8217;header.php: WordPress ha un sistema di code injection e dipendenze che evita conflitti e duplicati.<\/p>\n<p>function mio_tema_risorse() {<br \/>\nwp_enqueue_style(&#8216;mio-tema-style&#8217;, get_stylesheet_uri());<br \/>\nwp_enqueue_script(&#8216;mio-tema-script&#8217;, get_template_directory_uri() . &#8216;\/js\/custom.js&#8217;, array(&#8216;jquery&#8217;), null, true);<br \/>\n}<br \/>\nadd_action(&#8216;wp_enqueue_scripts&#8217;, &#8216;mio_tema_risorse&#8217;);<\/p>\n<h3>Registrare menu di navigazione<\/h3>\n<p>register_nav_menus() permette di definire posizioni menu personalizzate che appariranno in Aspetto &gt; Menu. Ogni posizione pu\u00f2 essere chiamata nel template con wp_nav_menu().<\/p>\n<h3>Aggiungere theme support<\/h3>\n<p>add_theme_support() attiva funzionalit\u00e0 WordPress nel tema. Le pi\u00f9 comuni: post-thumbnails (immagine in evidenza), custom-logo (logo personalizzabile), html5 (markup HTML5), title-tag (titolo SEO dinamico), responsive-embeds e align-wide (larghezza blocco estesa in Gutenberg).<\/p>\n<h3>Creare shortcode personalizzati<\/h3>\n<p>Gli shortcode permettono di inserire contenuti dinamici in post e pagine. La funzione add_shortcode() registra un nuovo shortcode che pu\u00f2 accettare attributi e restituire HTML processato.<\/p>\n<p>function shortcode_CTA($atts) {<br \/>\n$atts = shortcode_atts(array(&#8216;testo&#8217; =&gt; &#8216;Scopri di pi\u00f9&#8217;, &#8216;url&#8217; =&gt; &#8216;#&#8217;), $atts);<br \/>\nreturn &#8216;<a href=\"&apos; . esc_url($atts[&apos;url&apos;]) . &apos;\" class=\"btn-cta\">&#8216; . esc_html($atts[&#8216;testo&#8217;]) . &#8216;<\/a>&#8216;;<br \/>\n}<br \/>\nadd_shortcode(&#8216;cta&#8217;, &#8216;shortcode_CTA&#8217;);<\/p>\n<p>Nel contenuto: [cta testo=&#8221;Acquista ora&#8221; url=&#8221;https:\/\/esempio.com\/acquista&#8221;]<\/p>\n<h3>Personalizzare il Customizer<\/h3>\n<p>$wp_customize-&gt;add_section() e $wp_customize-&gt;add_setting()\/add_control() aggiungono opzioni al Personalizzatore di WordPress. Questo permette ai clienti di modificare colori, font, layout e altre impostazioni senza toccare codice.<\/p>\n<h2>Best practice per functions.php<\/h2>\n<h3>Usare sempre un tema child<\/h3>\n<p>Qualsiasi modifica al functions.php va fatta esclusivamente nel tema child. In caso di aggiornamento del tema parent, tutte le personalizzazioni nel tema child rimangono intatte.<\/p>\n<h3>Verificare l&#8217;esistenza delle funzioni<\/h3>\n<p>Prima di dichiarare una funzione personalizzata, usa function_exists() per evitare errori fatali da ridefinizione. Questo \u00e8 fondamentale quando usi snippet di plugin o temi che potrebbero gi\u00e0 dichiarare la stessa funzione.<\/p>\n<p>if (!function_exists(&#8216;mia_funzione_personalizzata&#8217;)) {<br \/>\nfunction mia_funzione_personalizzata() {<br \/>\n\/\/ codice<br \/>\n}<br \/>\n}<\/p>\n<h3>Usare hook e filtri appropriati<\/h3>\n<p>WordPress offre centinaia di action hook e filter hook. Non modificare mai i file template direttamente; usa invece gli hook per aggiungere o modificare contenuti. Per esempio, per aggiungere HTML dopo il contenuto: add_action(&#8216;the_content&#8217;, &#8216;mia_funzione_dopo_contenuto&#8217;). Per modificare l&#8217;excerpt length: add_filter(&#8216;excerpt_length&#8217;, &#8216;mia_funzione_lunghezza_excerpt&#8217;).<\/p>\n<h3>Organizzare il codice in file separati<\/h3>\n<p>Per functions.php che superano le 200 righe, suddividi le funzionalit\u00e0 in file PHP separati e includili con require_once. Esempio struttura: \/inc\/customizer.php, \/inc\/shortcodes.php, \/inc\/widgets.php. Poi nel functions.php: require_once get_stylesheet_directory() . &#8216;\/inc\/customizer.php&#8217;;<\/p>\n<h2>Considerazioni sulla sicurezza<\/h2>\n<p>Il codice inserito in functions.php ha pieno accesso al sistema WordPress. Errori di sintassi PHP possono bloccare completamente il sito (white screen of death). Usa escaping per output (esc_html, esc_url, esc_attr), validazione per input (sanitize_text_field, intval), e non inserire mai credenziali o chiavi API in chiaro nel file. Per modifiche importanti, usa l&#8217;editor di file di WordPress (Aspetto &gt; Editor file tema) solo se necessario; meglio un client FTP e un editor di codice per avere backup e versioning. In caso di errore fatale, accedi al server via FTP e rinomina il tema per disattivarlo, ripristinando l&#8217;accesso al backend.<\/p>\n<h2>Libreria di snippet essenziali<\/h2>\n<h3>Disabilitare la admin bar nel frontend<\/h3>\n<p>add_filter(&#8216;show_admin_bar&#8217;, &#8216;__return_false&#8217;);<\/p>\n<h3>Personalizzare il logo della pagina di login<\/h3>\n<p>function login_logo_personalizzato() {<br \/>\necho &#8216;&lt;style&gt;.login h1 a { background-image: url(&#8216; . get_stylesheet_directory_uri() . &#8216;\/images\/logo-login.png) !important; }&lt;\/style&gt;&#8217;;<br \/>\n}<br \/>\nadd_action(&#8216;login_head&#8217;, &#8216;login_logo_personalizzato&#8217;);<\/p>\n<h3>Modificare la lunghezza dell&#8217;excerpt<\/h3>\n<p>function excerpt_lunghezza($length) { return 40; }<br \/>\nadd_filter(&#8216;excerpt_length&#8217;, &#8216;excerpt_lunghezza&#8217;);<\/p>\n<h3>Aggiungere classi al body<\/h3>\n<p>function mie_classi_body($classes) {<br \/>\nif (is_singular()) $classes[] = &#8216;pagina-singola&#8217;;<br \/>\nreturn $classes;<br \/>\n}<br \/>\nadd_filter(&#8216;body_class&#8217;, &#8216;mie_classi_body&#8217;);<\/p>\n<h3>Rimuovere la versione di WordPress dal codice sorgente<\/h3>\n<p>remove_action(&#8216;wp_head&#8217;, &#8216;wp_generator&#8217;);<\/p>\n<h3>Disabilitare le notifiche di aggiornamento per i non amministratori<\/h3>\n<p>function nascondi_aggiornamenti_non_admin() {<br \/>\nif (!current_user_can(&#8216;administrator&#8217;)) {<br \/>\nremove_action(&#8216;admin_notices&#8217;, &#8216;update_nag&#8217;);<br \/>\n}<br \/>\n}<br \/>\nadd_action(&#8216;admin_init&#8217;, &#8216;nascondi_aggiornamenti_non_admin&#8217;);<\/p>\n<h2>Conclusione<\/h2>\n<p>Il file functions.php \u00e8 lo strumento pi\u00f9 potente per personalizzare WordPress, ma richiede disciplina: usa sempre un tema child, verifica l&#8217;esistenza delle funzioni con function_exists(), organizza il codice in file separati per progetti complessi, e segui le best practice di sicurezza per evitare errori fatali. Con la giusta metodologia, functions.php ti permette di trasformare qualsiasi tema WordPress in una soluzione su misura per le tue esigenze, senza bisogno di plugin aggiuntivi per funzionalit\u00e0 comuni.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cos&#8217;\u00e8 functions.php e come funziona Il file functions.php \u00e8 il cuore della personalizzazione di un tema WordPress. Agisce come un plugin integrato nel tema, eseguendo codice PHP per modificare, estendere o aggiungere funzionalit\u00e0 al sito. WordPress carica automaticamente questo file a ogni pagina visitata, sia nel frontend che nel backend, rendendolo il punto di ingresso [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2044,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_gspb_post_css":"","ai_primary_source":"Studio Immens Blog","visibility_scope":"both","ai_summary":"Cos'\u00e8 functions.php e come funziona Il file functions.php \u00e8 il cuore della personalizzazione di un tema WordPress. Agisce come un plugin integrato nel tema, eseguendo codice PHP per modificare, estendere o aggiungere funzionalit\u00e0 al sito. WordPress carica automaticamente questo file a ogni pagina...","ai_intent":"informative","ai_related_resources":"","ai_priority":5,"ai_entity_type":"Article","ai_is_based_on":"https:\/\/blog.studioimmens.com\/personalizzare-functions-php-di-wordpress\/","ai_citations":"","ai_mentions":"","ai_speakable_selector":"","ai_chunk_hints":"Personalizzare, functions.php, di, WordPress","footnotes":""},"categories":[133],"tags":[],"ai_visibility":[],"class_list":["post-1936","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/posts\/1936","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/comments?post=1936"}],"version-history":[{"count":1,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/posts\/1936\/revisions"}],"predecessor-version":[{"id":2227,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/posts\/1936\/revisions\/2227"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/media\/2044"}],"wp:attachment":[{"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/media?parent=1936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/categories?post=1936"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/tags?post=1936"},{"taxonomy":"ai_visibility","embeddable":true,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/ai_visibility?post=1936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}