Basi del Tema
File Richiesti
style.cssIntestazione metadati del tema + stili
index.phpTemplate di fallback (obbligatorio)
functions.phpConfigurazione tema, hook, enqueue
screenshot.pngAnteprima del tema (1200x900)
Intestazione style.css
/* Theme Name: My Theme Theme URI: https://example.com Version: 1.0 Requires at least: 6.0 */
Configurazione functions.php
add_action('after_setup_theme', function() { add_theme_support('title-tag'); add_theme_support('post-thumbnails'); add_theme_support('html5', ['search-form', 'gallery']); register_nav_menus(['primary' => 'Main Nav']); });
Gerarchia dei Template
Template di Pagina
front-page.phpPagina iniziale statica
home.phpIndice dei post del blog
single.phpSingolo post
page.phpSingola pagina
archive.phpArchivi post (data, categoria)
category.phpArchivio categorie
search.phpRisultati di ricerca
404.phpPagina non trovata
index.phpFallback definitivo
Parti di Template
get_header(); // header.php get_footer(); // footer.php get_sidebar(); // sidebar.php get_template_part('parts/card'); // parts/card.php get_template_part('parts/card', 'featured');
Ordine di Ricerca (Post Singolo)
1single-{post_type}-{slug}.php
2single-{post_type}.php
3single.php
4singular.php
5index.php
Il Loop
Loop Standard

Tag di Template
the_title()Stampa il titolo del post
the_content()Stampa il contenuto del post
the_excerpt()Stampa il riassunto del post
the_permalink()Stampa l'URL del post
the_post_thumbnail()Stampa l'immagine in evidenza
the_date()Stampa la data di pubblicazione
the_author()Stampa il nome dell'autore
the_category()Stampa i link alle categorie
Getter (Ritornano, Non Stampano)
$title = get_the_title(); $url = get_permalink(); $id = get_the_ID(); $thumb = get_the_post_thumbnail_url(null, 'medium');
Custom Post Type
Registrare un CPT
add_action('init', function() { register_post_type('product', [ 'labels' => ['name' => 'Products', 'singular_name' => 'Product'], 'public' => true, 'has_archive' => true, 'supports' => ['title', 'editor', 'thumbnail'], ]); });
Tassonomia Personalizzata
register_taxonomy('brand', 'product', [ 'labels' => ['name' => 'Brands'], 'hierarchical' => true, 'rewrite' => ['slug' => 'brand'], ]);
Opzioni Supports
titleCampo titolo del post
editorEditor del contenuto
thumbnailImmagine in evidenza
excerptCampo riassunto
custom-fieldsMeta box per campi personalizzati
page-attributesOrdine menu, genitore
revisionsCronologia revisioni
Hook e Filtri
Action (Esegui Qualcosa)
// Registra un hook add_action('wp_head', 'my_analytics', 20); function my_analytics() { echo ''; }
Filter (Modifica Dati)
// Modifica la lunghezza del riassunto add_filter('excerpt_length', fn() => 30); // Aggiungi testo a ogni post add_filter('the_content', function($c) { return is_single() ? $c . '

Grazie per la lettura!

