web analytics

Creare Tema WordPress: Guida 101 allo Sviluppo Completo

22/05/2026

Come Creare un Tema WordPress: Guida Completa per Principianti

Creare un tema WordPress da zero è una delle competenze più gratificanti che uno sviluppatore web possa acquisire. Non solo ti permette di avere il pieno controllo sul design e sulle funzionalità del tuo sito, ma ti offre anche una comprensione profonda di come funziona WordPress internamente.

In questa guida ti accompagnerò passo dopo passo nel processo di sviluppo di un tema WordPress funzionale, partendo dalle basi fino ad arrivare alla creazione di un tema completo e professionale.


Perché Creare un Tema WordPress Personalizzato

Prima di immergerci nel codice, è importante capire perché potresti voler creare il tuo tema WordPress invece di utilizzarne uno preesistente.

Un tema personalizzato ti offre:

  • Controllo totale sull’aspetto e sul comportamento del sito
  • Codice pulito senza funzionalità superflue che rallentano il caricamento
  • Possibilità di branding per creare un’identità unica
  • Apprendimento approfondito del funzionamento di WordPress
  • Manutenzione semplificata perché conosci ogni parte del codice

Se stai cercando di entrare nel mondo dello sviluppo WordPress o vuoi creare un sito web professionale, imparare a sviluppare temi è un investimento che vale sicuramente il tempo dedicato.


Prerequisiti per lo Sviluppo di Temi WordPress

Prima di iniziare, assicurati di avere una buona comprensione dei seguenti concetti:

Competenze Tecniche Necessarie

  • HTML e CSS: La base di qualsiasi sito web. Devi sapere come strutturare una pagina e stilizzarla.
  • PHP: WordPress è costruito su PHP, quindi una conoscenza base è essenziale per comprendere come funziona il sistema di template.
  • JavaScript: Utile per aggiungere interattività, anche se non strettamente necessario per un tema base.

Strumenti di Sviluppo

  • Un server locale come XAMPP, MAMP o Local by Flywheel
  • Un editor di codice come Visual Studio Code, PhpStorm o Sublime Text
  • Un browser moderno con strumenti di sviluppo (Chrome DevTools)
  • Accesso a un’installazione WordPress locale

Configurare l’Ambiente di Sviluppo Locale

Il primo passo concreto è configurare un ambiente di sviluppo locale dove poter testare il tuo tema senza compromettere un sito live.

Installare Local by Flywheel

Local è una delle opzioni più semplici per creare un ambiente WordPress locale:

  1. Scarica e installa Local dal sito ufficiale
  2. Crea un nuovo sito WordPress
  3. Assegna un nome al progetto
  4. Attendi che l’installazione venga completata
  5. Accedi alla bacheca WordPress

Una volta completata l’installazione, avrai un sito WordPress funzionante su cui testare il tuo tema in tempo reale.

Struttura delle Cartelle dei Temi

WordPress cerca i temi in una struttura specifica. I temi si trovano in:

wp-content/themes/nome-del-tuo-tema/

Questa cartella sarà la tua area di lavoro principale. Al suo interno creerai tutti i file necessari per il tuo tema.


Creare i File Essenziali del Tema

Ogni tema WordPress richiede alcuni file fondamentali per funzionare. Iniziamo creando la struttura base.

1. Il File style.css

Il file style.css è il cuore del tuo tema. Non contiene solo CSS, ma anche le informazioni necessarie a WordPress per riconoscere e visualizzare il tema nel pannello di amministrazione.

/
Theme Name: Il Mio Primo Tema
Theme URI: https://esempio.com
Author: Il Tuo Nome
Author URI: https://esempio.com
Description: Un tema WordPress personalizzato creato da zero
Version: 1.0.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: mio-primo-tema
/

Questo commento iniziale è obbligatorio. Senza di esso, WordPress non sarà in grado di riconoscere il tuo tema.

2. Il File functions.php

Il file functions.php è dove definisci le funzionalità del tema, registri script, stili, menu, widget e molto altro.

<?php
// Aggiungiamo il supporto per vari elementi di WordPress
function mio_tema_setup() {
    // Supporto per il titolo del sito
    add_theme_support('title-tag');

    // Supporto per le immagini in evidenza
    add_theme_support('post-thumbnails');

    // Supporto per il logo personalizzato
    add_theme_support('custom-logo');

    // Registriamo un menu di navigazione
    register_nav_menus(array(
        'primary' => __('Menu Principale', 'mio-primo-tema'),
        'footer' => __('Menu Footer', 'mio-primo-tema'),
    ));
}
add_action('after_setup_theme', 'mio_tema_setup');

