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 '<div id="cloud">';
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 '<a href="',$catlink,'"';
  if ($percentuale_fontsize==$percentuale_massima) {
	echo ' style="font-size: ', $percentuale_fontsize,'%" class="top_category" title="',$postcnt,' post">';
  }   
  else {
  	 echo ' style="font-size: ', $percentuale_fontsize,'%" title="',$postcnt,' post">';
   }  
  echo $catname,"</a>\r";
 }
}
echo "</div>";	
?>

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).