In WordPress i tipi di post forniscono la struttura che permette di gestire (creare, modificare e visualizzare) diverse tipologie di contenuti, essi possono essere testuali, ipertestuali e mediali. La configurazione iniziale di WordPress dispone di cinque tipi di post predefiniti: post, page, attachment, revision, navigation menu.
Tutti questi tipi vengono archiviati nella tabella wp_posts
e differenziati l'uno dall'altro dal valore del campo post_type
, in base al quale WordPress gestirà un determinato record della tabella come post (post_type = post
), pagina (page
) o elemento di menu (nav_menu_item
).
Oltre ai tipi predefiniti, WordPress permette di creare tipi di post personalizzati, o custom post type, estremamente utili per aggiungere funzionalità ai propri temi. Molti temi, infatti, vengono dotati di specifici custom post type, che permettono la creazione di portfolio, calendari di eventi o cataloghi prodotti.
I custom post type non costituiscono, però, una funzionalità specifica dei temi. È bene sottolineare, infatti, che questi possono essere aggiunti a quelli predefiniti anche tramite un plugin. Quando la registrazione di nuovi post type avviene tramite il file functions.php
di un tema, questi scompariranno se l'amministratore del sito attiva un tema diverso.
Per gli scopi di questa guida, si è pensato di dotare il tema Seventyone di un custom post type denominato Events. L'esempio che si proporrà sarà evidentemente semplice, ma fornirà tutte le informazioni necessarie ad approfondire poi la conoscenza dell'argomento.
La registrazione di un custom post type
Il primo passo è la registrazione del tipo di post. Il Codex consiglia di invocare la funzione register_post_type()
all'esecuzione dell'action hook init
, altrimenti la registrazione non viene eseguita correttamente.
register_post_type( $post_type, $args );
La funzione accetta due argomenti. Il primo è lo slug del tipo di post, che può essere costituito solo da lettere minuscole e underscore, e non può essere formato da più di 20 caratteri; il secondo è un array di parametri che stabiliscono le impostazioni del tipo di post e le etichette visualizzate nelle pagine di amministrazione.
Nel file functions.php
del tema Seventyone, dunque, si aggiunga il seguente codice:
function seventyone_init(){
// custom post types
$labels = array(
'name' => 'Events',
'singular_name' => 'Event',
'menu_name' => 'My Events',
'all_items' => 'All Events',
'add_new' => 'Add New',
'add_new_item' => 'Add new Event',
'edit' => 'Edit',
'edit_item' => 'Edit Event',
'new_item' => 'New Event',
'view' => 'View',
'view_item' => 'View Event',
'search_items' => 'Search Event',
'not_found' => 'No Events found',
'not_found_in_trash' => 'No Events in Thrash',
'parent' => 'Parent Event',
);
$supports = array(
'title',
'editor',
'excerpt',
'custom-fields',
'comments',
'revisions',
'thumbnail',
'author',
'page-attributes'
);
$args = array(
'labels' => $labels,
'description' => '',
'public' => true,
'show_ui' => true,
'has_archive' => true,
'show_in_menu' => true,
'exclude_from_search' => false,
'capability_type' => 'post',
'map_meta_cap' => true,
'hierarchical' => false,
'rewrite' => array( 'slug' => 'event', 'with_front' => true ),
'query_var' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-calendar-alt',
'supports' => $supports,
'taxonomies' => array( 'event_category' )
);
register_post_type( 'event', $args );
}
add_action( 'init', 'seventyone_init' );
La registrazione dei tipi di post richiede un attento lavoro di configurazione. Si rinvia al Codex per la descrizione dettagliata di tutti i parametri, mentre qui ci si limiterà a segnalare che è necessario registrare le tassonomie associate ai tipi di post attraverso il parametro taxonomies
, altrimenti queste non saranno riconosciute da WordPress. Come si noterà, il valore di taxonomies
è un array, i cui elementi sono costituiti dagli slug delle tassonomie.
Si passa, quindi, alla registrazione della tassonomia associata al tipo di post Event. La registrazione avviene tramite la funzione register_taxonomy
, che viene eseguita di nuovo all'evento init
:
register_taxonomy( $taxonomy, $post_type, $args );
$taxonomy
è lo slug della tassonomia (costituito solo da lettere minuscole e underscore, con un massimo 32 caratteri); $post_type
è il nome del tipo di post, che può essere uno dei tipi predefiniti o un custom post type; $args
è invece un array di argomenti.
Si integri, quindi, il codice precedente con quello che segue:
function seventyone_init(){
...
// custom taxonomies
$labels = array(
"name" => "Event Categories",
"label" => "Event Categories",
"menu_name" => "Categories",
"all_items" => "All categories",
"edit_item" => "Edit category",
"view_item" => "View category",
"update_item" => "Update category",
"add_new_item" => "Add new category",
"new_item_name" => "New category name",
"parent_item" => "Parent category",
"parent_item_colon" => "Parent category:",
"search_items" => "Search categories",
"popular_items" => "Popular categories",
"separate_items_with_commas" => "Separate categories with commas",
"add_or_remove_items" => "Add or remove categories",
"choose_from_most_used" => "Choose from the most used categories",
"not_found" => "No categories found",
);
$args = array(
"labels" => $labels,
"hierarchical" => false,
"label" => "Event Categories",
"show_ui" => true,
"query_var" => true,
"rewrite" => array( 'slug' => 'event_category', 'with_front' => true ),
"show_admin_column" => false,
);
register_taxonomy( "event_category", array( "event" ), $args );
}
add_action( 'init', 'seventyone_init' );
Al momento il nuovo tipo di post non è molto di diverso dai normali post di WordPress, a parte il fatto che non rientra automaticamente nel Loop. Tuttavia, l'archivio è già visualizzabile nel front-end, semplicemente digitando la URL del sito con l'aggiunta dello slug del custom post type:
http://example.com/event/
Come nota conclusiva, si ricorda che non tutti i nomi sono disponibili per la registrazione dei custom post type.
Nel prossimo capitolo si vedrà come rendere più specifico (e funzionale) il custom post type appena creato.