Integrare un forum bbPress in un blog WordPress

Attenzione: il 22/09/2006 è stato pubblicato un articolo in merito sul blog: bbPress, finalmente integrato in WordPress


In questo articolo vedremo come integrare un forum bbPress nel vostro blog WordPress. Attenzione: la procedura descritta in questo articolo è altamente sperimentale, perché bbPress non è stato ancora rilasciato in una versione stabile e perché richiede una conoscenza medio-alta di PHP.

Cos'è bbPress

bbPress è un forum sviluppato dagli stessi creatori di WordPress. Al momento lo stato del progetto non è ancora ad un livello di completamento come WordPress, vale a dire che il forum ancora non supporta la traduzione e la localizzazione in altre lingue e viene rilasciato giorno per giorno in versioni nightly, non ancora del tutto stabili, quindi questo tutorial potrebbe funzionare solo con alcune versioni di bbPress. La versione di bbPress usata è la nightly del 22/06/2005, mentre la versione di WordPress è una 1.5.1.x.

Dicevamo che è possibile installare un forum con bbPress e personalizzarlo secondo le proprie esigenze. Il Forum di WPItaly ne è un esempio, integrato nel blog principale.

Il Blog e il Forum

Diciamo che avete un blog all'indirizzo http://miosito.it/. Volete installare il forum in una sottodirectory del blog: http://miosito.it/forum/. Ecco cosa dovete fare:

1) Creare una directory forum nella directory principale del vostro blog e installarvi bbPress. Per installare e configurare bbPress potete servirvi delle istruzioni riportate a questi indirizzi:

Ora che avete installato correttamente il Forum, vediamo come integrarlo nel Blog. I sistemi per farlo sono due:

1) Clonazione

E' sufficiente clonare la grafica del Blog e applicarla al Forum modificando i vari file contenuti nella cartella bb-templates e definendo un foglio di stile per il Forum. Questo sistema è piuttosto semplice da realizzare, ma ha lo svantaggio che Blog e Forum rimangono due sezioni distinte e che nel Forum non si possono sfruttare le funzioni di WordPress, tipo l'elenco dei link, l'archivio dei post ecc ecc

2) Integrazione

Questo sistema è più complicato, ma permette di integrare nel Forum le funzioni di WordPress. Ovviamente la gestione degli utenti rimane separata da quella di WordPress, cioè per postare un messaggio nel Forum bisogna registrarsi solo ed esclusivamente nel Forum.

Per prima cosa bisogna modificare il file bb-config.php in modo da includere il file wp-config.php di WordPress così:

 <?php
