Infocurci - programmatore Php Roma
Infocurci - programmatore Php Roma
"faster than 98% of all tested websites" (tools.pingdom.com) - 100/100 Google PageSpeed Insights - Benvenuti :)

Cms / framework : I custom post di Wordpress

Nato come blog, Wordpress da tempo ha aggiunto la possibilità di aggiungere nuovi tipi di dati, diversi da quelli dei post degli articoli. In questo modo diventa possibile far di tutto! Vediamo oggi come creare il nostro "custom post type" e usarlo con facilità.

Cms / framework

Il grosso limite delle prime versioni di Wordpress... non era un limite. Nato come ottimo strumento di gestione dei blog, il software non riusciva ovviamente a soddisfare esigenze che venivano richieste da alcuni utenti, come quella di usarlo come un cms evoluto o addirittura un ecommerce. Il grosso limite era che wordpress ragionava da blog, quindi nel database tutto era post, commenti, tag.
Dalla versione 3 sono stati introdotti i tipi di post personalizzati, svincolati cosi dalle logiche del blog, con i quali è possibile usare il "motore" del cms per creare estensioni molto raffinate. Vediamo un semplice esempio con il quale gestiamo uno schedario di piloti di Formula 1.

Creiamo dentro la cartella wp-content/plugins una directory, chiamata ad esempio "infocurci_formula1" e inseriamo dentro un file "infocurci_formula1.php" questo codice:
<?php
/*
Plugin Name: Formula 1 Statics drivers
Plugin URI: http://www.infocurci.com
Description: Set/get a list of driver records in the FIA World Championships
Version: 0.1
Author: Curci, Claudio
Author URI: http.//www.infocurci.com
*/

/* Set up the post types */
add_action('init','infocurci_formula1_collection_register_post_types');

/* Registers post types */
function infocurci_formula1_collection_register_post_types()
{
    $f1_args = array('public'=>true,'query_var'=>'f1_driver','rewrite'=>array('slug'=>'f1-driver','with_front'=>false),'supports'=>array('title','editor','thumbnail'),'labels'=>array('name'=>'Piloti','singular_name'=>'Pilota','add_new'=>'Aggiungi nuovo pilota','add_new_item'=>'Aggiungi nuovo pilota','edit_item'=>'Modifica pilota','new_item'=>'Nuovo pilota','view_item'=>'Dettaglio pilota','search_items'=>'Cerca pilota','not_found'=>'Nessun pilota trovato','not_found_in_trahs'=>'Nessun pilota trovato nel cestino'),'taxonomies'=>array('post_tag'));
    register_post_type('f1_driver',$f1_args);
}

Questo codice si occupa di creare, appunto con la funzione register_post_type, un nuovo tipo di post chiamato "f1_driver".
La funzione accetta due parametri: il nome del nuovo tipo di post, e un array di argomenti:

  • public indica se i post di questo tipo saranno "pubblici" (ovvero non esclusi dalla ricerca, visibili nel  menu, estraibili dalle query). Di solito questo valore va lasciato su public, anche perchè può esser ulteriormente personalizzato con parametri che vedremo fra poco;
  • query_var è il nome che useremo poi nell'oggetto WP Query per estrarre agevolmente tutti i contenuti di tipo "f1_driver"
  • rewrite è un array contenente le informazioni per gestire l'url rewrite
  • supports è un array nel quale specifichiamo quali campi di wordpress vogliamo usare (a volte ad esempio non si ha esigenza di gestire le thumbs o un testo esteso);
  • labels è un array forse un pò spartano ma molto utile con il quale possiamo personalizzare tutte le etichette del backend: come vedremo tra poco, infatti, ogni custom type ha un proprio menù di gestione
  • taxomies è un array con il quale indicare quali tipi di taxonomies predefiniti usare per classificare (con categorie o tag) i custom post.


Tutto qui! Apriamo il pannello di amministrazione, attiviamo il plugin:

e scopriamo che a destra è nato un menu tutto nostro!


Inseriamo un pilota, anzi IL pilota ... 

Bene, andiamo sul frontend: non è cambiato nulla. E' proprio questo che volevamo: se abbiamo creato un custom type significa che non vogliamo che questi post "si mischino" con gli altri, finiscano nell'elenco degli ultimi post pubblicati e via dicendo. Come fare però ora per creare una pagina che elenchi tutti i piloti inseriti?
Creiamo all'interno della cartella del nostro template un file chiamato f1.php e dentro mettiamo questo codice:
<?php
/*
Template Name: Elenco piloti
*/

get_header();

$loop = new WP_Query(
    array(
        'post_type'=>'f1_driver',
        'orderby' =>'title',
        'order'=>'ASC',
        'post_per_page'=>5
        )
    );
    if($loop->have_posts()){
        ?>
        <ul>
            <?php
                while($loop->have_posts()){
                    $loop->the_post();
                    ?>
                    <li>
                        <a href="<?php echo get_permalink();?>"><?php echo get_the_title();?></a>
                    </li>
                    <?php
                   
                }
            ?>
        </ul>
        <?php
    }
get_sidebar();
get_footer(); ?>

Template molto semplice: creiamo un oggetto WP_Query andando ad estrarre tutti i nostri piloti (post_type "f1_driver") ed usiamo il classico while di wordpress per estrarre link e titolo di ciascun post.

Creiamo ora in amministrazione una nuova pagina, vuota ma associata al template dei piloti (in basso a destra, sezione "modello", scegliamo "Elenco piloti", ovvero il template che abbiamo appena creato).


Aggiungiamo il link al nostro menu ed ecco qui la pagina dei piloti, con tanto di url rewrite già attivo: