ACF in WordPress: come usare Advanced Custom Fields con CPT e WooCommerce
Advanced Custom Fields (ACF) è uno dei plugin più potenti per estendere WordPress senza stravolgere il core. Ti permette di aggiungere campi personalizzati a pagine, articoli, Custom Post Type (CPT), tassonomie, utenti, opzioni di tema e perfino prodotti WooCommerce, mantenendo il codice pulito e facile da mantenere.
In questo articolo vediamo in modo semi tecnico 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 reale.
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 nel backend: UI scarsa, campi non tipizzati, nessuna validazione, niente repeater, niente relazioni, nulla di “human friendly” per l’utente finale.
ACF aggiunge:
- un’interfaccia grafica per creare group di campi senza scrivere codice
- tipi di campo avanzati: select, repeater, gallery, relationship, true/false, ecc.
- logiche di visualizzazione (condizioni, location rules, ecc.)
- API PHP pulita:
get_field(),the_field(),update_field()
Il risultato: backend usabile dal cliente, dati strutturati e un frontend molto più semplice da sviluppare.
ACF + Custom Post Type: esempio pratico “Schede Prodotto Tecniche”
Immagina di avere un CPT prodotto_tecnico con 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 (es. single-prodotto_tecnico.php) puoi leggere i valori con get_field() e stamparli 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 43 44 45 |
<?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 impostazioni di sito, come telefono, email, indirizzo, snippet per il footer.
Esempio: options page “Impostazioni sito”
Nel file del tema (es. functions.php) puoi registrare la pagina con l’API di ACF:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?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, ) ); } |
Nel backend ACF → Gruppi di campi → Location: Opzioni (Options Page) = Impostazioni Sito. Ad esempio:
telefono_azienda(Text)email_azienda(Email)
Nel footer del tema puoi richiamarli così:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?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 aggiunge un proprio 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, ecc.
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 in un template override nel child theme) puoi mostrare 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 30 31 32 33 34 |
<?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
Immagina un campo video_prodotto (URL) da mostrare in una tab dedicata del prodotto.
- ACF: campo
video_prodotto(URL) associato al post type “product”.
Puoi aggiungere una tab personalizzata usando gli hook 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 |
<?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)
Per progetti strutturati è spesso meglio versionare i campi ACF via PHP o Local JSON, invece di crearli solo da backend.
Esempio minimale di registrazione di un gruppo via PHP (da eseguire in un 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 39 |
<?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 facilmente replicabile tra ambienti (dev, staging, produzione).
Conclusioni: perché ACF è quasi “obbligatorio” su 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 un backend pulito e usabile ai clienti
- mantenere il codice del tema e dei plugin ordinato e leggibile
- centralizzare impostazioni tramite Options Page
- versionare la struttura dei campi via PHP/JSON
Combinato con buone pratiche di sviluppo (child theme, plugin custom, hook ben organizzati), ACF diventa la base per trasformare WordPress in una vera piattaforma applicativa, senza riscrivere da zero tutto il pannello di amministrazione.