// Carichiamo gli stili e gli script
function mio_tema_scripts() {
    wp_enqueue_style('mio-tema-style', get_stylesheet_uri());
    wp_enqueue_script('mio-tema-script', get_template_directory_uri() . '/js/main.js', array(), '1.0.0', true);
}
add_action('wp_enqueue_scripts', 'mio_tema_scripts');

3. Il File index.php

Il file index.php è il template di fallback di WordPress. Viene utilizzato quando non esiste un template più specifico per un determinato contenuto.

<?php get_header(); ?>

<main class="site-main">
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>

        <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
            <header class="entry-header">
                <h2 class="entry-title">
                    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                </h2>
                <div class="entry-meta">
                    <span class="posted-on"><?php echo get_the_date(); ?></span>
                </div>
            </header>

            <div class="entry-content">
                <?php the_content(); ?>
            </div>
        </article>

    <?php endwhile; else : ?>
        <p><?php esc_html_e('Nessun contenuto trovato.', 'mio-primo-tema'); ?></p>
    <?php endif; ?>
</main>

<?php get_footer(); ?>

Comprendere la Gerarchia dei Template

WordPress utilizza un sistema di gerarchia dei template per determinare quale file PHP visualizzare per ogni tipo di contenuto. Comprendere questo sistema è fondamentale per creare un tema completo.

Ordine di Priorità dei Template

Ecco l’ordine in cui WordPress cerca i template:

Tipo di Contenuto Template Principale Fallback
Homepage front-page.php home.php → index.php
Articoli single.php singular.php → index.php
Pagine page-{slug}.php → page-{id}.php page.php → index.php
Categorie category-{slug}.php → category-{id}.php archive.php → index.php
Tag tag-{slug}.php → tag-{id}.php archive.php → index.php
Archive autore author-{nicename}.php → author-{id}.php archive.php → index.php
Ricerca search.php index.php
404 404.php index.php

Esempio Pratico: Creare header.php e footer.php

Per evitare di ripetere il codice in ogni template, WordPress permette di creare file parziali riutilizzabili.

header.php

<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
    <meta charset="<?php bloginfo('charset'); ?>">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<?php wp_body_open(); ?>

<header class="site-header">
    <div class="container">
        <?php if (has_custom_logo()) : ?>
            <?php the_custom_logo(); ?>
        <?php else : ?>
            <h1 class="site-title">
                <a href="<?php echo esc_url(home_url('/')); ?>">
                    <?php bloginfo('name'); ?>
                </a>
            </h1>
        <?php endif; ?>

        <nav class="main-navigation">
            <?php wp_nav_menu(array(
                'theme_location' => 'primary',
                'container' => false,
                'menu_class' => 'nav-menu',
            )); ?>
        </nav>
    </div>
</header>

<main class="site-content">

footer.php

</main>

<footer class="site-footer">
    <div class="container">
        <p>&copy; <?php echo date('Y'); ?> <?php bloginfo('name'); ?>. Tutti i diritti riservati.</p>
        <?php wp_nav_menu(array('theme_location' => 'footer')); ?>
    </div>
</footer>

<?php wp_footer(); ?>
</body>
</html>

Il Loop di WordPress: Cuore del Sistema

Il Loop è il meccanismo fondamentale attraverso cui WordPress recupera e visualizza i contenuti. Comprenderlo è essenziale per qualsiasi sviluppatore di temi.

Struttura Base del Loop

<?php
// Verifichiamo se ci sono post da visualizzare
if (have_posts()) :

    // Iteriamo attraverso ogni post
    while (have_posts()) : the_post();

        // Contenuto del singolo post ?>
        <article id="post-<?php the_ID(); ?>">
            <h2><?php the_title(); ?></h2>
            <div class="post-thumbnail">
                <?php if (has_post_thumbnail()) : ?>
                    <?php the_post_thumbnail('medium'); ?>
                <?php endif; ?>
            </div>
            <div class="post-excerpt">
                <?php the_excerpt(); ?>
            </div>
            <a href="<?php the_permalink(); ?>">Leggi tutto</a>
        </article>
        <?php

    endwhile;

    // Paginazione
    the_posts_pagination();

else :
    // Messaggio se non ci sono post
    echo '<p>Nessun contenuto disponibile.</p>';

endif;
?>

