Post type è un termine utilizzato in riferimento a diversi tipi di contenuti in un sito. WordPress nasce come piattaforma per blog quindi il modello principale di contenuto è il post. Lo sviluppo di wordpress come cms più generico va di pari passo con l’introduzione di tipi di contenuti diversi basati tuttavia sulla stessa struttura di un post regolare.

I tipi di post presenti di default sono:

  • Articoli (post)
  • Pagine (pages)
  • Allegati (attachment)
  • Revisioni (revision)
  • Voci dei menu (nav-menu-item)

Attraverso la funzione register_post_type() è possibile aggiungere tipi di post personalizzati (custom post type) utili per la gestione di libri, annunci, citazioni ecc…

Struttura della tabella posts (wp_posts) di wordpress

I post type sono tipi di dati strutturati e salvati nella tabella posts del database di wordpress.

CampoTipo
IDbigint(20) unsigned
post_authorbigint(20) unsigned
post_datedatetime
post_date_gmtdatetime
post_contentlongtext
post_titletext
post_excerpttext
post_statusvarchar(20)
comment_statusvarchar(20)
ping_statusvarchar(20)
post_passwordvarchar(20)
post_namevarchar(200)
to_pingtext
pingedtext
post_modifieddatetime
post_modified_gmtdatetime
post_content_filteredlongtext
post_parentbigint(20) unsigned
guidvarchar(255)
menu_orderint(11)
post_typevarchar(20)
post_mime_typevarchar(100)
comment_countbigint(20)

Accedere alle informazioni dei post in un template (query principale)

In fase di realizzazione di un tema ci troviamo spesso di fronte alla necessità di ricavare informazioni associate al post o alla collezione dei post della pagina corrente.

Nella variabile globale $posts avremo a disposizione un post o una collezione di post di un certo tipo.

global $posts;
print_r( $posts );
            [ID] => 387
            [post_author] => 1
            [post_date] => 2014-05-28 11:59:48
            [post_date_gmt] => 2014-05-28 09:59:48
            [post_content] => Contenuto del post, immagini comprese
            [post_title] => Post type
            [post_excerpt] => Il riassunto
            [post_status] => publish
            [comment_status] => closed
            [ping_status] => open
            [post_password] =>
            [post_name] => nome-del-post
            [to_ping] =>
            [pinged] =>
            [post_modified] => 2014-06-06 11:07:41
            [post_modified_gmt] => 2014-06-06 09:07:41
            [post_content_filtered] =>
            [post_parent] => 0
            [guid] => http://instileweb.com/?post_type=glossario&p=387
            [menu_order] => 0
            [post_type] => glossario
            [post_mime_type] =>
            [comment_count] => 0
            [filter] => raw
global $posts;

foreach( $posts as $post )
{
	echo $post->post_title . '<br />';
}

Creazione di un nuovo post type

Esempio basilare per la creazione di un tipo di post personalizzato.

La funzione isw_create_post_type() deve essere registrata in un action hook prima di admin_menu e dopo after_setup_theme (nell’esempio viene utilizzato init)

function isw_create_post_type()
{
  $labels = array(
          'name' => __( 'Recensioni' ),
          'singular_name' => __( 'Recensione' )
          );

  $args = array(
      'labels' => $labels,
      'public' => true,
      'has_archive' => true,
    );
  register_post_type( 'isw_recensione', $args  );
}
add_action( 'init', 'isw_create_post_type' );

aggiunta-tipo-di-post

La funzione register_post_type() riceve alcuni parametri principali:
$label che determina il nome singolare e plurale del post type e 'public' che determina se il post type è presente nelle pagine di amministrazione e i suoi contenuti disponibile alla visualizzazione nel sito.

Il nome del post type (isw_recensione) è utilizzato come slug per la struttura degli url. Il testo può essere cambiato inserendo in $args:

'rewrite' => array('slug' => 'recensioni'),

Per stabilire quali campi saranno visibili nell’editor delle recensioni cambiamo i campi elencati in ‘supports’, eliminando quelli che non ci interessano

'supports'      => array( 'title', 'editor', 'author', 'thumbnail' , 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'page-attributes', 'post-formats' ),

Un elenco completo di tutti i parametri è disponibile nel codex di wordpress.

I Template files per i custom post

Sono utilizzati i seguenti file
archive-{post_type}.php
single-{post_type}.php

Quindi tornando all’esempio precedente l’lelenco delle recensioni sarà generato da
archive-isw_recensione.php mentre il file della singola recensione da single-isw_recensione.php

Tag condizionali: verificare un custom post

Se vogliamo stabilire se la pagina corrente è un archivio di un custom post useremo

is_post_type_archive( 'isw_recensione' )

Per le singole recensioni useremo

is_singular( 'isw_recensione' )

  inStileWeb.com