Gestione dei Custom Post e dei Custom Fields in WordPress

Pubblicato da Davide, lunedì 1 ottobre 2012 Nessun Commento »

Sempre più temi e plugin WordPress utilizzano custom post types e custom fields. Al di là dell’informatichese, di cosa si tratta? Il modo più semplice per spiegarlo è attraverso un esempio. Immagina il sito di una band, con news e quant’altro.

Immagina che questa band voglia avere una sezione dove presenta i propri dischi, magari un widget sulla sidebar o una pagina dedicata. Servirà quindi un tipo di post personalizzato: non sono articoli semplici, non sono pagine. Sono dischi. E a questi dischi verranno associati anche una serie di campi personalizzati, come ad esempio l’anno di produzione, l’etichetta, i crediti per il missaggio. E poi, perchè no, anche il video di youtube, se questo esiste. Infine, questi dischi possono appartenere a due diverse categorie: album o singoli.

Si tratta insomma di un oggetto a parte, da usare nel pannello di amministrazione di wordpress, che poi apparirà come rappresentato nell’immagine sotto.

Per fare ciò, il punto centrale è il famoso file di template functions.php, vediamo quali sono le cose da fare.

Dovremo innanzi tutto dichiarare il nuovo tipo post, dicendo che questo nuovo oggetto sarà “catalogabile” con due tassonomie: i tag e le tipologie. I tag sono i conosciuti tag nativi di wordpress che vengono utilizzati anche nei normali post del blog, mentre le tipologie sono una nuova tassonomia custom, che andremo a definire in seguito, e ci servirà per contraddistinguere i singoli dagli album, o comunque per creare una sorta di categorie per i post di tipo disco. Partiamo quindi aggiungendo il codice qui sotto:

/*******************************
DISCHI
aggiunge un tipo post custom dal nome "disco"
che avrà un titolo, un contenuto esteso, un riassunto,
il riferimento all'autore e una immagine in evidenza,
oltre ad alcuni attributi custom
********************************/

