WordPress ci permette di creare nuovi tipi di post usando delle impostazioni personalizzate. Questi post vengono chiamati custom post types e rappresentano un'ottima alternativa alla classica tassonomia basata su post e pagine. In questo articolo vedremo come creare e gestire questo tipo di post.
Creare i custom post type
Vogliamo creare un nuovo tipo di post per gestire i libri che abbiamo letto di recente e che ci sono piaciuti di più. Per prima cosa dobbiamo registrare il nuovo tipo di post aggiungendo il seguente codice al file functions.php
:
add_action( 'init', 'create_post_type' );
function create_post_type() {
$args = array(
'labels' => post_type_labels( 'Libri' ),
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => true,
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title',
'editor',
'author',
'thumbnail',
'excerpt',
'comments'
)
);
register_post_type( 'libri', $args );
}
A questo punto il custom post type libri
è stato creato, ma mancano le etichette dei menu per gestirlo. Dobbiamo quindi definire queste etichette:
function post_type_labels($name) {
return array(
'name' => _x( $name, 'post type general name' ),
'singular_name' => _x( 'Libro', 'post type singular name' ),
'add_new' => __( 'Aggiungi nuovo' ),
'add_new_item' => __( 'Aggiungi nuovo libro'),
'edit_item' => __( 'Modifica libro'),
'new_item' => __( 'Nuovo libro' ),
'view_item' => __( 'Vedi libro' ),
'search_items' => __( 'Cerca'. $name ),
'not_found' => __( 'Nessun libro trovato'),
'not_found_in_trash' => __( 'Non ci sono ' . $name . ' libri nel Cestino' ),
'parent_item_colon' => ''
);
}
Ora dobbiamo fare in modo che il nome del nostro custom post type compaia quando si salva o si aggiorna un post:
add_filter('post_updated_messages', 'post_type_updated_messages');
function post_type_updated_messages( $messages ) {
global $post, $post_ID;
$messages['libri'] = array(
0 => '',
1 => sprintf( __('Libro aggiornato. <a href="%s">Vedi libro</a>'), esc_url( get_permalink($post_ID) ) ),
2 => __('Campo personalizzato aggiornato.'),
3 => __('Campo personalizzato eliminato.'),
4 => __('Libro aggiornato.'),
5 => isset($_GET['revision']) ? sprintf( __('Libro salvato dalla revisione da %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
6 => sprintf( __('Libro pubblicato. <a href="%s">Vedi libro</a>'), esc_url( get_permalink($post_ID) ) ),
7 => __('Libro salvato.'),
8 => sprintf( __('Libro inviato. <a target="_blank" href="%s">Anteprima libro</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
9 => sprintf( __('Libro programmato per: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Anteprima libro</a>'),
date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ),
10 => sprintf( __('Bozza del libro aggiornata. <a target="_blank" href="%s">Anteprima libro</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
);
return $messages;
}
Gestire i custom post type
Per impostazione predefinita i custom post type non vengono inclusi nel Loop di WordPress. Dobbiamo quindi creare un Loop personalizzato che comprenda anche questo nuovo tipo di post:
<?php
$args = array( 'post_type' => 'libri', 'posts_per_page' => 10 );
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
?>
<article class="libri" id="libro-<?php the_ID();?>">
<h2><a href="<?php the_permalink();?>"><?php the_title();?></a></h2>
<div class="content">
<?php the_content('Leggi il resto del libro'); ?>
</div>
</article>
<?php
endwhile;
?>
Per creare una pagina di archivio o il template di un singolo post, occorre seguire questa nomenclatura dei file nel nostro tema:
archive-{post-type}.php
single-{post-type}.php
Nel nostro caso diventa:
archive-libri.php
single-libri.php
Riferimenti
- Documentazione ufficiale di WordPress
- La funzione register_post_type()
- Custom Post Type UI, un plugin che vi permette di creare i custom post type con una comoda interfaccia grafica