Un paio di settimane fa leggevo da Giovy la recensione entusiasta di questo plugin tutto italiano per WordPress: Hiddy.

Domenica scorsa, dopo che Akismet ha bellamente ignorato una decina di commenti farmaceutici in un colpo solo, mi sono finalmente deciso e l’ho installato. Risultato: funziona! In questo momento ci sono solo 15 commenti nella coda dello spam, quando dovrebbero essercene diverse centinaia 😀

L’idea non è del tutto originale, ma è stata implementata in maniera semplice e allo stesso tempo intelligente: una volta attivato, Hiddy aggiungerà un campo al form dei commenti.
Il campo in questione avrà un nome scelto all’interno di un elenco di possibili scelte – tutte “invitanti” dal punto di vista dello spammer -, sarà inserito in un DIV con classe CSS casuale e reso invisibile tramite un’apposita regola. Ecco un esempio:

Perché il plugin funziona? Semplice: l’utente standard non vedrà il campo “nascosto” e non lo compilerà, uno spam-bot che scandaglia il codice html alla ricerca dei campi da compilare inserirà del testo in questo campo e verrà bloccato.
In questo modo si semplifica la gestione dei falsi positivi e si alleggerisce il carico sul server: non è necessario inserire i commenti spam nel db, con conseguente risparmio di CPU e spazio.

Fino a quando Hiddy potrà funzionare? Nel momento in cui questi sistemi anti-spam basati su CSS si diffonderanno, gli spam-bot dovranno necessari adeguarsi: naturalmente il sistema funziona solo se il bot non controlla gli attributi css del campo (valori ampiamente negativi di top e left, display:none, ecc. ecc.).

Nel frattempo è un plugin assolutamente da installare e consigliare agli amici 😉

Per il momento ho un unico dubbio: come si comportano i lettori vocali per non vedenti in presenza di un campo nascosto tramite css? Lo ignorano? In caso contrario ci sarebbe un bel problema di accessibilità 😕

Tag Technorati: , ,

Ritorno sull’argomento tag cloud per le categorie di WordPress: oggi ho provato ad installare in locale la versione 2.3 di WordPress e, come previsto, lo script non è più compatibile.

La spiegazione è semplice: la tabella wp_categories è stata rimossa e i dati necessari per lo script sono stati distribuiti in due tabelle distinte:

  • nella tabella wp_terms troviamo i term_id e i nomi associati a questi term_id
  • nella tabella wp_term_taxonomy riusciamo ad associare una tipologia ai vari term_id (campo taxonomy) e recuperare il numero di post collegati (campo count)

A questo punto, per recuperare tutti i valori che prima erano disponibili in un’unica tabella è necessario selezionare i termini di tipo category e fare un join delle due tabelle.

Ecco il nuovo codice (file in formato txt), compatibile SOLO con WordPress 2.3

< ?php

// Recupero le informazioni sulle categorie dal database
$qrystr = "SELECT $wpdb->term_taxonomy.term_id AS id_categoria, count, name, taxonomy FROM $wpdb->term_taxonomy LEFT JOIN $wpdb->terms ON $wpdb->term_taxonomy.term_id=$wpdb->terms.term_id WHERE taxonomy='category' ORDER BY name";

$cats = $wpdb->get_results($qrystr);

//Recupero il numero massimo di post per una singola categoria
$max_value = 0;
foreach ($cats as $cat)
{
 if ($max_value < $cat->count) {
	$max_value = $cat->count;
 }  	
}

//Considero 15 scalini , a partire da 60% a 200%
//Per modificare questi due valori basta modificare i valori delle variabili
$percentuale_minima = 100;
$percentuale_massima = 230;
$percentuale_scalino = 10;
$numero_scalini = ($percentuale_massima-$percentuale_minima)/$percentuale_scalino;
$post_per_scalino = $max_value / $numero_scalini;
	
// Stampo tutte le categoria all'interno di un div (id=cloud)
// assegno una classe alla categoria (o alle categorie) più grandi
echo '
'; foreach ($cats as $cat) { if ($cat->count>0) { $catname = $cat->name; $catlink = get_category_link($cat->id_categoria); $postcnt = $cat->count; $percentuale_fontsize = $percentuale_minima+(Round($postcnt/$post_per_scalino)*$percentuale_scalino); echo ''; } else { echo ' style="font-size: ', $percentuale_fontsize,'%" title="',$postcnt,' post">'; } echo $catname,"\r"; } } echo "
"; ?>

Dopo aver modificato il tema originale per differenziare i commenti, domenica pomeriggio ho approfittato di un attimo di tempo libero per fare un’ulteriore modifica sul template e separare i trackback e i pingback dai commenti normali.

WordPress, credo dalla versione 1.5, considera trackback e pingback come normali commenti, inserendoli nella cronologia della discussione: personalmente trovo la cosa abbastanza fastidiosa, soprattutto quando i collegamenti esterni cominciano a diventare numerosi. L’idea di fondo è quella di separarli dai commenti tradizionali e visualizzarli in modo visivamente diverso.

Fortunatamente non c’è molto lavoro da fare: è sufficiente sfruttare il valore dell’attributo comment_type e ripetere per due volte il ciclo sui commenti, uno per visualizzare i commenti standard e un altro per visualizzare trackback e pingback.

