Utilizzare i custom post type di WordPress

In questo tutorial tratteremo un argomento molto gettonato nell’universo WordPress: i custom post type. Di che cosa si tratta? Letteralmente significa “tipi di post personalizzati“, ma questa traduzione non ci serve più di tanto e quindi andiamo un pochino più sul tecnico.

Tutti i contenuti che inseriamo su WordPress sono salvati nella tabella wp_posts del database. Non importa che si tratti di un post, una pagina, un allegato o una voce di menu. Per il CMS sono tutti posts.

WordPress riesce a distinguerli e mostrarli dove dovuto attraverso una colonna nella tabella wp_posts, chiamata appunto post_type. Per impostazione predefinita sono disponibili i seguenti tipi di post:

  • post
  • pagina
  • allegato
  • revisione
  • bozza
  • voce di menu
  • css personalizzato
  • changset

I custom post type sono post personalizzati che possiamo aggiungere a questi già esistenti. E perché si avrebbe bisogno di aggiungere una nuova tipologia di contenuto? I motivi possono essere i più disparati e non avrebbe senso stare qui a elencare tutti quelli che mi vengono in mente. Vi riporto solo una situazione a cui sto lavorando in questi giorni. Abbiamo un sito relativo al benessere, dove vengono trattati argomenti che riguardano la salute delle persone. In questo blog ci sono naturalmente gli articoli (post), categorie e altre tipologie di tassonomia. Vogliamo introdurre una nuova tipologia di contenuto: le ricette. Ho ritenuto che inserire un custom post type fosse la soluzione migliore, trattandosi di argomenti di complemento (rispetto al topic principale). Faremo un esempio su questa falsa riga, in modo da mostrare delle ricette inerenti all’alimento che stiamo consultando.

Ma per mettere in relazione post e custom post type abbiamo bisogno anche di una tassonomia di raccordo che chiameremo “ingredienti”. Se ad esempio visualizziamo un articolo informativo sui benefici del pomodoro, possiamo mostrare a fine post tutte le ricette che come “ingrediente” utilizzano questo prezioso ortaggio. Spero di essere stato abbastanza esaustivo con le spiegazioni…. se così non fosse portate pazienza, vediamo tutti i passaggi da compiere e alla fine riusciremo a mettere insieme i pezzi.

Registrare un custom post type

La prima operazione da fare è registrare il nuovo custom post type. Per riuscire in questa operazione dobbiamo utilizzare la funzione specifica register_post_type. Vi rimando alla documentazione ufficiale del Codex per conoscere tutti i parametri accettati dalla funzione. Io ho implementato un esempio base che ci permette di scrivere le nostre ricette e associare un’immagine di anteprima.

add_action('init', 'create_post_type');

function create_post_type()
{
 register_post_type('recipes', array(
  'labels' => array(
   'name' => __('Recipes', 'text-domain') ,
   'singular_name' => __('Recipe', 'text-domain')
  ) ,
  'public' => true,
  'has_archive' => true,
  'rewrite' => array(
   'slug' => 'ricette',
   'with_front' => false
  ) ,
  'supports' => array(
   'title',
   'editor',
   'author',
   'thumbnail',
   'excerpt',
   'trackbacks',
   'custom-fields',
   'comments',
   'revisions',
   'sticky'
  )
 ));
}

Facciamo un salto nel pannello di amministrazione dove sarà disponibile la nuova funzionalità. Come già detto i custom_post_type si comportano come qualsiasi altro tipo di posts, per tanto dovrete andare su Aggiungi nuovo, dare un titolo alla ricetta, scrivere il testo, aggiungere l’immagine di anteprima e una volta finito, cliccare sul pulsante Pubblica.

Esempio custom post type

C’è solo un piccolo aggiornamento da tenere in considerazione. Per visualizzare nel front-end il nuovo contenuto, dobbiamo prima aggiornare le regole di riscrittura indirizzo della classe WP Rewrite. Basterà semplicemente andare in ImpostazioniPermalink e cliccare sul pulsante Salva le modifiche.

