WordPress: Area riservata

In molti casi è necessario riservare l’accesso ad alcuni contenuti solo agli utenti loggati e senza ricorre ad ulteriori plugin io solitamente implemento un template di pagina che verifica che l’utente corrente sia correttamente loggato.

Questo un veloce esempio:

I più attenti potrebbero dirmi che per una cosa del genere basterebbe impostare la visibilità della pagina come “privata” ma in questo modo abbiamo il vantaggio di poter personalizzare anche l’aspetto della pagina usando un menu ed una sidebar su misura per miglioare l’esperienza utente.

Lo stessa tecnica si può applicare anche ad interi CPT semplicemente eliminado la riga relativa al nome del template e modificando il nome del file in questo modo:

single-{nome_post_type}.php

Ricordatevi però che in questo modo i contenuti continueranno ad essere elencati sia negli archivi che nella ricerca di default di WordPress, sarebbe quindi oppurtuno preparare un contenuto di default anche per il campo riassunto (excerpt) e gestire i listing in modo opportuno.

WordPress: Organizzare la Media Library

Più di un cliente mi ha chiesto un sistema per organizzare meglio la “media library” in modo da rendere più facile e veloce la ricerca delle immagini già inserite.

In alcuni casi sono andato a creare a mano una tassonomia da agganciare direttamente agli attachment ma per valorizzarla era poi necessario andare nella pagina di dettaglio della singola immagine.

Con Enhanced Media Library possiamo risolvere il problema creando una categorizzazione deli diversi contenuti oppure una suddivisione per tipo (mime-type).

wordpress-enhanced-media-library-filter

Anche se questo plugin non dovrebbe impattare con le perfomance sul frontend ne consiglio l’uso solo a chi gestisce una libreria molto grossa e deve riutilizzare immagini già caricate in passato.

WordPress: Aggiungere campi per profilo facebook e twitter agli utenti

In molti siti, al fondo degli articoli, quando il template lo supporta è presente un box con i dati dell’autore che lo ha scritto.

Queste informazioni vengono prese dalla pagina di pagina di profilo utente che di default prevede nome, mail, sitoweb e descrizione, per l’avatar in genere viene usato il servizio offerto da Gravatar (che è un’altro dei tanti servizi Automattic) ma per la gestione dei link ai profili social dobbiamo fare un po’ di lavoro.

Questa la mia soluzione:

add_filter('user_contactmethods', function ($profile_fields) {
// Nuovi campi
$profile_fields['twitter'] = 'Twitter ';
$profile_fields['facebook'] = 'Facebook ';
$profile_fields['gplus'] = 'Google Plus';
// Remove old fields
unset($profile_fields['aim']);
return $profile_fields;
});

Per leggerle è semplicissimo:

get_the_author_meta('twitter')

Questo il risultato su uno dei miei ultimi lavori:
user-bio

Rispetto all’utilizzo di un plugin rimane ovviamente molto più leggero e ci permette di integrare il tutto all’interno del nostro template.

Usare JetPack anche sviluppando in locale

Per chi ancora non lo conosce JetPack è un plugin sviluppato direttamente da Automattic che raccoglie al suo interno diversi moduli. Attivabili o meno a bisogno.

Al momento (maggio 2015) sono presenti 35 moduli tra cui:

Il problema è che usare alcuni di questi moduli è necessaria una connessione ad internet e sopratutto l’autenticazione attraverso WordPress.com

Non però sempre è possibile sopratutto se si lavora in locale per sviluppare.

La soluzione è questo filtro che attiva la “development mode” (e che quindi non richide ne auteticazione ne connessione ad internet)

add_filter( 'jetpack_development_mode', '__return_true' );

Purtroppo in questo modo non tutti i moduli saranno attivi in quando alcuni per funzionare richiedono dati a server esterni (ad esempio Omnisearch, Related Posts).

Personalmente sono stato molto scettico sull’utilizzo di questo plugin ma vista la qualità del codice con cui è stato scritto e la quantità di funzionalità lo propongo sempre più spesso.

WordPress Hardening [wordcamp bologna 2012]

E per chi se lo è perso ecco le slide di sabato scorso al WordCamp Bologa dove si è parlato di WordPress e sicurezza.

In breve si tratta di qualche semplice spunto per rendere più difficile l’utilizzo di un qualsiasi exploit che è possibile mettere in pratica senza l’installazione di plugins.
Questa è una versione aggiornata e migliorata rispetto a quella presentata il giugno scorso.