Funzioni Utili all’Interno del Loop

All’interno del Loop hai accesso a numerose funzioni:

  • the_title() - Visualizza il titolo del post
  • the_content() - Visualizza il contenuto completo
  • the_excerpt() - Visualizza un riassunto
  • the_permalink() - Restituisce l’URL del post
  • the_post_thumbnail() - Visualizza l’immagine in evidenza
  • the_date() - Visualizza la data di pubblicazione
  • the_author() - Visualizza l’autore
  • get_the_category() - Recupera le categorie

Template Parts: Riutilizzare il Codice

I template parts sono frammenti di template che puoi includere in diversi punti del tuo tema. Questo approccio promuove il riutilizzo del codice e la manutenzione più semplice.

Creare Template Parts

Puoi creare template parts per elementi ripetitivi come card di articoli, header di sezioni, o qualsiasi altro componente.

template-parts/content.php

<article id="post-<?php the_ID(); ?>" <?php post_class('article-card'); ?>>
    <?php if (has_post_thumbnail()) : ?>
        <div class="card-image">
            <a href="<?php the_permalink(); ?>">
                <?php the_post_thumbnail('large'); ?>
            </a>
        </div>
    <?php endif; ?>

    <div class="card-content">
        <h3 class="card-title">
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
        </h3>

        <div class="card-meta">
            <span class="card-date"><?php echo get_the_date(); ?></span>
            <span class="card-author">di <?php the_author(); ?></span>
        </div>

        <div class="card-excerpt">
            <?php the_excerpt(); ?>
        </div>

        <a href="<?php the_permalink(); ?>" class="card-link">
            Continua a leggere →
        </a>
    </div>
</article>

Includere Template Parts nel Template

<?php get_template_part('template-parts/content', 'page'); ?>

Il secondo parametro (‘page’) permette di specificare un suffisso. WordPress cercherà prima content-page.php e, se non esiste, ricorrerà a content.php.


Aggiungere Stili e Script Correttamente

Un aspetto cruciale dello sviluppo temi è la gestione corretta di CSS e JavaScript. WordPress fornisce un sistema integrato per caricare risorse in modo sicuro e.performante.

Best Practices per CSS e JavaScript

function mio_tema_enqueue_assets() {
    // CSS principale del tema
    wp_enqueue_style(
        'mio-tema-main',
        get_stylesheet_directory_uri() . '/css/main.css',
        array(),
        '1.0.0'
    );

    // Font Google (dipendenza per main.css)
    wp_enqueue_style(
        'google-fonts',
        'https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap',
        array(),
        null
    );

    // JavaScript con dipendenze
    wp_enqueue_script(
        'mio-tema-navigation',
        get_template_directory_uri() . '/js/navigation.js',
        array(),
        '1.0.0',
        true
    );

    // JavaScript condizionale (es. solo per IE)
    wp_enqueue_script(
        'html5shiv',
        'https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js',
        array(),
        '3.7.3',
        false
    );
    wp_script_add_data('html5shiv', 'conditional', 'lt IE 9');
}
add_action('wp_enqueue_scripts', 'mio_tema_enqueue_assets');

Creare il File CSS Principale

css/main.css

/ Reset di base /
 {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

/ Variabili CSS /
:root {
    --color-primary: #2563eb;
    --color-secondary: #1e40af;
    --color-text: #1f2937;
    --color-bg: #ffffff;
    --font-main: 'Inter', sans-serif;
    --spacing-md: 1.5rem;
    --spacing-lg: 3rem;
}

/ Stili globali /
body {
    font-family: var(--font-main);
    color: var(--color-text);
    background-color: var(--color-bg);
    line-height: 1.6;
}

/ Container /
.container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 var(--spacing-md);
}

/ Header /
.site-header {
    padding: var(--spacing-md) 0;
    border-bottom: 1px solid #e5e7eb;
}

.site-header .container {
    display: flex;
    justify-content: space-between;
    align-items: center;
}

/ Navigazione /
.nav-menu {
    display: flex;
    list-style: none;
    gap: var(--spacing-md);
}

.nav-menu a {
    text-decoration: none;
    color: var(--color-text);
    transition: color 0.3s ease;
}

.nav-menu a:hover {
    color: var(--color-primary);
}

/ Articoli /
.article-card {
    margin-bottom: var(--spacing-lg);
    padding: var(--spacing-md);
    border-radius: 8px;
    background: #f9fafb;
}

