Custom post type

Di base wp ha a disposizione due tipi di elementi : le pagine (la cui personalizzazione avviene come visto tramite i template di pagina) e i post, che nel backend compaiono come Articoli.
Possiamo però creare infinite tipologie di post che verranno visualizzati separatamente dagli articoli stadard nel backend e potranno essere personalizzati come meglio si crede. È importante che ad ogni modifica di elementi quali url, custom post type o comunque se il sito ritorna la pagina 404 o qualche elemento non viene visualizzato correttamente (e si creda debba esserlo) si clicchi nel backend su Impostazioni -> Permalink ->Salva le modifiche. Questo aggiornerà tutta la struttura ed i relativi collegamenti
Per creare ad esempio un custom post type News, in functions.php o in un file da lui richimato scriveremo prima la funzione per crearlo seguita se serve da una funzione per creare la sua o le sue taxonomy che non sono altro che la "categoria" che compare di default per gli Articoli di wp. Se vorremo condividere la categoria degli articoli normali di wp, scriveremo (vedi sotto) 'taxonomies' => array(‘category’), altrimenti taxonomies rimarrà vuoto

function custom_post_news() { 
	register_post_type( 'news', /* nome al quale si farà poi sempre riferimento a codice*/
		array('labels' => array(
			'name' => 'News', /* Nome, al plurale, dell'etichetta del post type. */
			'singular_name' => 'News', /* Nome, al singolare, dell'etichetta del post type. */
			'all_items' => 'All news', /* Testo nei menu che indica tutti i contenuti del post type */
			'add_new' => 'Add new', /* Il testo per il pulsante Aggiungi. */
			'add_new_item' => 'Add new news', /* Testo per il pulsante Aggiungi nuovo post type */
			'edit_item' => 'Modify news', /*  Testo per modifica */
			'new_item' => 'New news', /* Testo per nuovo oggetto */
			'view_item' => 'View news', /* Testo per visualizzare */
			'search_items' => 'Search news', /* Testo per la ricerca*/
			'not_found' =>  'No news founded', /* Testo per risultato non trovato */
			'not_found_in_trash' => 'No news founded', /* Testo per risultato non trovato in cestino */
			'parent_item_colon' => ''
			), /* Fine dell'array delle etichette */   
			'description' => 'News', /* 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 è escluso dai risultati di ricerca */
			'show_ui' => true, /* Per visualizzare l'interfaccia nel pannello di amministrazione */
			'query_var' => true,
			'menu_position' => 8, /* Definisce l'ordine in cui comparire nel menù di a sinistra */
			'menu_icon' => 'dashicons-megaphone', /* Scegli l'icona da usare nel menù */
			// https://developer.wordpress.org/resource/dashicons
			'rewrite'   => array( 'slug' => 'news', 'with_front' => false ), /*  slug per gli URL */
			'has_archive' => 'true', /* generazione archivio */
			'capability_type' => 'post', /* Definisci se si comporterà come post o come una pagina */
			'hierarchical' => false, /* Definisci se potranno essere definiti elementi padri di altri */
			/* quali elementi verranno visualizzati nella schermata di creazione del post */
			'supports' => array( 'title', 'editor', 'thumbnail', 'sticky','page-attributes'),
			'taxonomies' => array()
		) /* fine delle opzioni */
	); /* fine della registrazione */
} 
// Inizializzazione della funzione
add_action( 'init', 'custom_post_news');
register_taxonomy('tipologia_news', array('news'), array( // ($nome_taxonomy, $post_type, $options)
	'label' => 'Tipologie', // nome dell'etichetta
	'hierarchical' => true // tassonomia gerarchica - come tags
));
// oppure per utilizzare la stessa taxonomy per più custom post type
register_taxonomy('tipologia_news', array('news','eventi','appuntamenti'), array( // ($nome_taxonomy, $post_type, $options)
	'label' => 'Tipologie', // nome dell'etichetta
	'hierarchical' => true // tassonomia gerarchica - come tags
));

Ora nel backend potremo vedere il nostro nuovo custom post type, gestibile allo stesso modo degli articoli standard di wp. La cosa importante ora è sapere che l’ideale è creare due files php : uno per gestire la pagina che caricherà l’elenco dei nostri custom post type (non obbligatorio se verranno caricati in una pagina tramite plugin esterni) e una per definire il codice html della pagina quando andremo a visulizzare il singolo custom post type (non obbligatoria se non vorremo visualizzarli singolarmente)
Nel primo caso avremo bisogno di scrivere una wp_query (che vedremo dopo) mentre nel secondo di definire poco più che l’html, come abbiamo visto prima per il primo esempio di template di pagina (potremmo benissimo copiare ed incollare il codice di prima) con la sola differenza che qui il commento iniziale deve essere rimosso e a far capire a wp che tipo di file sia, è il nome stesso del file ovvero single-nome_del_custom_post_type.php.
Con questo identificativo wp saprà che ad esempio single-news.php sarà il template di pagina da usare quando verrà visualizzata la singola news.

 

ESERCIZI

  1. Creare 3 tipi di custom post type : news, eventi, recensioni, ognuno con una sua icona
  2. Creare un template di pagina per ogni custom post type ed associarlo a 3 relative pagine del sito (non avendo ancora il menù vedere gli avanzamenti usando la preview della pagina)
  3. Per le news un contenitore solo con le news, ognuna con data, titolo, immagine e testo
  4. Per gli eventi un contenitore con testo iniziale preso dalla pagina del backend, e lista degli eventi, ognuno con data e titolo
  5. Per le recensioni un contenitore con testo iniziale preso dalla pagina del backend, e lista delle recensioni oguna con data, titolo, e form dei commenti
  6. Creare un template per la visualizzazione del singolo post per ognuna delle 3 tipologie (personalizzare a piacere)
  7. Creare un menù, aggiungerlo nell'header, crearlo nel backend ed aggiungere le pagine create in precedenza. Creare un css per il menù e personalizzarlo