WordPress: Visualizzare solo i “contenuti” di cui si è autore

Nelle situazioni in cui più persone partecipano alla preparazione degli articoli sullo stesso sito a volte ci si trova davanti ad una grande quantita di contenuti in cui si fatica a filtrare le proprie bozze.

Quando necessario, per semplificare le cose, aggiungo questa piccola funzione che filtra post, pagine e Custom Post Type sulla base dell’utente loggato verificando 3 cose:

  1. se non faccio parte del gruppo “administrator” (gli admin continueranno e vedere tutti i contenuti)
  2. se sono in area di amministrazione
  3. se non sono nella pagina dei media (in modo che possa vedere tutte le foto caricate)

L’hook usato è il “pre_get_posts” che ci permette di aggiungere una condizione prima di effettuare la query rendendo il tutto molto più performante.

Queste poche righe vanno aggiunte nel file function.php oppure linkate tramite un include o require.

Awesome WordPress Toolbox

Anche se in rete esistono già molte raccolte di link legate a WordPress voglio provare a raccogliere le risorse che ho accumulato in un repo che avevo aperto parecchio tempo fa.

Questo il link: Awesome WordPress

Il taglio che mi piacerebbe dare, che in qualche modo potrebbe differenziarsi dalle altre, è relativo al tipo di risorse elencate che vogliono essere di supporto a chi sviluppa cercando di seguire quelle che sono le best practices.
Non ho l’obiettivo di creare una raccolta completa ma un’elenco di risorse capace di aiutare e velocizzare il lavoro di tutti i giorni.

Al momento ci sono circa una trentina di link che con il tempo spero di far crescere cercando di evitare link a risorse premium.

Ringrazio in anticioo tutto quelli che avranno voglio di contribuire facendo delle commit o condividendolo sui diversi social

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.

3 Librerie js/jquery da conoscere

Ho messo da parte questi 3 link con l’intento di guardarli in un secondo momento con più attenzione.
Ovviamente non sono ancora riuscito a farlo ma voglio almeno condividerli facendo almeno un copie ed incolla della loro descrizione.

Qualcuno le ha già usate?

 

  • jQuery++I am an MIT licensed collection of extremely useful DOM helpers and special events for jQuery 1.7 and later. I’m not a UI project like jQuery UI or jQuery Tools. Instead, I’m all about providing low-level utilities for things that jQuery doesn’t support. If Underscore is jQuery’s functional-programming tie, I am jQuery’s bald-spot covering toupee.http://jquerypp.com
  • Underscore.jsUnderscore is a utility-belt library for JavaScript that provides a lot of the functional programming support that you would expect in Prototype.js (or Ruby), but without extending any of the built-in JavaScript objects. It’s the tie to go along with jQuery’s tux, and Backbone.js’s suspenders.Underscore provides 60-odd functions that support both the usual functional suspects: map, select, invoke — as well as more specialized helpers: function binding, javascript templating, deep equality testing, and so on. It delegates to built-in functions, if present, so modern browsers will use the native implementations of forEach, map, reduce, filter, every, some and indexOf.

    http://underscorejs.org/

  • Backbone.jsBackbone.js gives structure to web applications by providing models with key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing API over a RESTful JSON interfacehttp://backbonejs.org

Image credits: annais

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…

Torino Comics 2012 – Cosplay e BoardGame

Dopo due giorni passati dentro ieri sera ero veramente devastato, ma la fiera ogni anno è sempre più piccola e se non fosse per la torneistica personalmente non credo che spederi 10 euri per entrare.

Le cose da vedere sono sepre le solite: qualche fumetto, vestiti e accessori per cosplay, pupazzi, videogiochi usati e qualche stand con giochi di ruolo e giochi da tavolo.

Dal mio personali punto di vista (torneistica a parte) l’unica cosa interessante sono i tavoli con le dimostrazioni

Sotto un piccola selezione del panorama cosplay presente alla manifestrazione

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 )