.card-title a {
    text-decoration: none;
    color: var(--color-text);
}

/ Responsive */
@media (max-width: 768px) {
    .site-header .container {
        flex-direction: column;
        gap: var(--spacing-md);
    }

    .nav-menu {
        flex-direction: column;
        align-items: center;
    }
}

Personalizzare il Tema con il Customizer

Il Customizer di WordPress permette agli utenti di modificare aspeketti del tema in tempo reale. Implementare il Customizer rende il tuo tema più flessibile e user-friendly.

Aggiungere Opzioni al Customizer

function mio_tema_customize_register($wp_customize) {
    // Sezione Colori
    $wp_customize->add_section('mio_tema_colors', array(
        'title' => __('Colori del Sito', 'mio-primo-tema'),
        'priority' => 30,
    ));

    // Impostazione colore primario
    $wp_customize->add_setting('primary_color', array(
        'default' => '#2563eb',
        'sanitize_callback' => 'sanitize_hex_color',
    ));

    $wp_customize->add_control(new WP_Customize_Color_Control($wp_customize, 'primary_color', array(
        'label' => __('Colore Primario', 'mio-primo-tema'),
        'section' => 'mio_tema_colors',
        'settings' => 'primary_color',
    )));

    // Sezione Layout
    $wp_customize->add_section('mio_tema_layout', array(
        'title' => __('Layout', 'mio-primo-tema'),
        'priority' => 35,
    ));

    // Impostazione container width
    $wp_customize->add_setting('container_width', array(
        'default' => '1200',
        'sanitize_callback' => 'absint',
    ));

    $wp_customize->add_control('container_width', array(
        'type' => 'number',
        'section' => 'mio_tema_layout',
        'label' => __('Larghezza Container (px)', 'mio-primo-tema'),
        'input_attrs' => array(
            'min' => 800,
            'max' => 1920,
            'step' => 20,
        ),
    ));
}
add_action('customize_register', 'mio_tema_customize_register');

// Applicare le impostazioni nel CSS
function mio_tema_customizer_css() {
    $primary_color = get_theme_mod('primary_color', '#2563eb');
    $container_width = get_theme_mod('container_width', '1200');
    ?>
    <style type="text/css">
        :root {
            --color-primary: <?php echo esc_attr($primary_color); ?>;
            --container-max: <?php echo esc_attr($container_width); ?>px;
        }
    </style>
    <?php
}
add_action('wp_head', 'mio_tema_customizer_css');

Creare Template Specifici

Per un tema completo, dovresti creare template specifici per diversi tipi di contenuto.

Template per Pagine (page.php)

<?php get_header(); ?>

<main class="page-template">
    <?php while (have_posts()) : the_post(); ?>

        <article class="page-content">
            <header class="page-header">
                <h1 class="page-title"><?php the_title(); ?></h1>
            </header>

            <div class="page-body">
                <?php the_content(); ?>
            </div>

            <?php
            // Supporto per la paginazione all'interno del contenuto
            wp_link_pages(array(
                'before' => '<div class="page-links">' . __('Pagine:', 'mio-primo-tema'),
                'after' => '</div>',
            ));
            ?>
        </article>

        <?php
        // Commenti (se abilitati)
        if (comments_open() || get_comments_number()) :
            comments_template();
        endif;
        ?>

    <?php endwhile; ?>
</main>

<?php get_footer(); ?>

Template per Articoli (single.php)

<?php get_header(); ?>

<main class="single-post">
    <?php while (have_posts()) : the_post(); ?>

        <article class="post-single">
            <header class="post-header">
                <?php if (has_post_thumbnail()) : ?>
                    <div class="post-featured-image">
                        <?php the_post_thumbnail('large'); ?>
                    </div>
                <?php endif; ?>

                <h1 class="post-title"><?php the_title(); ?></h1>

                <div class="post-meta">
                    <span class="post-date">
                        <time datetime="<?php echo get_the_date('c'); ?>">
                            <?php echo get_the_date(); ?>
                        </time>
                    </span>
                    <span class="post-author">
                        <?php the_author_posts_link(); ?>
                    </span>
                    <span class="post-categories">
                        <?php the_category(', '); ?>
                    </span>
                </div>
            </header>

            <div class="post-content">
                <?php the_content(); ?>
            </div>

            <footer class="post-footer">
                <?php the_tags('<div class="post-tags"><strong>Tag:</strong> ', ', ', '</div>'); ?>

                <?php get_template_part('template-parts/author', 'bio'); ?>
            </footer>
        </article>

        <nav class="post-navigation">
            <div class="previous-post">
                <?php previous_post_link('%link', '← Articolo precedente'); ?>
            </div>
            <div class="next-post">
                <?php next_post_link('%link', 'Articolo successivo →'); ?>
            </div>
        </nav>

        <?php comments_template(); ?>

    <?php endwhile; ?>