add_action( 'init', 'register_cpt_disco' );
function register_cpt_disco() {
$labels = array(
'name' => _x( 'Dischi', 'disco' ),
'singular_name' => _x( 'Disco', 'disco' ),
'add_new' => _x( 'Aggiungi Nuovo', 'disco' ),
'add_new_item' => _x( 'Aggiungi Nuovo Disco', 'disco' ),
'edit_item' => _x( 'Modifica Disco', 'disco' ),
'new_item' => _x( 'Nuovo Disco', 'disco' ),
'view_item' => _x( 'Visualizza Disco', 'disco' ),
'search_items' => _x( 'Cerca Dischi', 'disco' ),
'not_found' => _x( 'Nessun disco trovato', 'disco' ),
'not_found_in_trash' => _x( 'Nessun disco trovato nel cestino', 'disco' ),
'parent_item_colon' => _x( 'Disco Padre:', 'disco' ),
'menu_name' => _x( 'Dischi', 'disco' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => false,
'description' => 'Dischi della Band',
//specifico quali proprietà avrà questo nuovo tipo di post
'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'custom-fields' ),
'taxonomies' => array( 'tipologie', 'post_tag' ),
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'has_archive' => true,
'query_var' => true,
'can_export' => true,
'rewrite' => true,
'capability_type' => 'post'
);
register_post_type( 'disco', $args );
}
/* aggiungo dei custom fields (year_completed, videoid, labelc,credits) al tipo post "disco"
il primo (year_completed) lo aggiungo come "year_completed-meta"
gli altri (videoid, labelc,credits) li aggiungo come "credits_meta" */
add_action("admin_init", "admin_init");
function admin_init(){
add_meta_box("year_completed-meta", "Year Completed", "year_completed", "disco", "side", "low");
add_meta_box("credits_meta", "Credits", "credits_meta", "disco", "normal", "low");
}
function year_completed(){
global $post;
$custom = get_post_custom($post->ID);
$year_completed = $custom["year_completed"][0];
?>
<label>Year:</label>
<input name="year_completed" value="<?php echo $year_completed; ?>" />
<?php }
function credits_meta() {
global $post;
$custom = get_post_custom($post->ID);
$videoid = $custom["videoid"][0];
$labelc = $custom["labelc"][0];
$credits = $custom["credits"][0]; ?>
<p><label>Youtube Video ID:</label><br />
<textarea cols="50" rows="5" name="videoid"><?php echo $videoid; ?></textarea></p>
<p><label>Label credits:</label><br />
<textarea cols="50" rows="5" name="labelc"><?php echo $labelc; ?></textarea></p>
<p><label>Mastering credits:</label><br />
<textarea cols="50" rows="5" name="credits"><?php echo $credits; ?></textarea></p>
<?php } ?>

Ora dobbiamo invece definire una nuova tassonomia per questo tipo di post, servirà quindi aggiungere anche il codice sottostante:

add_action( 'init', 'register_taxonomy_tipologie' );
function register_taxonomy_tipologie() {
$labels = array(
'name' => _x( 'Tipologie', 'tipologie' ),
'singular_name' => _x( 'Tipologia', 'tipologie' ),
'search_items' => _x( 'Cerca Tipologie', 'tipologie' ),
'popular_items' => _x( 'Tipologie Principali', 'tipologie' ),
'all_items' => _x( 'Tutte le Tipologie', 'tipologie' ),
'parent_item' => _x( 'Parent Tipologia', 'tipologie' ),
'parent_item_colon' => _x( 'Parent Tipologia:', 'tipologie' ),
'edit_item' => _x( 'Modifica Tipologia', 'tipologie' ),
'update_item' => _x( 'Aggiorna Tipologia', 'tipologie' ),
'add_new_item' => _x( 'Aggiungi nuova Tipologia', 'tipologie' ),
'new_item_name' => _x( 'Nuova Tipologia', 'tipologie' ),
'separate_items_with_commas' => _x( 'Separate tipologie with commas', 'tipologie' ),
'add_or_remove_items' => _x( 'Add or remove tipologie', 'tipologie' ),
'choose_from_most_used' => _x( 'Choose from the most used tipologie', 'tipologie' ),
'menu_name' => _x( 'Tipologie', 'tipologie' ),
);
$args = array(
'labels' => $labels,
'public' => true,
'show_in_nav_menus' => true,
'show_ui' => true,
'show_tagcloud' => false,
'hierarchical' => true,
'rewrite' => true,
'query_var' => true
);
register_taxonomy( 'tipologie', array('disco'), $args );
}
// al salvataggio dei post i valori dei custom fields devono essere memorizzati
add_action('save_post', 'save_details');
function save_details(){
global $post;
update_post_meta($post->ID, "year_completed", $_POST["year_completed"]);
update_post_meta($post->ID, "videoid", $_POST["videoid"]);
update_post_meta($post->ID, "labelc", $_POST["labelc"]);
update_post_meta($post->ID, "credits", $_POST["credits"]);
}

Si può scrivere questo codice a mano, oppure possono venirci in aiuto due comodissimi tool on line (entrambi di themergency):

A questo punto non resta che installare il nostro tema e popolare il sito di contenuti custom, che poi potranno essere utilizzati per creare layout specifici. Questo è un argomento che non viene trattato qui, ma giusto per dare un’imbeccata, basti pensare a come è possibile impostare la funzione query_posts() indicando di estrarre dei custom post types:


<?php
//prendo gli ultimi 16 dischi nella categoria album
query_posts('showposts=16&post_type="disco"&tipologie="album"');
?>

Per chi volesse approfondire il tema, ecco alcune utili risorse:

Nessun Commento »

Puoi lasciare un tuo commento, oppure fare un trackback dal tuo sito.

Vuoi essere il primo a lasciare un commento per questo articolo? Utilizza il modulo sotto..

Lascia il tuo commento

 

http://livregratis.fr/ - http://club-ebook.fr/