Il successo di WordPress, come strumento per realizzare Blog ma, soprattutto, come generico CMS per risolvere un qualsiasi portale/sito web, è dovuto essenzialmente alla sua semplicità, alla struttura lineare, alle numerosi funzioni che mette a disposizione sia al programmatore esperto che al semplice utilizzatore. Più semplicemente:
- Basato su tecnologia LAMP (Linux, Apache, MySQL, PHP)
- Vasta disponibilità di Temi (layout) grafici semplici e personalizzabili
- Vasta, vastissima, libreria di plugins gratuiti semplici da installare e realizzare
- Modello di sviluppo lineare PHP; nelle ultime versioni si manifesta un’allineamento alle più recenti versioni del PHP, e quindi uno sviluppo più orientato agli oggetti
- Ottimo come CMS generico
Lasciatemi ora esaminare, con una carrellata di consigli e qualche tips, due dei pilastri di questo prodotto giunto alla versione 3.1: Temi & Plugins.
5 cose sui Temi
1. Cos’è un tema?
Un tema si presenta fisicamente come un insieme di file posizionati all’interno di una cartella, a sua volta posizionata nel percorso:
1 | /wp-content/themes |
WordPress si aspetta di trovare “almeno” un determinato tipo di file all’interno della cartella del tema, come:
1 2 3 4 | /wp-content/themes/
-> miotema/ --> styles.css --> index.php |
Come accade per i plugin, WordPress ricerca delle particolati intestazioni poste nei commenti per individuare i file che gli servono. Nel caso dei temi, ad esempio, è sufficiente inserire un commento di questo tipo all’inizio del nostro file .css:
1 2 3 4 5 6 7 8 9 10 11 | /** Theme Name: 3.0 Theme URI: http://www.saidmade.com/ Description: The default saidmade.com theme Version: 3.0 Author: Giovambattista Fazioli <g.fazioli@saidmade.com> Author URI: http://www.saidmade.com/ (C)2011 Saidmade Srl */ |
Questo particolare commento fornisce a WordPress tutte le informazioni necessarie e sufficienti a caricare – lato backend – il tema e a segnalarlo come disponibile all’uso. Come è facile intuire, il tema – nell’architettura WordPress – riveste un’importanza fondamentale. Esso, infatti, determina quali contenuti saranno visualizzati e come! Ne deriva che esso rappresenta il cuore del sistema, non solo lato utente (front-end) ma anche e sopratutto lato amministrazione. Come accenneremo più avanti, il tema non si riflette solo nell’aspetto che avrà il nostro sito web, ma può aggiungere o modificare funzionalità anche lato backend.
2. come realizzare un tema
Realizzare un tema per WordPress non è una procedura complicata. Si può partire analizzando e/o modificando i temi di esempio forniti nell’installazione. Tuttavia, come accade in altri contesti, è possibile creare temi semplici e temi complessi. Un tema può essere più o meno articolato in base a vari fattori, che possono essere: grafica e layout, presenza di animazioni Javascript particolari, effetti in risposta ad input utente, complessità nelle funzioni di reperimento delle informazioni, pesanti alterazioni del backend, etc…
Questa è proprio una caratteristica di WordPress; permettere cioè più gradi di complessità, cosa che si riflette sulla quasi totalità delle funzioni del sistema, esattamente come accade con i plugin.
In linea di massima, tuttavia, per realizzare tema quantomeno decoroso, bisogna possedere le seguenti caratteristiche:
- Un minimo di gusto grafico ed estetico
- Capacità di utilizzare strumenti come Adobe Photoshop, lavorandoci tuttavia in modo diverso da quello che farebbe un grafico, ma tenendo presente che ciò che stiamo “disegnando” dovrà diventare una pagina HTML/CSS
- Conoscenza – medio/alta – di HTLM e CSS
- Conoscenza – medio/alta di PHP
- Infine, conoscere la struttura e le funzioni messe a disposizione da WordPress
Vediamo adesso i quattro step principali che si seguono per realizzare un tema:
- Content Design
- Prototipo grafico
- Scrittura codice (PHP/HTML) per visualizzare i contenuti
- Taglio della grafica e scrittura CSS
Content Design
Primi di iniziare si dovrebbe sempre partire da uno schema che indica che tipo di contenuti – e come – il nostro tema dovrà visualizzare:

Il Content Design viene spesso sottovalutato, generando prima o poi problemi e perdite di tempo. Quando non viene fornito dal cliente, sarebbe bene farselo per conto proprio, anche perché è davvero difficile pensare ad una veste grafica senza conoscere cosa vestire. Il Content Design, come mostrato in figura, ci fornisce moltissime informazioni su come dovrà essere il nostro sito web. Inoltre permette di realizzare un grafica puntuale, eliminando subito proposte o idee non coerenti con il wire-frame; come barre di navigazioni verticali o logo a tutto schermo. Ogni sezione del sito, quindi, dovrebbe essere schematizzata in questo modo; dalla home alle pagine interne.
Inoltre è ovvio che un documento come il Content Design ha soprattutto un’utilità commerciale, permettendo di stabilire con maggior precisione le tempistiche di realizzazione e quindi fornire informazioni precise per preventivi e occupazione risorse.
Prototipo grafico
Con il nostro documento di Content Design – approvato – possiamo passare alla realizzazione grafica di un prototipo, la messa in opera della nostra idea. La prima stesura, normalmente, rappresenta un’idea di quello che sarà il risultato finale, non preoccupandosi necessariamente della fase di taglio-grafico e trasformazione in HTML/CSS. L’esperienza, con il tempo, porterà sicuramente ad unire le due fasi.

Scrittura codice (PHP/HTML) per visualizzare i contenuti
Approvato il prototipo grafico, si passa alla stesura del codice HTML e PHP che, di fatto, genera i contenuti del sito web. In questa fase non stiamo implementado ancora la grafica, la teniamo solo a mente quando scriviamo il codice HTML che si collegherà poi agli stili CSS. Man mano che scriviamo il codice, terremo aperto il browser per controllare e verificare il progresso del nostro lavoro.

Si predispongono gli elementi HTML che serviranno da contenitori per i contenuti indicati nel Content Design. Una buona IDE, in questa fase, è vivamente consigliata. In particolare un IDE in grado di trattare PHP/HTML e CSS – giusto per non utilizzare tre applicazioni differenti: per i più bravi va bene anche VI o Blocco Note. A questo stadio dei lavori il nostro tema è al 50% e il sito web avrà un’aspetto simile a questo:

Avremmo cioè reso reale e funzionante il Content Design. Questa fase, che discuteremo anche più avanti, è la parte più delicata di tutta la procedura, in quanto richiede la corretta scrittura del codice HTML – che verrà vestito poi tramite i fogli di stile CSS – e la stesura del codice PHP necessario a risolvere le eventuali esigenze del caso (insieme ovviamente all’uso di plugin). Le funzioni PHP – che come vedremo dopo vengono inserite in un file specifico – potranno interagire anche con il backend.
Taglio della grafica + CSS
Finalmente possiamo tagliare la grafica realizzata in Photoshop (o altro), creandoci tutti i file immagini necessari alla composizione. Contestualmente si definiscono i fogli stile:

Come fatto nella fase precedente, man mano che scriviamo il codice CSS terremo un browser (anzi, più correttamente i browser: Safari, FireFox, Chrome, etc…) aperto per verificare che tutto proceda correttamente:

3. Cosa visualizzare
WordPress permette sostanzialmente di collezionare contenuti testuali (POST, PAGE, …) e multimediali (immagini, video, documenti PDF, …). Questi contenuti (descritti nel Content Design) possono essere estratti in vari modi: tramite le funzioni – il tema – standard di WordPress, tramite l’uso di Plugin, scrivendo proprie funzioni. Ogni file nel tema di WordPress svolge una funzione particolare e viene automaticamente richiamato da WordPress in determinate circostanze. I file più importanti di un tema (che può essere composto anche da numerosi file) sono:
1 2 3 4 5 6 7 8 9 10 11 12 | /wp-content/themes/
-> miotema/ --> archive.php --> comments.php --> footer.php --> functions.php --> header.php --> index.php --> page.php --> sidebar.php --> single.php --> style.css |
In linea di massima potremmo affermare che tutti i file elencati, tranne l’ultimo style.css, determinano il cosa verrà visualizzato, mentre style.css il come. index.php, ad esempio, è il file principale, quello che corrisponde alla Home Page. header.php e footer.php contengono il codice HTML e PHP utilizzato rispettivamente nell’header e nel footer. Questa tecnica permette alle altre pagine di occuparsi esclusivamente del contenuto che cambia, normalmente la parte centrale. A livello logico tutte le pagine di un tema possono essere ricondotte a questo schema:
1 2 3 4 5 6 7 | <?php get_header(); ?> <div id="content"> ... </div> <?php get_footer(); ?> |
WordPress permette varianti e semplificazioni relative al naming dei file del tema. Ad esempio il file archive.php è quello che si occupa della visualizzazione degli archivi, cioè la lista dei contenuti (post) per categoria, tag, data, etc… Capita spesso, sopratutto in siti web che non sono necessariamente dei blog, di diver trattare la visualizzazione di una categoria diversamente da un’altra. In prima analisi verrebbe immediatamente spontane inserire una condizione all’interno del file archive.php del tipo:
1 2 3 4 5 | if( is_category('news') ) { // Visualizzazione per le News } else { // Altre visualizzazioni } |
Nonostante sia corretto, WordPress fornisce una più semplice ed elegante soluzione: basta creare un file composto da category- lo slug (abbreviazione) della nostra categoria, tipo: category-news.php. Questa caratteristica può essere utilizzata anche per le pagine e le sidebar, ma non per i post. Per le sidebar si nomina un file con una notazione simile a quella utilizzata per le categorie, tipo sidebar-footer.php, ma si usa una funzione per discriminare le varie sidebar:
1 2 3 4 5 | // Carica la sidebar standard: il file sidebar.php get_sidebar(); // Carica la side del file sidebar-footer.php get_sidebar( 'footer' ); |
Uno dei file più potenti e utili, presente nei temi, è functions.php. Questo contiene di solito tutte le funzioni PHP che possono essere richiamate all’interno di uno qualsiasi dei file del tema. In questo file, poi, possono essere eseguite funzioni tali da aggiungere o modificare funzioni presenti nel backend!
Tutte le funzioni inserite in questo file saranno disponibili esattamente come un qualsiasi altra funzione WordPress. Un qualsiasi file del tema, come single.php ad esempio, potrà accedere a queste funzionalità.
4. Snippet
1 | <body <?php body_class(); ?>> |
Il codice qui qui sopra va inserito nel file header.php e permette di associare automaticamente al tag body una o più classi in base alla sezione di WordPress visualizzata, come ad esempio: <body class="home blog logged-in">. In questo modo possiamo “comunicare” al foglio di stile come comportarsi quando il tag body possiede una di quelle classi. Nell’esempio di sopra al tag body sono associate tre classi che indicano rispettivamente: siamo nella Home Page, categoria blog, utente “loggato”.
È possibile anche aggiungere proprie classi in base a determinate circostanze, passandole come parametro della funzione body_class() o utilizzando i filtri:
1 2 3 4 5 6 7 8 9 10 | function customBodyClass( $classes ){ if( // condizione ) { $customClass = "myparam"; } else { $customClass = "anotherparam"; } array_push($classes, $myvar); return $classes; } add_filter('body_class', 'customBodyClass'); |
Vi propongo una carrellata di utili snippet da utilizzare prontamente nel vostro tema! Snippet da inserire nel file functions.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /** * Carica l'ultima versione di jQuery nel Front-end * * @return void */ if (!is_admin()) { wp_deregister_script('jquery'); wp_register_script('jquery', ("http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"), false); wp_enqueue_script('jquery'); wp_register_script('jquery-color', ( get_bloginfo('template_url') . "/js/jquery.color.js"), false); wp_enqueue_script('jquery-color'); wp_register_script('jquery-tools', ("http://cdn.jquerytools.org/1.2.3/full/jquery.tools.min.js"), false); wp_enqueue_script('jquery-tools'); } |
1 2 3 4 | // Recuperare un campo personalizzato global $wp_query; $postid = $wp_query->post->ID; echo get_post_meta($postid, 'customField', true); |
1 2 3 4 5 6 7 8 | /** * Restituisce il contenuto di una pagina, sia essa pubblica * che privata */ function pageBySlug($slug) { $objectPost = get_page_by_path($slug); return apply_filters("the_content", $objectPost->post_content); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /** * Mostra il titolo degli ultimi n post di una categoria * * @param $categoryName Slug della categoria * @param $limit Numero massimo di elementi * @return html */ function postsFromCategory($categoryName = 'news', $limit = 10) { global $post; $items = new WP_Query('category_name=' . $categoryName . '&showposts=' . $limit); while ($items->have_posts()) : $items->the_post(); ?> <li> <a title="<?php the_title() ?>" href="<?php echo get_permalink() ?>"> <span><?php the_title() ?></span> </a> </li> <?php endwhile; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /** Sostituisce automaticamente alcune parole nel contenuto di un Post/Pagina */ function replaceContent($content){ $replace = array( 'Saidmade' => '<a href="http://www.saidmade.com">Saidmade</a>', 'Google' => '<a href="http://www.google.com">Google</a>', 'Apple' => '<strong>Apple, Inc</strong>' ); $content = str_replace(array_keys($replace), $replace, $content); return $content; } add_filter('the_content', 'replaceContent'); add_filter('the_excerpt', 'replaceContent'); |
1 2 3 4 5 6 7 8 9 10 | /** * Personalizza il titolo del MetaBox delle miniature * * @return void */ function customThumbnailMetaBox() { remove_meta_box( 'postimagediv', 'post', 'side' ); add_meta_box('postimagediv', 'Scegli la miniatura usata per vari scopi', 'post_thumbnail_meta_box', 'post', 'side', 'low'); } add_action('do_meta_boxes', 'customThumbnailMetaBox'); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /** * Modifica l'editor (in modalità HTML) nel backend */ function add_style_header() { ?> <style type="text/css"> #editorcontainer #content { font-family:Monaco, "Courier New", Courier, monospace; background: #fafafa; color: #222; font-size:15px; } </style> <?php } if( is_admin() ) { add_action('admin_head', "add_style_header" ); } |
1 2 3 4 5 6 7 8 9 10 11 | // variante di sopra function customEditorFont() { echo "<style type='text/css'> #editorcontainer textarea#content { font-family: Monaco, Consolas, \"Andale Mono\", \"Dejavu Sans Mono\", monospace; font-size:14px; color:#333; } </style>"; } add_action("admin_print_styles", "customEditorFont"); |
5. Il tema e il backend
Come anticipato WordPress permette di personalizzare il backend, sia tramite l’uso di plugin sia direttamente dal tema. Ad esempio è possibile fornire nel backend la possibilità di modificare l’immagine nell’header:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | <?php /* * Gestione Aspetto logo * * @author =undo= * @version 1.0 * @copyright Saidmade srl * */ define( 'HEADER_IMAGE', get_stylesheet_directory_uri() . '/images/logo.jpg' ); define( 'HEADER_IMAGE_WIDTH', 990 ); define( 'HEADER_IMAGE_HEIGHT', 142 ); define( 'NO_HEADER_TEXT', true ); class CThemeOptions { /** * Nome del tema per esteso */ var $theme_name = "Nome del tema"; /** * Identificativo */ var $short_theme_name = "mioID"; /** * Create new control panel function and defines administration menu, * and head you do not need to modify anything in this part */ function CEELST_THEME_OPTIONS() { /** * Frontend e Backend Hook */ add_custom_image_header( array(&$this,'theme_header_style'), array(&$this,'theme_admin_header_style') ); } // Front end function theme_header_style() { ?> <style type="text/css"> div#header h1 a { background-image: url(<?php header_image() ?>) !important; } </style> <?php } // Backend function theme_admin_header_style() { ?> <style type="text/css"> #headimg { display: block; width: 990px; height: 142px; background-image: url(<?php header_image() ?>) !important; border: 1px solid #aaa; margin-bottom:12px; } #headimg h1, #headimg #desc { display:none; } </style> <?php } } ?> |
Altra importantissima funzionalità è quella di presentare in modo più “usabile” i campi personalizzati all’utente che opera l’inserimento di un post. Questa è un’altro punto a favore di WordPress, cioè la possibilità di alterare la maschera di inserimento di un post/pagina, rendendo il backend estremamente più semplice da utilizzare per il cliente. Normalmente nel backend i campi personalizzati si presentano come:

Questo maschera, per quanto funzionale, non è certo l’ideale per un cliente. Meglio sarebbe avere una maschera propria, con proprie label e controlli sui campi. Ad esempio nel backend del nostro sito abbiamo aggiunto una maschera quando l’inserimento riguarda un prodotto:

Come risulta evidente questa soluzione è sicuramente migliore, più usabile e chiara. Per implementarla non è necessario l’uso di plugin ma basta inserire poche righe di codice nel nostro file functions.php sfruttando la funzione add_meta_box() ben documentata qui.
5 cose sui Plugin
1. quando scrivere un plugin
In base a quello che abbiamo visto nella sezione precedente, risulta evidente che spesso si abusa l’uso e la scrittura di plugin. Non sempre è necessario scrivere o utilizzare un plugin, perché alcune funzionalità possono essere inserite direttamente nel file functions.php, con il vantaggio di essere legate al tema, pesare meno al sistema, non poter essere disabilitate.
Un plugin conviene scriverlo quando riteniamo svolga una funzione generica, non legata all’esigenza contestuale. A differenza poi delle funzioni inserite manualmente nel tema, un plugin permette di essere condiviso, aggiornato e installato in qualsiasi contesto. Tutto questo ha un prezzo nelle performace del sistema; aggiungere 30 plugin non è certo salutare.
2. le funzioni più importanti
Le funzioni più potenti presenti in WordPress, che permettono spesso di risolvere problematiche apparentemente complesse sono le “poco documentate” add_filter() e add_action(). Per questione storiche – legate anche a vari snippet che si trovano in rete – le segnalo entrambe anche se add_action() non fa altro che chiamare add_filter()! Queste gestiscono un sistema davvero ingegnoso che permette al programmatore di alterare il normale comportamento delle funzioni di sistema. Le abbiamo già incontrate negli snippet presentati sopra, ma vediamo nel dettaglio come funzionano e come usarle.
Un esempio chiarificatore può essere:
1 2 3 4 5 6 7 8 | function logoCustom() { echo '<style type="text/css"> #header-logo { background-image: url(' . get_bloginfo('template_directory') . '/images/logo.png) !important; } </style>'; } add_action('admin_head', 'logoCustom'); |
In questo esempio abbiamo aggiunto una nostra funzione quando WordPress si prepara ad emettere l’output dell’header nell’amministrazione. Il primo parametro indica a quale azione (o filtro) vogliamo collegarci. Il secondo è il nome della nostra funzione da eseguire. Di filtri (e o azioni) ne esistono tanti, alcuni documentati altri no:
Con le ultime versioni di WordPress, a livello di sistema, azioni e filtri sono la stessa cosa. Tuttavia concettualmente vengono (a ragione) distinti. Una action è appunto un’azione, tipo:
1 2 3 4 5 6 | // Runs when a post or page is about to be deleted. // Action function arguments: post or page ID. function didDeletePost( $pID ) { // Un post è stato eliminato, $pID indica l'ID } add_action('delete_post', 'didDeletePost'); |
I filtri, a differenza, vengono usati ad esempio per alterare l’output o il comportamento di alcune funzioni:
1 2 3 4 5 6 7 8 9 10 11 | function modernContactInfo($contactmethods) { unset($contactmethods['aim']); unset($contactmethods['yim']); unset($contactmethods['jabber']); $contactmethods['facebook'] = 'Facebook'; $contactmethods['twitter'] = 'Twitter'; $contactmethods['linkedin'] = 'LinkedIn'; return $contactmethods; } add_filter('user_contactmethods', 'modernContactInfo'); |
Per capire come funzionano i filtri, ecco un’estratto del codice sorgente della funzione che usa WordPress nel caso esposto qui sopra:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /** * Setup the default contact methods * * @access private * @since * * @return array $user_contactmethods Array of contact methods and their labels. */ function _wp_get_user_contactmethods() { $user_contactmethods = array( 'aim' => __('AIM'), 'yim' => __('Yahoo IM'), 'jabber' => __('Jabber / Google Talk') ); return apply_filters('user_contactmethods', $user_contactmethods); } |
Ingegnoso!
3. come scriverlo
Una disamina sulla struttura di un Plugin è disponibile su: Sulla struttura ad oggetti di un Plugin WordPress, dove viene illustrato un possibile scheletro per confezionare adeguatamente un plugin.
4. tools
Dal punto precedente due consigli: una buona IDE e strumenti che agevolano la scrittura!
5. anteprima di una possibile evoluzione
Partendo da Sulla struttura ad oggetti di un Plugin WordPress stiamo sviluppando un’evoluzione orientata al paradigma MVC (Model View Controller), utilizzato in ruby e Objective-C.
Lo scenario che si prospetta, relativamente alla scrittura di Plugin, è quello di fornire un Framework – un insieme di classi – da utilizzare per la scrittura veloce di Plugin, estendendo ed implementando una serie di interfaccia ancor oggi assenti nell’ambiente WordPress.
Grazie all’esperienza maturata in ambito Objective-C, si è pensato di riproporre un modello di sviluppo simile, sfruttando alcune caratteristiche simile di Objective-C e PHP.
L’idea sarebbe quella di poter iniziare lo sviluppo di un Plugin estendendo una classe al pari di quello che accade in ambiente iOS. Costruire cioè quel collegamento con la programmazione ad oggetti che, di fatto, manca nell’ambiente WordPress:
1 2 3 4 5 6 7 | // Includo il framework Saidmade include ("/libraries/smwordpress-plugins.php"); // Estendo la classe SMWordpressPlugin class MioPlugin extends SMWordpressPlugin { // ... } |
Al pari di:
1 2 3 4 5 | #import <UIKit/UIKit.h> @interface myViewController : UIViewController { } |
Questa idea sarebbe affiancata da una nuova versione di WordPress Plugin Maker. La classe SMWordpressPlugin fornirebbe un ponte tra un’approccio Object Oriented all’attuale linearità del kernel WordPress. Fornirebbe già tutta una serie di metodi predisposti a gestire il backend di WordPress, come la gestione dei meta-box ad esempio. Inoltre renderebbe le azioni e filtri visti sopra, più simili ai delegati di Objective-C.
Questo stesso approccio potrebbe servire anche nello sviluppo di un tema, permettendo di sfruttare una classe come SMFunctions da usare nel file functions.php.
Oggi che PHP5 e lo sviluppo ad oggetti è più diffuso, sarebbe per WordPress una naturale evoluzione che, dal canto nostro, possiamo anticipare.
Author BIO
Tags
torna su





Non ci sono commenti per questo Post
Lascia un commento