if (file_exists('../wp-config.php'){
 include('../wp-config.php');
 }
 else {
 include('../../wp-config.php');
 }
 // Change the prefix if you want to have multiple forums in a single database.
 $table_prefix  = 'bb_';
 $bb->domain = 'http://www.miosito.it';
 $bb->path   = '/forum/';
 $bb->name   = 'Forum';
 $bb->admin_email = 'latua@email.it';
 $bb->mod_rewrite = false;
 $bb->page_topics = 30;
 // Number of minutes after posting a user can edit their post
 $bb->edit_lock = 1;
 $bb->gmt_offset = 0;
 /* Stop editing */
 define('BBPATH', dirname(__FILE__) . '/' );
 require_once( BBPATH . 'bb-settings.php' );
 ?> 

In questo modo non si devono specificare due volte i parametri per la connessione al database e si possono usare le varie funzioni di WordPress all'interno del Forum, ad esempio get_sidebar(), bloginfo(), list_cats(), get_links(), ecc ecc.

Ora bisogna andare a modificare il file bb-includes/template-functions.php rinominando le funzioni get_header() e get_footer() in get_bb_header() e get_bb_footer(). E allo stesso modo, bisogna modificare il file bb-includes/functions.php rinominando la funzione get_post() in get_forum_post() e la funzione remove_action in bb_remove_action. Attenzione: bisogna fare questa modifica anche nei file contenuti in bb-templates/.

In questo modo si evitano conflitti con le funzioni omonime get_header(), get_footer(), get_post() e remove_action di WordPress.

Ora si tratta di modificare il template del Forum in modo da replicare quello usato sul Blog. Diciamo subito che il template standard di bbPress è molto minimale e si limita alla specificazione di classi CSS agli elementi principali del template del Forum. Siete voi che dovete creare un nuovo foglio di stile CSS per il forum e a giocherellare con gli stili in modo da replicare il template del Blog.

Aggiungere l'header

Purtroppo, a seguito di prove, è risultato che si richiama dal Forum una funzione di template di WordPress, come queste: get_header(), get_footer(), get_sidebar(), si ottiene un warning di PHP:

 Warning: extract(): First argument should be an array in ...

Questo accade soprattutto con la funzione get_header(), perciò per includere il vostro header del Blog è purtroppo necessario copiare pari pari il codice presente nel file header.php di WordPress e incollarlo nel file header.php di bbPress.

Facciamo un esempio: il file front-page.php che si trova in bb-templates è quello che si occupa di visualizzare la pagina principale del Forum. Alla prima riga di tale file potete scrivere <?php get_bb_header(); ?> in modo da includere il contenuto del file header.php presente nella stessa cartella del Forum. Ora, nel file header.php potete copiare pari pari il codice presente nel file header.php del vostro template WordPress, magari aggiungendo nell'HEAD del documento questa riga per includere il foglio di stile del Forum:

 <style type="text/css" media="screen">
 @import url( <?php bloginfo('siteurl'); ?>/forum/bb-templates/style.css );
 </style>

Inutile dire che dovete creare un file style.css nella directory bb-templates del vostro Forum.

Per includere invece la Barra Laterale (la Sidebar) o il Footer, è sufficiente usare la funzione include() di PHP con i persorsi relativi, in questo modo:

 <?php include ('../wp-content/themes/nome_vostro_tema/sidebar.php'); ?>
 <?php include ('../wp-content/themes/nome_vostro_tema/footer.php'); ?>

Ad essere pignoli, credo che invece del percorso relativo, si potrebbe usare anche una cosa del genere:

 <?php include (ABSPATH . 'wp-content/themes/nome_vostro_tema/sidebar.php');?>
 <?php include (ABSPATH . 'wp-content/themes/nome_vostro_tema/footer.php');?>

ma non ho testato il funzionamento.

Traduzione in italiano

La traduzione in italiano va fatta manualmente, traducendo tutti i messaggi contenuti nel codice HTML di

  • tutti i file presenti nella cartella bb-templates.
  • diverse frasi nel file bb-includes/template-functions.php

e sostituendo nel file bb-includes/functions.php la funzione bb_since() con questa:

 function bb_since( $original, $do_more = 0 ) {
	// array of time period chunks
	$chunks = array(
array(60 * 60 * 24 * 365 , 'ann'),
		array(60 * 60 * 24 * 30 , 'mes'),
		array(60 * 60 * 24 * 7, 'settiman'),
		array(60 * 60 * 24 , 'giorn'),
		array(60 * 60 , 'or'),
		array(60 , 'minut'),
	);
	$today = time();
	$since = $today - bb_offset_time($original);
	for ($i = 0, $j = count($chunks); $i < $j; $i++) {
		$seconds = $chunks[$i][0];
		$name = $chunks[$i][1];
		if (($count = floor($since / $seconds)) != 0)
			break;
	}
 switch ($name) {
 case "ann":
	if ($count==1){
		$forma='o';
	}
	else {
		$forma='i';
	}
 break;
 case "mes":
	if ($count==1){
		$forma='e';
	}
	else {
		$forma='i';
	}
 break;
 case "settiman":
	if ($count==1){
		$forma='a';
	}
	else {
		$forma='e';
	}
 break;
 case "giorn":
	if ($count==1){
		$forma='o';
	}
	else {
		$forma='i';
	}
 break;
 case "or":
	if ($count==1){
		$forma='a';
	}
	else {
		$forma='e';
	}
 break;
 case "minut":
	if ($count==1){
		$forma="o";
	}
	else {
		$forma='i';
	}
 break;
 }
 $print = $count.' '.$name.$forma;
	if ($i + 1 < $j) {
		$seconds2 = $chunks[$i + 1][0];
		$name2 = $chunks[$i + 1][1];
		// add second item if it's greater than 0
		if ( (($count2 = floor(($since - ($seconds * $count)) / $seconds2)) != 0) && $do_more )
			$print .= ($count2 == 1) ? ', 1 '.$name2 : ", $count2 $forma";
	}
	return $print;
 }

Alcuni riferimenti utili

Ultima modifica il 21/09/2006 ore 17:18