… e se le slide non vi bastano prossimamente saranno anche pubblicati i video dei singoli interventi.

update: qui il link per scaricare il file .htaccess di cui parlo nelle slide

 

 

Settembre 2012

Ci siamo. Le vacanze sono ormai solo un ricordo e si ricomincia con la solita routine.

Che poi Settembre è un mese particolare. Come dicono altri è un po’ capodanno.

Ora, giusto per lastricare un po’ le strade dell’inferno, parliamo dei “buoni propositi“.

Ci sono un paio di progetti come la pubblicazione di qualche template WordPress su ThemeForest che spero di concretizzare entro l’anno, ci sono alcune importanti collaborazioni che sono iniziate e che spero diventino più solide e ci sono un po’ di lavori da chiudere che sono rimasti appesi da ormai troppe settimane.

Nel breve periodo ho anche due belle occasioni di incontro:

La prima è durante la settimana della Social Media Week  dove il 25, 26 e 27 Settembre sono tra i relatori di questo talk: WordPess: Soluzioni e Idee per Startup e piccole/media imprese

La seconda, un po’ più tecnica, sempre a Torino in occasione del Symfonyday (5 ottobre): Come usare i componenti di Symfony2 dentro WordPress e vivere felici

Bene ora sapete tutto. E poi ricordatevi anche che a fine mese è il mio compleanno.

CloudFlare: una CDN facile (e gratis)

Argomento un po’ complesso per cui preferisco partire con la definizione di CDN:

Le Content Delivery Network (CDN, Rete per la consegna di contenuti) … sono un sistema di computer collegati in rete attraverso Internet che collaborano in maniera trasparente, sotto forma di sistema distribuito, per distribuire contenuti agli utenti finali.

L’obiettivo di una CDN è di instradare una richiesta di contenuto sul nodo che viene individuato come ottimale. Se ottimizzate per le prestazioni, il nodo ottimale è quello che può soddisfare la richiesta nel minor tempo possibile: si può determinare per esempio scegliendo quello geograficamente o topograficamente (nel contesto di rete, minor numero di hops o minor ping) più vicino alla locazione del richiedente, oppure quello con un minor carico di lavoro (in inglese, load average).

Detto in modo più concreto si tratta di un sistema per ottimizzare e risparmiare carico server facendo in modo che alcuni contenuti (es. le immagini e/o i file statici come js e css) vengano erogati da server differenti ottimizzando la distribuzione a livello geografico in modo che sia il server più vicino a noi ad occuparsi del trasferimento.

Mi sono chiesto più volte in quale modo la nostra infrastuttura potesse beneficiare di questo tecnologia ma guardando le specifiche di Akamai e/o Amazon (che sono forse tra le più importanti realtà in questo settore) mi sono reso conto che i prezzi per la gestione di piccoli siti sono abbastanza proibitivi.

Poi, come sempre succede in queste cose, “la figlia del contadino” mi ha parlato di CloudFlare e del suo piano gratuito.

