Advanced Custom Fields (ACF) è uno dei plugin più potenti per estendere WordPress senza mettere le mani nel core. Ti permette di aggiungere campi personalizzati a pagine, articoli, Custom Post Type (CPT), tassonomie, utenti, opzioni di tema e perfino ai prodotti WooCommerce, tenendo il codice pulito e facile da mantenere.
In questo articolo vediamo, in modo pratico, come usare ACF in WordPress, come integrarlo con i tuoi Custom Post Type e come sfruttarlo in WooCommerce per aggiungere dati strutturati e logiche su misura, con qualche esempio di codice PHP vero.
Perché usare ACF invece dei meta field “a mano”
WordPress ha già la tabella postmeta e funzioni come get_post_meta(). Il problema è la gestione lato backend: interfaccia scarsa, campi non tipizzati, nessuna validazione, niente repeater, niente relazioni, niente di comodo per l’utente finale.
ACF aggiunge:
- un’interfaccia grafica per creare gruppi di campi senza scrivere codice;
- tipi di campo avanzati: select, repeater, gallery, relationship, true/false, e così via;
- logiche di visualizzazione (condizioni, location rules, ecc.);
- un’API PHP pulita:
get_field(),the_field(),update_field().
Il risultato è un backend che il cliente riesce davvero a usare, dati strutturati e un frontend molto più semplice da sviluppare.
ACF + Custom Post Type: esempio pratico “Schede Prodotto Tecniche”
Facciamo un esempio concreto. Immagina di avere un CPT prodotto_tecnico con dei dati strutturati (codice prodotto, brand, caratteristiche tecniche). Con ACF puoi creare un Field Group associato solo a questo CPT e popolare il template in modo pulito.
1. Creazione del gruppo di campi
Da backend:
- ACF → Gruppi di campi → Aggiungi nuovo;
- Location:
Post Type = prodotto_tecnico; - Campi, ad esempio:
codice_prodotto(Text),brand(Text),caratteristiche_tecniche(WYSIWYG).
2. Uso dei campi nel template del CPT
Nel file template (ad esempio single-prodotto_tecnico.php) leggi i valori con get_field() e li stampi in modo sicuro:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php /** * Template single per Prodotto Tecnico */ get_header(); if ( have_posts() ) : while ( have_posts() ) : the_post(); $codice_prodotto = get_field( 'codice_prodotto' ); $brand = get_field( 'brand' ); $caratteristiche_tecniche = get_field( 'caratteristiche_tecniche' ); ?> <article class="prodotto-tecnico"> <h1><?php the_title(); ?></h1> <ul class="prodotto-tecnico-meta"> <?php if ( $codice_prodotto ) : ?> <li><strong>Codice:</strong> <?php echo esc_html( $codice_prodotto ); ?></li> <?php endif; ?> <?php if ( $brand ) : ?> <li><strong>Brand:</strong> <?php echo esc_html( $brand ); ?></li> <?php endif; ?> </ul> <?php if ( $caratteristiche_tecniche ) : ?> <section class="prodotto-tecnico-caratteristiche"> <h2>Caratteristiche tecniche</h2> <div class="contenuto"> <?php echo wp_kses_post( $caratteristiche_tecniche ); ?> </div> </section> <?php endif; ?> </article> <?php endwhile; endif; get_footer(); |
ACF per la pagina Opzioni: impostazioni globali senza scrivere un theme options panel
Con ACF Pro puoi creare una Options Page per centralizzare le impostazioni del sito, come telefono, email, indirizzo o snippet per il footer. Comodo, perché eviti di scriverti a mano un pannello di opzioni del tema.
Esempio: options page “Impostazioni sito”
Nel file del tema (ad esempio functions.php) registri la pagina con l’API di ACF:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php if ( function_exists( 'acf_add_options_page' ) ) { acf_add_options_page( array( 'page_title' => 'Impostazioni Sito', 'menu_title' => 'Impostazioni Sito', 'menu_slug' => 'impostazioni-sito', 'capability' => 'manage_options', 'redirect' => false, ) ); } |
Poi dal backend: ACF → Gruppi di campi → Location Opzioni (Options Page) = Impostazioni Sito. Ad esempio telefono_azienda (Text) e email_azienda (Email).
Nel footer del tema li richiami così (nota il secondo parametro 'option', che dice ad ACF di leggere dalla Options Page e non dal post):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $telefono_azienda = get_field( 'telefono_azienda', 'option' ); $email_azienda = get_field( 'email_azienda', 'option' ); ?> <footer class="site-footer"> <div class="footer-contatti"> <?php if ( $telefono_azienda ) : ?> <p>Telefono: <a href="tel:<?php echo esc_attr( $telefono_azienda ); ?>"><?php echo esc_html( $telefono_azienda ); ?></a></p> <?php endif; ?> <?php if ( $email_azienda ) : ?> <p>Email: <a href="mailto:<?php echo esc_attr( $email_azienda ); ?>"><?php echo esc_html( $email_azienda ); ?></a></p> <?php endif; ?> </div> </footer> |
ACF + WooCommerce: campi extra per prodotti e logiche personalizzate
WooCommerce ha già il suo layer di meta field, ma spesso non basta. Con ACF puoi:
- aggiungere un campo Brand al prodotto;
- aggiungere un campo Video YouTube da mostrare nella scheda prodotto;
- gestire informazioni tecniche, manuali PDF, codici interni, e così via.
Esempio: campo “Brand” sui prodotti WooCommerce
In ACF:
- nuovo gruppo di campi: “Dati prodotto WooCommerce”;
- Location:
Post Type = Prodotto; - campo:
brand_prodotto(Text).
Nel template single-product.php (o meglio in un override nel child theme) mostri il brand sotto al titolo:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php defined( 'ABSPATH' ) || exit; get_header( 'shop' ); if ( have_posts() ) : while ( have_posts() ) : the_post(); global $product; $brand_prodotto = get_field( 'brand_prodotto', get_the_ID() ); ?> <div id="product-<?php the_ID(); ?>" <?php wc_product_class( '', $product ); ?>> <h1 class="product_title entry-title"><?php the_title(); ?></h1> <?php if ( $brand_prodotto ) : ?> <p class="product-brand"> <strong>Brand:</strong> <?php echo esc_html( $brand_prodotto ); ?> </p> <?php endif; ?> <!-- resto del template WooCommerce --> </div> <?php endwhile; endif; get_footer( 'shop' ); |
ACF + WooCommerce: esempio con video prodotto
Facciamo un esempio un po’ più interessante. Immagina un campo video_prodotto (URL) da mostrare in una tab dedicata nella scheda prodotto.
- ACF: campo
video_prodotto(URL) associato al post type “product”.
La tab personalizzata la aggiungi con gli hook di WooCommerce:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<?php /** * Aggiunge una tab "Video" alla scheda prodotto se esiste il campo ACF video_prodotto */ function aa_wc_aggiungi_tab_video_prodotto( $tabs ) { $video_prodotto = get_field( 'video_prodotto', get_the_ID() ); if ( $video_prodotto ) { $tabs['video_prodotto'] = array( 'title' => __( 'Video', 'tuo-textdomain' ), 'priority' => 25, 'callback' => 'aa_wc_tab_video_prodotto_contenuto', ); } return $tabs; } add_filter( 'woocommerce_product_tabs', 'aa_wc_aggiungi_tab_video_prodotto' ); /** * Callback che stampa il contenuto della tab video */ function aa_wc_tab_video_prodotto_contenuto() { $video_prodotto = get_field( 'video_prodotto', get_the_ID() ); if ( ! $video_prodotto ) { return; } ?> <h2><?php esc_html_e( 'Video del prodotto', 'tuo-textdomain' ); ?></h2> <div class="product-video-wrapper"> <iframe width="560" height="315" src="<?php echo esc_url( $video_prodotto ); ?>" frameborder="0" allowfullscreen> </iframe> </div> <?php } |
Registrare gruppi di campi via codice (Local JSON / PHP)
Sui progetti seri conviene versionare i campi ACF via PHP o Local JSON, invece di crearli solo da backend. Così te li porti dietro tra un ambiente e l’altro senza ricrearli a mano ogni volta.
Ecco un esempio minimale di registrazione di un gruppo via PHP, da eseguire nell’hook acf/init:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<?php function aa_registra_campi_prodotto_tecnico() { if ( ! function_exists( 'acf_add_local_field_group' ) ) { return; } acf_add_local_field_group( array( 'key' => 'group_prodotto_tecnico', 'title' => 'Dati Prodotto Tecnico', 'fields' => array( array( 'key' => 'field_codice_prodotto', 'label' => 'Codice prodotto', 'name' => 'codice_prodotto', 'type' => 'text', ), array( 'key' => 'field_brand', 'label' => 'Brand', 'name' => 'brand', 'type' => 'text', ), ), 'location' => array( array( array( 'param' => 'post_type', 'operator' => '==', 'value' => 'prodotto_tecnico', ), ), ), ) ); } add_action( 'acf/init', 'aa_registra_campi_prodotto_tecnico' ); |
In questo modo il gruppo di campi è definito in codice, versionabile su Git e facile da replicare tra dev, staging e produzione.
Conclusioni: perché ACF è quasi “obbligatorio” sui progetti seri
Se vuoi spingere WordPress oltre il semplice blog, ACF è uno strumento chiave. Ti permette di:
- modellare dati complessi su CPT e WooCommerce;
- offrire ai clienti un backend pulito e usabile;
- tenere il codice del tema e dei plugin ordinato e leggibile;
- centralizzare le impostazioni con una Options Page;
- versionare la struttura dei campi via PHP o JSON.
Messo insieme a buone pratiche di sviluppo (child theme, plugin custom, hook organizzati bene), ACF diventa la base per trasformare WordPress in una vera piattaforma applicativa, senza doverti riscrivere da zero tutto il pannello di amministrazione.
Guida completa ai comandi WP-CLI: elenco aggiornato e spiegazione in italiano
Google PageSpeed vs prestazioni reali: perché il punteggio non basta per un sito veloce