Registrare una nuova tassonomia

Secondo step, registriamo una nuova tassonomia “Ingredienti” che ci servirà per mettere in relazione il custom post type con gli articoli del nostro blog.

La funzione da utilizzare è register taxonomy e anche qui vi rimando alla documentazione ufficiale del Codex. Facciamo solamente attenzione al secondo parametro che corrisponde al tipo di oggetto (quindi al tipo di post) a cui associare la nuova tassonomia. Il parametro accetta sia una stringa che un array. Visto che la tassonomia ci serve disponibile per ricette e posts, dobbiamo usare un array.

add_action('init', 'create_recipes_tax');

function create_recipes_tax()
{
 register_taxonomy('ingredients', array(
  'post',
  'recipes'
 ) , array(
  'label' => __('Ingredients ') ,
  'rewrite' => array(
   'slug' => 'ingredients'
  ) ,
  'hierarchical' => true,
 ));
}

Gerarchia del template

Siamo già a buon punto, ma prima di andare avanti dobbiamo preoccuparci della visualizzazione nel tema. Secondo la logica gerarchica di WordPress, i custom post type vengono visualizzati attraverso il file single.php.

Possiamo visualizzare i nuovi contenuti in un file apposito, avanzando nella relazione gerarchica con la creazione del file single-[post-type].php, in questo caso single-recipes.php.

Per quanto riguarda le tassonomie personalizzate, queste vengono visualizzate a partire dal file archive.php ma anche qui possiamo sovrascrivere la gerarchia, creando il file archive-[custom-taxonomy].php

Mostrare i custom post type correlati

Non ci resta che creare la funzione personalizzata che visualizzerà le ricette alla fine dell’articolo informativo e ricette correlate nel file single-recipes.php.

Utilizzeremo la stessa logica che abbiamo usato per mostrare i post correlati a fine articolo, ma in questo caso aggiungeremo un parametro alla query, specificando che l’estrazione deve essere eseguita solo nelle ricette. Inoltre la ricerca va fatta (eventualmente) nelle tassonomie “ingredienti”. Mi sono un po’ sbattuto con questo parametro, perché il parametro tax_query deve essere un array all’interno di un array….

function show_related($limit = 4)
{
 global $post;
 $args = array(
  'post__not_in' => array(
   $post->ID
  ) ,
  'post_type' => 'recipes',
  'showposts' => $limit
 );
 $custom_taxs = wp_get_post_terms($post->ID, 'ingredients');
 if (empty($custom_taxs) && is_singular('post')) return;
 else {
  $custom_tax = array();
  foreach($custom_taxs as $c_t) {
   $custom_tax[] = $c_t->slug;
  }

  $args['tax_query'] = array(
   array(
    'taxonomy' => 'ingredients',
    'terms' => $custom_tax,
    'field' => 'slug',
   )
  );
 }
 $posts = get_posts($args);
 $block = '';
 if ($posts):
  $block.= '<section class="related-posts">';
  foreach($posts as $p) {
   $block.= '<div class="related-post">
              <div class="related-thumb">' . get_the_post_thumbnail($p->ID, 'thumb') . '<div>' . 
              '<h3><a href="' . get_permalink($p->ID) . '">' . $p->post_title . '</a></h3>
             </div>';
  }

  $block.= '</section>';
 endif;
 return $block;
}

Con questa funzione controlliamo l’eventuale presenza della tassonomia personalizzata “ingredienti” associata al post corrente, sia che si tratti di un post o di una ricetta. Se siamo all’interno di un post e non ci sono riscontri, blocchiamo la funzione. Se invece siamo all’interno di una ricetta o c’è un riscontro sulla tassonomia, si prosegue.

Fate attenzione, come detto, alla chiave tax_query, dopodiché il codice dovrebbe risultarvi familiare.

Lascia un commento

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