</main>

<?php get_footer(); ?>

Template per Errori 404 (404.php)

<?php get_header(); ?>

<main class="error-404">
    <div class="container">
        <section class="error-404-content">
            <h1 class="error-code">404</h1>
            <h2 class="error-title"><?php esc_html_e('Pagina Non Trovata', 'mio-primo-tema'); ?></h2>
            <p class="error-message">
                <?php esc_html_e('La pagina che stai cercando non esiste o è stata spostata.', 'mio-primo-tema'); ?>
            </p>

            <div class="error-search">
                <h3><?php esc_html_e('Prova a cercare:', 'mio-primo-tema'); ?></h3>
                <?php get_search_form(); ?>
            </div>

            <div class="error-links">
                <a href="<?php echo esc_url(home_url('/')); ?>" class="btn-home">
                    <?php esc_html_e('Torna alla Home', 'mio-primo-tema'); ?>
                </a>
            </div>
        </section>
    </div>
</main>

<?php get_footer(); ?>

Sicurezza e Best Practices

Quando sviluppi un tema WordPress, la sicurezza deve essere sempre una priorità.

Sanitizzazione e Validazione

// Sanitizzazione degli input
$testo = sanitize_text_field($input);
$email = sanitize_email($input);
$url = esc_url($input);
$html = wp_kses_post($input);

// escaping dell'output
echo esc_html($testo);
echo esc_attr($attributo);
echo esc_url($link);
echo wp_kses_post($contenuto_html);

Altre Best Practices

  • Non modificare i file core di WordPress
  • Usa funzioni WordPress native invece di codice personalizzato quando possibile
  • Implementa il supporto per la traduzione usando __() e _e()
  • Evita queries personalizzate complesse nel template; usa invece hooks e filtri
  • Mantieni il codice modulare usando template parts e funzioni specifiche

Testare e Distribuire il Tema

Prima di rendere disponibile il tuo tema, è essenziale testarlo accuratamente.

Checklist per i Test

  • [ ] Il tema si attiva senza errori
  • [ ] Tutti i template funzionano correttamente
  • [ ] I menu di navigazione sono visualizzati
  • [ ] Le immagini in evidenza vengono visualizzate
  • [ ] I commenti funzionano
  • [ ] La paginazione è corretta
  • [ ] Il Customizer funziona
  • [ ] Il tema è responsive su diversi dispositivi
  • [ ] Non ci sono errori PHP o JavaScript nella console
  • [ ] Il tema rispetta gli standard WordPress

Strumenti di Test

  • Theme Check: Plugin che verifica la conformità agli standard WordPress
  • Query Monitor: Per debuggare query database e performance
  • Browser DevTools: Per testare CSS e JavaScript
  • Theme Unit Test: Dataset di test per verificare la compatibilità

Autore articolo: Emilio Petrozzi

🌐 Creazione siti web dinamici e di commercio elettronico 🛍 assistenza WordPress 🌐 Con oltre 20 anni di esperienza nel settore, esperto nella realizzazione di soluzioni digitali personalizzate per il tuo business. 🚀

🔧 Offro assistenza WordPress completa, garantendo che il tuo sito sia sempre aggiornato e funzionante al meglio. 📈 Inoltre mi occupo dell'ottimizzazione per motori di ricerca (SEO), assicurando che il tuo sito sia sempre facilmente rintracciabile dai tuoi clienti. 💻

📢 Le mie campagne pubblicitarie web sono progettate per aumentare la visibilità del tuo brand e generare traffico di qualità verso il tuo sito. 🔒 Inoltre la sicurezza informatica è una priorità in modo tale da garantire i tuoi dati e quelli dei tuoi clienti.

🤝 Affidati a mrtux.it per un servizio professionale e di qualità, e porta il tuo business al successo nel mondo digitale! 🎯

🔑 #CreazioneSitiWeb #Ecommerce #AssistenzaWordPress #OttimizzazioneSEO #SicurezzaInformatica

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


Aricoli correlati

Emilio Petrozzi  P. I.V.A. IT03080230604 - Professionista ai sensi della Legge 4/2013