Che cos’è un Custom Post Type? Quando cerco di spiegarlo a qualcuno non ferrato in materia, lo definisco come un’ “entità distinta dalle altre in cui sono identificabili dei contenuti“. Certo detto così, fuori dal contesto vuol dire tutto e niente. Facciamo un esempio più terra terra. Prendiamo per esempio libri e dischi. Mettiamo quindi di avere un sito che parla di musica. Ecco, libri e dischi sono due entità distinte le quali rappresenteranno il contenitore più ampio per dei contenuti. Bingo. Libri e Dischi saranno dei Post Type (custom perchè sono personalizzati, non sono quelli di default di #WordPress ovvero articoli e pagine).

Fatta questa premessa doverosa, soprattutto per chi è alle prime armi, veniamo alla parte più “pro” e vediamo quindi come possiamo creare un custom post type tramite il file functions.php senza ricorrere all’uso di plugin esterni.

Creare un nuovo Post Type

Per definire il nostro nuovo post type dovremo utilizzare la funzione register_post_type();  . Apriamo quindi il file functions.php e cominciamo a scrivere. Troverete il codice commentato riga per riga in modo che sia chiaro tutto quello che stiamo facendo:

<?
function portfolio_custom_post() { 
	// creazione (registrazione) del custom post type
	register_post_type( 'libri', /* nome del custom post type */ 
	 	// aggiungiamo ora tutte le impostazioni necessarie, in primis definiamo le varie etichette mostrate nei menù
		array('labels' => array(
			'name' => 'Libri', /* Nome, al plurale, dell'etichetta del post type. */
			'singular_name' => 'Libro', /* Nome, al singolare, dell'etichetta del post type. */
			'all_items' => 'Tutti i Libri', /* Testo mostrato nei menu che indica tutti i contenuti del post type */
			'add_new' => 'Aggiungi nuovo', /* Il testo per il pulsante Aggiungi. */
			'add_new_item' => 'Aggiungi nuovo libro', /* Testo per il pulsante Aggiungi nuovo post type */
			'edit_item' => 'Modifica Libro', /*  Testo per modifica */
			'new_item' => 'Nuovo Libro', /* Testo per nuovo oggetto */
			'view_item' => 'Visualizza Libro', /* Testo per visualizzare */
			'search_items' => 'Cerca Libro', /* Testo per la ricerca*/ 
			'not_found' =>  'Nessun Libro trovato', /* Testo per risultato non trovato */ 
			'not_found_in_trash' => 'Nessun libro trovato nel cestino', /* Testo per risultato non trovato nel cestino */
			'parent_item_colon' => ''
			), /* Fine dell'array delle etichette */	
			'description' => 'Raccolta di Libri del portale', /* Una breve descrizione del post type */
			'public' => true, /* Definisce se il post type sia visibile sia da front-end che da back-end */
			'publicly_queryable' => true, /* Definisce se possono essere fatte query da front-end */
			'exclude_from_search' => false, /* Definisce se questo post type è escluso dai risultati di ricerca */
			'show_ui' => true, /* Definisce se deve essere visualizzata l'interfaccia di default nel pannello di amministrazione */
			'query_var' => true,
			'menu_position' => 8, /* Definisce l'ordine in cui comparire nel menù di amministrazione a sinistra */ 
			'menu_icon' => get_stylesheet_directory_uri() . '/img/custom-post-icon.png', /* Scegli l'icona da usare nel menù per il posty type */
			'rewrite'	=> array( 'slug' => 'libri', 'with_front' => false ), /* Puoi specificare uno slug per gli URL */
			'has_archive' => 'true', /* Definisci se abilitare la generazione di un archivio (equivalente di archive-libri.php) */
			'capability_type' => 'post', /* Definisci se si comporterà come un post o come una pagina */
			'hierarchical' => false, /* Definisci se potranno essere definiti elementi padri di altri */
			/* la riga successiva definisce quali elementi verranno visualizzati nella schermata di creazione del post */
			'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'sticky')
	 	) /* fine delle opzioni */
	); /* fine della registrazione */
} 
// Inizializzazione della funzione
add_action( 'init', 'portfolio_custom_post');
?>

Aggiunta quindi la nostra funzione al file, una volta salvato e refreshata la pagina di admin troveremo il nostro nuovo post type:

WordPress Nuovo Post type

Mostrare i Post Type nel Frontend

Sistemato il backend vediamo come richiamare, in modo basilare, i post type personalizzati, all’interno del nostro tema. Innanzitutto è bene sapere che per modificare le pagine archivio e single sarà sufficiente duplicare archive.php e single.php e rinominarle in archive-nomeposttype.php e single-nomeposttype.php sfruttando quindi il sistema standard di templating di WordPress. Se invece vogliamo fare una query in giro per il sito per richiamare il nostro post type, l’approccio ultra-basilare (non è questo il luogo in cui entrare nel dettaglio dei loops e delle query multiple) sarà questo:

<?php
	$args = array(	 	
		'post_type' => 'libri',
		'posts_per_page' => 10
	);
	query_posts($args);
  if (have_posts()) { 
  	while (have_posts()) { 
  		the_post();
  		// dettaglio dei post e markup
  	}
  }
next_posts_link('« Libri Precedenti');
previous_posts_link('Libri Recenti »');
?>

Conclusione

Beh, c’è effettivamente molto codice, ma l’importante in tutto questo è capire il concetto di base del post type ed affidarsi, come buona prassi, alla documentazione per il resto. Spero sia tutto chiaro, se così non fosse chiedete pure nei commenti!

Articolo ispirato a: Create WordPress Post Easily