' : $c; });
Hook Principali
initWP inizializzato; registra i CPT qui
wp_enqueue_scriptsAggiunge CSS/JS
wp_headOutput in
wp_footerOutput prima di
save_postDopo il salvataggio di un post
pre_get_postsModifica la query principale prima dell'esecuzione
the_contentFiltra l'output del contenuto del post
the_titleFiltra l'output del titolo del post
WP_Query
Query Personalizzata
$q = new WP_Query([ 'post_type' => 'product', 'posts_per_page' => 10, 'orderby' => 'date', 'order' => 'DESC', ]); while ($q->have_posts()) : $q->the_post(); the_title('

', '

'); endwhile; wp_reset_postdata();
Parametri Comuni
post_typepost, page, o tipo personalizzato
posts_per_pageNumero di risultati (-1 per tutti)
category_nameFiltra per slug categoria
tagFiltra per slug tag
sParola chiave di ricerca
meta_key / meta_valueFiltra per campo personalizzato
tax_queryFiltraggio avanzato per tassonomia
date_queryFiltra per intervallo di date
Modifica la Query Principale
add_action('pre_get_posts', function($q) { if (!is_admin() && $q->is_main_query() && is_home()) { $q->set('posts_per_page', 5); } });
REST API
Endpoint Predefiniti
/wp-json/wp/v2/postsElenca / crea post
/wp-json/wp/v2/posts/{id}Ottieni / aggiorna / elimina post
/wp-json/wp/v2/pagesEndpoint pagine
/wp-json/wp/v2/categoriesEndpoint categorie
/wp-json/wp/v2/mediaLibreria media
/wp-json/wp/v2/usersEndpoint utenti
Endpoint Personalizzato
add_action('rest_api_init', function() { register_rest_route('myplugin/v1', '/items', [ 'methods' => 'GET', 'callback' => fn($req) => new WP_REST_Response( get_posts(['post_type' => 'item', 'numberposts' => 20]) ), 'permission_callback' => '__return_true', ]); });
Fetch da JavaScript
const res = await fetch('/wp-json/wp/v2/posts?per_page=5'); const posts = await res.json(); posts.forEach(p => console.log(p.title.rendered));
Funzioni
Funzioni Post
get_posts($args)Recupera un array di post
wp_insert_post($arr)Crea o aggiorna un post
wp_delete_post($id)Manda nel cestino o elimina un post
get_post_meta($id, $key)Ottieni il valore di un campo personalizzato
update_post_meta($id, $k, $v)Imposta il valore di un campo personalizzato
Utenti e Autenticazione
wp_get_current_user()Utente attualmente connesso
is_user_logged_in()Verifica lo stato di accesso
current_user_can($cap)Verifica le capacità
wp_create_nonce($action)Genera un nonce di sicurezza
wp_verify_nonce($nonce, $a)Verifica un nonce
Funzioni di Utilità
esc_html($str)Escape per contesto HTML
esc_attr($str)Escape per contesto attributo
esc_url($url)Sanifica URL
wp_kses_post($html)Permette solo HTML sicuro per i post
sanitize_text_field($s)Rimuove tag e spazi extra
absint($val)Intero assoluto
Enqueue
Aggiungere Stili e Script
add_action('wp_enqueue_scripts', function() { wp_enqueue_style('theme-style', get_stylesheet_uri(), [], '1.0'); wp_enqueue_script('theme-js', get_theme_file_uri('/js/app.js'), ['jquery'], '1.0', true); });
Funzioni Enqueue
wp_enqueue_style($h, $src)Registra + aggiunge CSS
wp_enqueue_script($h, $src)Registra + aggiunge JS
wp_localize_script($h, $n, $d)Passa dati PHP a JS
wp_dequeue_style($handle)Rimuove lo stile aggiunto
wp_dequeue_script($handle)Rimuove lo script aggiunto
Passare Dati a JavaScript
wp_enqueue_script('my-app', get_theme_file_uri('/js/app.js')); wp_localize_script('my-app', 'myData', [ 'ajaxUrl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('my_action'), ]); // JS: console.log(myData.ajaxUrl)
Pattern Comuni
Template di Pagina Personalizzato
Handler AJAX
add_action('wp_ajax_my_action', 'handle_my_action'); add_action('wp_ajax_nopriv_my_action', 'handle_my_action'); function handle_my_action() { check_ajax_referer('my_action', 'nonce'); wp_send_json_success(['msg' => 'OK']); }
Shortcode
add_shortcode('greeting', function($atts) { $a = shortcode_atts(['name' => 'World'], $atts); return '

Ciao, ' . esc_html($a['name']) . '!

'; }); // Utilizzo: [greeting name="Zhi"]