Ho deciso quindi di provare l’integrazione su questa pagine limitando però l’uso alle immagini e ai file javascript e css.
Questo, in breve, quello che ho fatto.

  1. Comprato un nuovo dominio “mavidacdn.in” su whois.com (in offerti in questi giorni a 3.88 dollari).
  2. Ho girato i name server sui server di Cloudflare
  3. Impostato un nuovo sottominio maurizio.mavida.com in modo che punti sul mio ip
  4. Configurato Apache per indirizzare correttamente. (sia maurizio.mavida.com che static puntano adesso allo stesso sito)
  5. Scritto un microplugin per fare in modo che l’indirizzo delle immagini pubblicare su queste pagine punti sul sottodominio CDN.
  6. Modificato nella pagina nelle impostazioni dei media il “Percorso URL completa ai file” con il sottodominio configurato su CloudFlare (http://maurizio.mavida.com/wp-content/uploads)

In questo modo CloudFlare oltre a fare da CDN svolge anche un lavoro come Reverse Proxy facendo cache dei contenuti. Quando viene chiesta un’immagine, o un file javascript/css CloudFlare verifica se è già nella sua cache e solo nel caso non lo sia la chiede al mio server. I benefici nel mio caso sono molto limitati in quanto il traffico generato è relativamente piccolo ma in situazioni più complesse una soluzione come questa potrebbe ridurre notevolemente il traffico.

Questo è il risparmio di banda (e di richieste) ottenuto in 5 giorni di utilizzo:

Adesso qualche dettaglio tecnico:
Qui sotto potete vedere il modo in cui vado ad effettuare la sostituzione dei link alle immagini che viene usata su filtri: ‘the_content’, ‘post_thumbnail_html’ e ‘widget_text’.


function CloudFlareImageReplace ( $content ) {

$pattern="/(" .$this->blog_url . ")(\/wp-content\/)(.*)(png|gif|jpg)/";
$replacement = $this->cf_cdnurl. "$2$3$4";

return preg_replace($pattern, $replacement,$content );

}

Mentre questa quella per js e css che viene attiva dal filtro su “script_loader_src”.

function CloudFlareScriptReplace ( $src ) {

$pattern="/(" . $this->blog_url . ")(\/wp-content\/)(.*)(js|css)/";
$replacement = $this->CloudFlareUrl . "$2$3$4";

// remove Query Strings From Static Resources
$src_parts = explode('?', $src);
return preg_replace($pattern, $replacement, $src_parts[0] );

}

Su GitHub potete trovare il sorgente versione completa (ancora in versione beta) ma se volte installarlo potete usare quella che ho pubblicato sul codex: http://wordpress.org/extend/plugins/cloudflare-url-replacement/.

Anche in quato caso sono graditi consigli e suggerimenti.


image credits: Derek Heisler

WordPress: qualità e quantità

[polemica on]
Da qualche giorno sto seguendo le conversationi su twitter con il tag #wordpress e sinceramente mi aspettavo un po’ più di qualità.

Moltissime segnalazioni portano ad articoli veramente banali. E non parlo solo delle migliaia di raccolte plugins che titolano robe tipo “I migliori plugin per …” (che spesso portano a roba vecchia e superata), ma in generale la comunità è povera di contenuti di qualità.
[polemica off]

Ovviamente mi rendo conto che questo non è un problema che possa essere riferito solo WordPress ma che affligge un po’ tutta la rete.

Nonostante questo vedere decine di articoli “fotocopia” dopo l’annuncio delle beta2 mi ha fatto un po’ tristezza (senza contare il fatto che la fonte nella maggior parte dei casi non era nemmeno citata).

 

La selezione di siti che seguo tramite rss va leggermente meglio anche se il numero di articoli e/o snippets interessanti è un po’ in calo.
Ovviamente in tutto questo ci sono le eccezioni e sia su questo sito che sul mio twitter cerco di segnalare quello che a mio giudizio può essere interessante da condividere.

Pochi comunque rimangono gli articoli tecnici di approfondimento e come dice scribu per diventare “guru” bisogna imparare a leggere il sorgente del core.

In generale è curioso vedere come a questo appiattimento dei contenuti si affianchi invece una continua crescita della popolarità ed utilizzo in ambito business.
Forse anche in questo campo vale la regole che dice “l’importante è parlarne”…

Aggionamento 2015
Le cose non sono cambiate e sui gruppi Facebook la meta delle domande è: Conoscete un plugin gratuito per #mettiunaparolaacaso

Estendere il server XML-RPC di WordPress

Leggere, scrivere e/o modificare i contenuti su WordPress non sempre può essere fatto da un’interfaccia di amministrazione (sia questa web, mobile o app). Ci possono essere esigenze in cui è necessario automatizzare alcuni processi appoggiandosi a strumenti esterni.

WordPress ci viene incontro con “una cosa” nota come XML-RPC.

 

In pratica si tratta di un componente che ci permette di dialogare secondo un protocollo standard attraverso internet. In questo modo un sito e/o applicazione esterna potrebbe pilotare la nostra installazione facendogli fare qualsiasi cosa.

In realtà “qualsiasi cosa” non è ancora prevista ma dalla nuova versione 3.4 ne saranno aggiunte parecchie. Ricordatevi solo di abilitarlo che di default è disattivato.

Il titolo di questo articolo però è “Estendere il server XML-RPC” non “Usare il server XML-RPC” quindi iniziamo a vedere cosa ci dice il codex: XML-RPC Extending

Like the rest of WordPress, the XML-RPC API contains numerous hooks to customize or extend its behavior.

Nel caso volessimo estendere il servizio XML-RPC attraverso un plugin in grado di restituire gli ultimi post non dovremo quindi fare altro che aggiugnere una roba come questa:

// aggiungo il fitro
add_filter( 'xmlrpc_methods', 'mycustom_methods');

// dichiaro i nuovi metodi
function mycustom_methods( $methods ) {
    $methods['getlastposts'] = 'get_LastPosts';
    return $methods;   
}

/*
 * restisuisco gli ultimi n. post in formato serializzato
 */
function get_LastPosts( $params ) {

  $args =  $params[0]
  $defaults = array(
	'numberposts' => 5, 
	'post_type' => 'post', 	
        'post_status'     => 'publish' 		
	);

  $args = wp_parse_args( $args, $defaults );			
  $posts = get_posts( $args );

  // restituisco l'oggetto serializzato
  return serialize($posts); 
}

Questo invece un esempio di come poter usare il vostro “nuovo” metodo usando il client offerto dalla libreria Zend

 $client = new Zend_XmlRpc_Client('http://tuosito.com/xmlrpc.php');
 $response = $client->call('getlastposts');
 $posts = deserialize($response)

 //con passaggio di parametri
 $client = new Zend_XmlRpc_Client('http://tuosito.com/xmlrpc.php');

 $args = array(
	'numberposts' => 3, 
	'post_type' => 'page'
	);

 $response = $client->call('getlastposts' , array( $args));
 $posts = deserialize($response)

Le cose nella pratica non sono così semplici e potrebbe servire un sistema di autenticazione.
Poi dato che spesso parlo di performance male non farebbe un piccolo sistema di cache.

Ecco quindi una nuova versione di “get_LastPosts” che accetta come parametri $blog_id, $username, $password e poi array con gli argomenti necessari a getposts.

function get_LastPosts( $params ) {

  $blog_id  =  $params[0]
  $username =  $params[1]
  $password =  $params[2]

  $args     =  $params[3]

  $defaults = array(
	'numberposts' => 5, 
	'post_type' => 'post', 	
        'post_status'     => 'publish' 		
	);

  $args = wp_parse_args( $args, $defaults );			
  extract( $args, EXTR_SKIP );

  if ( !$user = $this->login($username, $password) ) {
     // user o password non validi 
     return false;

  } else {

  // creo una chiave univoca per la cache
  $cache_key = "_xmlrpc_" . $username. md5( $numberposts . $post_type);

  $posts = get_transient( $cache_key );

  if (false === $posts) {
     $posts = get_posts( $args );
     set_transient( $cache_key , $posts, 60*60*4 );
  }

  // restituisco l'oggetto serializzato, compresso, ed in base64
  // per ripristinarlo: unserialize(gzuncompress(base64_decode($posts))); 
  return base64_encode(gzcompress(serialize($posts))); 
 }

}

Bene, adesso potete fare un po’ di prove e se nel fare copia e incolla ho sbagliato qualche cosa ditemlo che lo correggo.

WordPress in numeri – aprile 2012

Yoast ha pubblicato oggi un’interssante infografica relativa alla diffusione di WordPress ed ai numeri pubblicati qualche giorno da da pingdom.

Cita anche un pensiero di Matt Mullenweg dove leggo con piagere che la più grande sfida dei prossimi due anni sarà l’evolvere della dashboard per essere più veloce e più accessibile (soprattutto per dispositivi touch).

In una delle mie ultime slide, riferendomi alla diffusione di WordPress riportavo:

  • 72 mln di installazioni nel mondo (circa 50% wordpress.com)
  • 53.7 % del mercato dei CMS
  • + 18,800 plugins (Marzo 2012)
  • + 1.500 themes (Marzo 2011)
  • + 11 mln di download WordPress 3.3 (dicembre 2012 / marzo 2012)

Questa bellissima infografica completa ed estende qui numeri.

Update:
Trovo anche molto interessante e significativo l’incredibile quantitità di richieste di lavoro “WordPress” pibblicate su piattaforme come oDesk e Freelancer.
Se qualcuno le ha già provate sarei curioso di conoscere il suo parere…

WordPress: strumenti per il Debug

Inizio citando me stesso: “E’ molto semplice iniziare a sviluppare template e plugin per WordPress ma è altrettando semplice scrivere del codice sporco e poco performante

 

Questo per dire che oltre alle “best practice” come il disaccoppiamento, l’utilizzo della cache o l’inclusione di file solo necessari spesso serve un aiuto per capire dove stiamo sbagliano e/o possiamo migliorare.

Questo è il motivo per il quale nella mia “cassetta degli attrezzi plugins” ci sono alcuni plugin che in più di un’occasione si sono rivelati molto molto utili.

Se non li conoscete ancora installate e provate (nb. provateli in locale o comunque sul vostro ambiente di sviluppo e non  produzione perchè ovviamente aggiungono ulteriore overhead )