Ecco la struttura semplificata:

       foreach ($comments as $comment) :
        if ($comment->comment_type != "trackback" && $comment->comment_type != "pingback") {
         *** Inserisco il codice per visualizzare i commenti ***
        }
       endforeach;

       foreach ($comments as $comment) :
        if ($comment->comment_type == "trackback" || $comment->comment_type == "pingback") {
         *** Inserisco il codice per visualizzare trackback e pingback ***
        }
       endforeach;

Nel mio caso ho preferito introdurre un’ulteriore differenziazione: per visualizzare i commenti utilizzo la funzione comment_text(), per i trackback uso comment_excerpt(), mostrando solo una sintesi del “commento”.

Per chi fosse interessato, questo è l’attuale codice completo del mio comments.php, sicuramente migliorabile ma perfettamente funzionante 😉

Ai trackback viene associata una classe diversa rispetto ai commenti standard, per cui è possibile utilizzare il foglio di stile per modificarne l’aspetto: in fondo a questa pagina, ad esempio, potete vedere i trackback e i pingback separati dai commenti. Sta a voi decidere se posizionarli prima o dopo i commenti standard 😉


WordPress 2.2.2 e 2.0.11

5 Agosto 2007

Aggiornamenti di sicurezza per il ramo 2.2.x e il ramo 2.0.x di WordPress: tutti gli utenti della popolare piattaforma sono invitati ad aggiornare il proprio blog 😉

Sulla base delle informazioni presenti nell’annuncio ufficiale, ho creato dei pacchetti con i soli file modificati (decisamente comodi quando si tratta di aggiornare 5 o 6 blog):

Come sempre è consigliato farsi un backup dei file e del database prima di procedere 😉


Emanuele ha rilasciato una nuova versione del plugin per visualizzare nella sidebar del vostro blog WordPress la posizione aggiornata nella classifica di BlogBabel: BlogBabel Rank Plus.

Piccolo problema: il plugin non funziona su DreamHost (o quantomeno non funziona su questo blog).

Questo è il codice originale del plugin utilizzato per leggere la posizione

function bbrp_getRank($blog) {
	$host = BB_API_URL.$blog.';f=txt';
	$contents = file_get_contents($host);
	if($contents != "") {
		$rankx = explode("rank: ",$contents);
		$ranky = explode("\n",$rankx[1]);
		$trend = explode(" ",$ranky[1]);
	}
	return array("$ranky[0]","$trend[1]");
}

La funzione file_get_contents con URL è disabilitata su DreamHost per motivi di sicurezza, per cui bisogna modificare il codice in questo modo:

  • utilizzare CURL al posto di file_get_contents
  • aggiungere il carattere / al termine dell’URL (variabile $host): in caso contrario non viene restituito alcun risultato

Per comodità ho scelto di creare una funzione file_get_contents_DreamHost e modificare solo la chiamata a file_get_contents nella funzione originale bbrp_getRank:

function file_get_contents_DreamHost ($host) {
	$ch = curl_init();
	$timeout = 5;
	curl_setopt ($ch, CURLOPT_URL, $host.'/');
	curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
	$file_contents = curl_exe_c($ch);
	curl_close($ch);
	return $file_contents;
}

function bbrp_getRank($blog) {
	$host = BB_API_URL.$blog.';f=txt';
	$contents = file_get_contents_DreamHost($host);
	if($contents != "") {
		$rankx = explode("rank: ",$contents);
		$ranky = explode("\n",$rankx[1]);
		$trend = explode(" ",$ranky[1]);
	}
	return array("$ranky[0]","$trend[1]");
}

Nota importante: nella prima funzione, c’è scritto curl_exe_c. Il secondo “_” va cancellato (questa è la funzione in questione): evidentemente su DreamHost ci sono delle protezioni che impediscono il salvataggio di un post contenente quella stringa (cercando di salvare si ottiene una pagina di errore 503).


Tag Technorati

Esistono diversi plugin per inserire i tag Technorati al termine dei propri articoli; nel mio caso ho deciso di utilizzare un plugin “minimale”: SimpleTags.

SimpleTags permette di gestire i TAG direttamente nell’editor avanzato di WordPress: è possibile inserire un elenco di tag al termine all’articolo oppure selezionare delle parole all’interno del post. Ad esempio:

Questo è il [tag ]testo[/tag ] del post, con testo trasformato in tag technorati. Ovviamente [tag ] e [tags ] vanno scritti senza spazi, in questo caso li ho aggiunti per evitare che vengano interpretati dal plugin.
[tags ]testo, altri tag[/tags ]

Per migliorare il risultato estetico bisogna fare una piccola modifica al plugin e al foglio di stile del tema.

Apriamo il file simpletags.php con un editor di testi: le prime righe di codice che troviamo sono le seguenti:

$pre_replacement = '

Technorati Tags: '; $post_replacement = '

';

Bisogna modificare il $pre_replacement in modo da associare una classe al paragrafo con i Technorati Tags (e già che ci siamo sistemiamo l’italiano):

$pre_replacement = '

Tag Technorati: '; $post_replacement = '

';

Fatto questo, salviamo l’immagine da utilizzare per i tag nella cartella images del tema in uso e aggiungiamo la seguente regola al foglio di stile

.tag_technorati {
background: transparent url(images/technorati.gif) no-repeat scroll left center;
padding: 8px 2px 8px 20px;
}

Naturalmente è possibile anche utilizzare elementi diversi dal paragrafo, ad esempio un DIV.

Blog Reactions

In questo caso il codice da inserire in WordPress viene fornito direttamente da Technorati 😉

 View blog reactions