Ulzurrun de Asanza i Sàez

Tag: bbPress

Añade más páginas al Widget «bbPress View List»

Ahora hay dos vistas en la lista de views de bbPress 2.0El Widget de bbPress «View List» que viene por defecto en bbPress 2.0 no tiene demasiada utilidad, al menos aparentemente. Sin embargo ofrece una característica la mar de interesante: podemos añadir cualquier página a ese Widget. ¿Cómo? Ahora lo veremos.

En primero lugar hay que entender cómo funciona el Widget. Toma del objeto $bbp la matriz views, la recorre y genera una lista de vistas disponibles. Por defecto esta matriz sólo tiene una vista: la lista de temas sin respuesta, pero podemos añadir todas las que queramos. La estructura de la matriz views es la siguiente:

[code]
Array
(
[no-replies] => Array
(
[title] => Topics with no replies
[query] => Array
(
[meta_key] => _bbp_reply_count
[meta_value] => 1
[meta_compare] => <
[orderby] =>
[show_stickies] =>
)

[feed] => 1
)

[IDENTIFICADOR] => Array
(
[title] =>Título
[query] => Array
( /* Matriz con los parámetros de la consulta a realizar en dicha vista, equivale a query_vars en WP_Query */
)

[feed] => 1 /* Supongo que será si se quiere mostrar o no esta vista en el RSS Feed, pero no lo he comprobado, así que no sé realmente qué es lo que hace */
)

)
[/code]

Interesante, ¿verdad? Pues bien, jugando un poco con esta matriz no sólo podemos crear enlaces que lleven a páginas que muestren sólo determinados temas, sino que podemos hacer que redirijan a cualquier lugar.

[php]
function bbpress_add_rss_to_view_list()
{
global $bbp;

$nombre_de_la_vista = ‘sumolari_bbpress_rss_feed’; // Utilizo este nombre por si en un futuro añaden a bbPress una vista llamada rss_feed o algo similar

$bbp->views[$nombre_de_la_vista] = array(
‘title’ => __(‘RSS Feed’, ‘bbpress’),
‘query’ => array(),
‘feed’ => 1
);

if (bbp_get_view_id() == $nombre_de_la_vista)
{
header(‘Location: ‘.home_url().’/feed/?post_type=’.$bbp->topic_post_type);
exit;
}

}

add_action(‘get_header’, ‘bbpress_add_rss_to_view_list’);
[/php]

¿Qué hace este código? En primer lugar obtiene el objeto $bbp. A continuación definimos un identificador para nuestra nueva vista. Después añadimos a la matriz views un nuevo índice con nuestro identificador y como valor una matriz que tiene por valor del title, “RSS Feed“, por valor del índice query una matriz vacía y por valor del índice feed el número 1. Tras esto verificamos que no nos encontramos en nuestra vista, ya que si así fuera, tendríamos que redirigir la página hacia el RSS Feed de los temas del foro. Por último añadimos esta nueva función a las acciones que se ejecutarán al obtener la cabecera del theme.

¿Cómo generamos el RSS Feed? WordPress lo hace de forma automática, y al ser los foros de bbPress 2.0 artículos de WordPress con post_type personalizados, basta con cargar el RSS Feed indicando el tipo de artículos que queremos ver, a través del parámetro de URL post_type.

Obviamente esta es sólo una de las cosas que se pueden hacer modificando la lista de vistas. El único límite es nuestra imaginación.


Muestra un widget con tags de bbPress en WordPress

Lista de temas de un foro bbPress como Widget de WordPressUna de las características que sorprendentemente no incluye bbPress 2.0 es un Widget para WordPress que muestre las etiquetas de los temas del foro. Es curioso que incluya un Widget que sólo muestre un enlace a la lista de mensajes sin responder y por contra no incluya un índice de etiquetas.

Esta tarde me he tomado la molestia de crear yo uno y quiero compartirlo con todo aquel al que le parezca interesante. Básicamente se copia el siguiente código en el archivo functions.php de nuestro theme de WordPress o en un archivo .php en la carpeta de plugins de WordPress.

[php]
class bbPress_Widget_Tag_Cloud extends WP_Widget {

function bbPress_Widget_Tag_Cloud() {
$widget_ops = array( ‘description’ => __( "Your most used tags in cloud format") );
$this->WP_Widget(‘bbpress_tag_cloud’, __(‘bbPress Tag Cloud’), $widget_ops);
}

function widget( $args, $instance ) {
extract($args);
$current_taxonomy = $this->_get_current_taxonomy($instance);
if ( !empty($instance[‘title’]) ) {
$title = $instance[‘title’];
} else {
if ( ‘post_tag’ == $current_taxonomy ) {
$title = __(‘Tags’);
} else {
$tax = get_taxonomy($current_taxonomy);
$title = $tax->labels->name;
}
}
$title = apply_filters(‘widget_title’, $title, $instance, $this->id_base);

echo $before_widget;
if ( $title )
echo $before_title . $title . $after_title;
echo ‘
<div class="tagcloud">’;
wp_tag_cloud( apply_filters(‘widget_tag_cloud_args’, array(‘taxonomy’ => $current_taxonomy) ) );
echo "</div>
n";
echo $after_widget;
}

function update( $new_instance, $old_instance ) {
$instance[‘title’] = strip_tags(stripslashes($new_instance[‘title’]));
$instance[‘taxonomy’] = stripslashes($new_instance[‘taxonomy’]);
return $instance;
}

function form( $instance ) {

global $bbp;

$current_taxonomy = $this->_get_current_taxonomy($instance);
?>

<label for="<?php echo $this->get_field_id(‘title’); ?>"><!–?php _e(‘Title:’) ?–></label>
<input id="<?php echo $this->get_field_id(‘title’); ?>" class="widefat" name="<?php echo $this->get_field_name(‘title’); ?>" type="text" value="<?php if (isset ( $instance[‘title’])) {echo esc_attr( $instance[‘title’] );} ?>" />

<label for="<?php echo $this->get_field_id(‘taxonomy’); ?>"><!–?php _e(‘Taxonomy:’) ?–></label>
<select id="<?php echo $this->get_field_id(‘taxonomy’); ?>" class="widefat" name="<?php echo $this->get_field_name(‘taxonomy’); ?>"> <!–?php foreach ( get_object_taxonomies($bbp—>forum_post_type) as $taxonomy ) : $tax = get_taxonomy($taxonomy); if ( !$tax->show_tagcloud || empty($tax->labels->name) ) continue; ?> <option value="<?php echo esc_attr($taxonomy) ?>">><!–?php echo $tax—>labels->name; ?></option> <!–?php endforeach; ?–> <!–?php foreach ( get_object_taxonomies($bbp—>topic_post_type) as $taxonomy ) : $tax = get_taxonomy($taxonomy); if ( !$tax->show_tagcloud || empty($tax->labels->name) ) continue; ?> <option value="<?php echo esc_attr($taxonomy) ?>">><!–?php echo $tax—>labels->name; ?></option> <!–?php endforeach; ?–> <!–?php foreach ( get_object_taxonomies($bbp—>reply_post_type) as $taxonomy ) : $tax = get_taxonomy($taxonomy); if ( !$tax->show_tagcloud || empty($tax->labels->name) ) continue; ?> <option value="<?php echo esc_attr($taxonomy) ?>">><!–?php echo $tax—>labels->name; ?></option> <!–?php endforeach; ?–></select>
<!–?php<br /–> }

function _get_current_taxonomy($instance) {
if ( !empty($instance[‘taxonomy’]) && taxonomy_exists($instance[‘taxonomy’]) )
return $instance[‘taxonomy’];

return ‘post_tag’;
}
}

register_widget(‘bbPress_Widget_Tag_Cloud’);
[/php]

¿Cómo funciona? Pues lo que he hecho ha sido copiar el código del Widget de nube de etiquetas que viene por defecto en WordPress (sobre la línea 986 del archivo wp-includes/default-widgets.php) y modificarlo para que en la lista de posibles taxonomías a mostrar muestre todas las taxonomías que pertenezcan a alguno de los post_type que añade bbPress 2.0.

Lamentablemente hay un pequeño problema en esto y es que aparecerán también las etiquetas que se aplican a temas publicados en foros privados, comprometiendo la privacidad de dichos foros. La solución me ha costado bastante más de encontrar, pero la tenéis a continuación. Se trata básicamente de aplicar un filtro al Widget, que añade a la lista de etiquetas a excluir cualquier etiqueta que haya sido asignada a un tema de un foro privado. De nuevo, se puede añadir en el archivo functions.php de nuestro theme o en un archivo aparte en wp-content/plugins.

[php]
function parchear_bug_tag_cloud($content)
{

global $bbp;

$private_forums = bbp_get_private_forum_ids();

if (bbp_user_can_view_forum(array(‘forum_id’ => $private_forums[1])))
{
return $content;
}

$tags_to_remove = array();
foreach ($private_forums as $pf_id => $pf_forum)
{

if ($pf_forum == ”) { continue; }

$temp_query = new WP_Query(array(‘suppress_filters’ => true, ‘post_type’ => $bbp->topic_post_type, ‘meta_query’ => array(array(‘key’ => ‘_bbp_forum_id’, ‘value’ => $pf_forum, ‘compare’ => ‘=’))));

while ( $temp_query->have_posts() ) : $temp_query->the_post();

$tags = wp_get_object_terms(get_the_ID(), $bbp->topic_tag_id);

foreach ($tags as $t_key => $t_value)
{
$tags_to_remove[] = $t_value->term_id;
}

endwhile;

wp_reset_postdata();

}

$content[‘exclude’] = $tags_to_remove;

return $content;
}

add_filter(‘widget_tag_cloud_args’, ‘parchear_bug_tag_cloud’);
[/php]

¿Cómo funciona? Primero se obtienen los foros privados y se comprueba que el usuario no puede verlos. A continuación se recorren todos los temas de todos los foros privados (sí, se que no está demasiado optimizado, pero no he encontrado una forma mejor de hacerlo) y se añaden todas sus etiquetas a la lista de etiquetas a excluir. Por último se devuelven los nuevos parámetros del Widget.

La lástima es que hay un segundo bug, y es que si un usuario accede a la URL de una etiqueta que está asignada a un tema publicado en un foro privado, el usuario puede ver la lista de temas que tienen asignada dicha etiqueta, y entre esos temas, aparecerá también el tema que debería estar oculto al ser publicado en un foro privado.

De nuevo para solucionar esto podemos recurrir a los filtros de bbPress y WordPress, en concreto arreglar el error se logra con el siguiente código:

[php]
function parchear_bug_foros_privados($content)
{
global $bbp;

$private_forums = bbp_get_private_forum_ids();

if (bbp_user_can_view_forum(array(‘forum_id’ => $private_forums[1])))
{
return $bbp->topic_query->post_count;
}

$topics_to_remove = array();
foreach ($bbp->topic_query->posts as $key => $post)
{
if (in_array(get_post_meta($post->ID, ‘_bbp_forum_id’, true), $private_forums))
{
$topics_to_remove[] = $key;
}
}

foreach ($topics_to_remove as $key => $topic_to_remove)
{
unset($bbp->topic_query->posts[$topic_to_remove]);
}

$bbp->topic_query->post_count = count($bbp->topic_query->posts);

$bbp->topic_query->post = reset($bbp->topic_query->posts);

return $bbp->topic_query->post_count;

}

add_filter(‘bbp_has_topics’, ‘parchear_bug_foros_privados’);
[/php]

Esto tiene un efecto secundario: a partir del momento de aplicar estos dos parches, cualquier tema que tenga asignada una etiqueta que esté a su vez asignada a un tema publicado en un foro privado, será invisible para los usuarios que no tengan permiso para ver dicho foro, es decir, se volverá tan privado como los temas publicados en un foro privado. Este efecto desaparece al eliminar el código de ambos parches, sin embargo si no usamos estas funciones, queda a la vista de cualquier usuario (incluso los no registrados) la lista de temas privados.

Sencillo y limpio, pues si queremos eliminar este parche o el Widget basta con borrar el código anterior. Además, en caso de que este error no se arreglara en futuras versiones, el parche y el Widget seguirán disponibles tras actualizar bbPress, manteniendo la sencillez característica de WordPress.

De todos modos, espero que en la versión final de bbPress 2.0 se incluya un Widget que reemplace al mío, y que los fallos sean arreglados.


Aplica los filtros de WordPress a bbPress 2.0

Coloreado de sintaxis en bbPress

bbPress no se caracteriza por ser uno de los sistemas de foros más completos, de hecho no es posible utilizar etiquetas tan comunes en otros foros como la de coloreado de código o la posibilidad de añadir un vídeo con tan sólo usar la etiqueta [youtube]. Sin embargo, al ser un plugin de WordPress, podemos extender las características de bbPress aprovechándonos de las de WordPress. ¿De qué estoy hablando? De aplicar los mismos filtros que aplica WordPress al contenido de los artículos a los mensajes del foro, haciendo que cada característica que añadamos a WordPress a través de plugins también esté disponible al instante en el foro.

Aplicar estos cambios es muy sencillo. Podemos crear un nuevo plugin o modificar el archivo functions.php de nuestro theme de WordPress. En primer lugar definiremos una función que devuelva el contenido que se le pasa como parámetro tras aplicarle los filtros que aplica WordPress. A continuación añadiremos esta función a los filtros que aplica bbPress al contenido de los mensajes. Aquí va el código en cuestión.

[php]
function aplicar_filtros($content)
{

global $bbp;

$author_id = $bbp->reply_query->posts[$bbp->reply_query->current_post]->post_author;
$author_info = get_userdata($author_id);

if ($author_info->wp_capabilities[‘administrator’] == 1)
{
return apply_filters(‘the_content’, $content);
}

return apply_filters(‘comment_text’, $content);
}

add_filter(‘bbp_get_reply_content’, ‘aplicar_filtros’);
[/php]

¿Cómo funciona esta función? En primer lugar obtenemos la variable $bbp, que contiene, entre otras cosas, la información relativa al mensaje que estamos mostrando. A continuación obtenemos la ID del usuario que ha publicado el mensaje, y con ésta, la información del usuario. Tras esto comprobamos que el autor del artículo tiene permisos de administrador. Si es así, el usuario puede utilizar cualquier filtro aplicado a los artículos del blog (es decir, cualquier filtro añadido a the_content); si por el contrario el autor no es un administrador, le dejaremos usar cualquier filtro que se pueda usar en los comentarios (es decir, que se añade a comment_text).

Por último añadimos la nueva función al filtro bbp_get_reply_content y ¡voilà! Ya tenemos nuevas características soportadas en nuestro foro. Ahora si queremos, por ejemplo, permitir el coloreado de código, basta con instalar un plugin como SyntaxHighlighter Evolved y activarlo desde el Panel de Administración de WordPress. También podremos usar otras características de WordPress, como embeber vídeos usando los shortcodes [video] o [youtube].

Del mismo modo, por ejemplo, se podrían añadir carruseles creados con WP Carousel 1.0 con utilizar el shortcode [wp_carousel].

Por medidas de seguridad, tan sólo los administradores gozarán de todos los filtros, ya que es posible que algún plugin añada un filtro a the_content que no queremos que los demás usuarios puedan usar públicamente, como por ejemplo añadir formularios de contacto o mostrar carruseles.


Tutorial: Crear un portal con WordPress y bbPress – Parte II

WordPress con Portal Colorido

Bien, ayer dejamos el tutorial después de tener instalado, configurado y ajustado WordPress y Portal Colorido, que debería tener un aspecto como el de la imagen de arriba, así que ahora vamos a comenzar a instalar, configurar y ajustar bbPress y Foro Colorido.

Read more →


Tutorial: Crear un portal con WordPress y bbPress – Parte I

Aunque crear un portal con WordPress y bbPress es algo muy sencillo (y es igual de fácil compartir los usuarios), es posible que hayan dudas sobre el proceso. En este tutorial explicaré paso a paso a instalar WordPress, instalar bbPress, usar el tema Portal Colorido para WordPress, el tema Foro Colorido para bbPress y unificar el aspecto de ambos.

Read more →


¡Sumolari.com estrena foro!

Desde principios de verano he estado pensando en crear un foro para Sumolari.com, con el objetivo de poder dar soporte para los plugins y los temas que he creado hasta ahora (y los que crearé más adelante). De momento he estado usando los comentarios del blog, pero son más incómodos de leer y de redactar.

Así pues me decidí a crear un foro y vino el dilema: ¿qué sistema de foros me conviene más?

En principio pensé en Simple Machines Forum, así que pensé diseñar un tema con el aspecto del que uso actualmente en el blog para SMF, y entonces me di cuenta de que en la próxima versión RC de Simple Machines Forum (la RC 2), dispondremos de un tema nuevo, que según parece generará código diferente al del tema actual, lo cual se traduce en que si creo un tema ahora es más que posible que no se vea bien en la RC2, con lo que SMF se queda fuera de la lista, al menos de momento.

A continuación pensé en bbPress, que se integraría a la perfección con el blog y los usuarios serían los mismos (aunque no hay nadie registrado en el blog, por lo que sería algo poco útil). Después de probarlo un poco vi que había muchas cosas que faltaban, como mensajes privados, encuestas, imágenes para cada foro, etc. Además de que la mayoría de los plugins eran para la rama 0.9, cuando la actual es la 1.0 y había algunos problemas con tener la sesión iniciada en el blog y el foro. Eso junto con que no acababa de gustarme el aspecto del foro me hicieron dejarlo fuera de la lista.

El tercero (y último) sistema por el que obté fue phpBB. Aunque hay muchas cosas de phpBB que no me gustan (sobretodo el tema de la instalación de mods), hay que reconocer que el tema proSilver genera un código excelente, de los mejores que he visto, realmente da gusto ver el código que genera y diseñar basándose en él. Además, phpBB ofrece muchas cosas que bbPress no, y aunque no tiene muchas funciones que me gustan de SMF (como el Karma, el calendario o el RSS Feed), era la mejor opción. Lo último que hizo que me decantase por phpBB fue que ya existe un conversor de phpBB a SMF, con lo cual si me arrepiento de mi elección siempre puedo cambiar de sistema sin casi pérdidas de datos.

Pero volviendo al tema, ya está disponible un foro de soporte para todos los temas y plugins que he creado hasta ahora, que podéis ver en http://foro.sumolari.com. Este foro es el lugar donde pedir soporte y ayuda, y dar sugerencias para los plugins y temas que he creado y proponer nuevos proyectos.


Descarga Foro Colorido: La versión para bbPress de Portal Colorido

Logo Foro Colorido

bbPress es un script para crear foros no muy conocido y tampoco demasiado usado, pero que en mi opinión puede tener un futuro prometedor gracias a la maravillosa integración con WordPress. Aunque actualmente bbPress se enfrenta a varios problemas, como tener una documentación escasa (casi inexistente) y pocos usuarios.

Además su punto fuerte, la integración con WordPress, se ve perjudicada por el theme que tiene por defecto: Kakumei. Éste theme es bastante diferente al theme Kubrick, el que está por defecto en WordPress. Esto hace que aunque compartamos usuarios entre WordPress y bbPress, da la impresión de que ambos scripts no están integrados.

Viendo esto y después de haber diseñado Portal Colorido se me ocurrió lo siguiente: “¿Un portal sin foro, qué es eso? ¿Qué tal un Portal Colorido con un Foro Colorido también?”. Y estos pensamientos junto con la curiosidad que tenía por saber qué tal era diseñar un theme para bbPress me decantaron a adaptar Portal Colorido, creando Foro Colorido.

¿Qué se puede esperar de Foro Colorido? Puedes lograr una integración perfecta con tu instalación de WordPress si usas Portal Colorido e integras los usuarios, aunque funciona perfectamente de forma independiente. De hecho puedes ver varios ejemplos, uno de Foro Colorido en solitario aquí y uno junto a Portal Colorido aquí.

¿Qué no puedes esperar de Foro Colorido? Lamentablemente debido a la escasa documentación de bbPress no he podido integrar todas las funciones de Portal Colorido en Foro Colorido. Por ejemplo, no dispone de página dentro del Panel de Administración de bbPress, además de que la matriz de colores de Foro Colorido no se debe alterar si se quiere seguir obteniendo buenos resultados.

Aún así estos pequeños problemas (que según avance bbPress se irán solucionando) no son ningún problema y pueden evitarse sin muchas complicaciones.

Por último, puedes descargar Foro Colorido aquí, o acceder a más información aquí.


Descarga bbPress 1.0

El sistema de foros bbPress (creado por las mismas personas que están desarollando WordPress) llegó a la versión 1.0 ayer (puedes leer el anuncio oficial aquí).

bbPress es la mejor opción para integrar al 100% los usuarios de un blog con WordPress y un foro. Se diferencia de otros sistemas de foros en un curioso uso de las tags (etiquetas que se asignan a los mensajes para aclarar de qué temas tratan). Si entramos en un foro con bbPress probablemente nos encontraremos con una lista de las tags más usadas, una lista de los últimos temas (sea cual sea el foro) y por último el listado de foros, una distribución que difiere bastante de lo que se suele ver en la mayoría de los foros.

Mi experiencia con bbPress es poca, pero la verdad es que no me ha gustado demasiado:

Sin embargo, como ya he dicho antes, es increíblemente fácil de integrar a WordPress, que me parece su punto fuerte.

Podéis descargar bbPress aquí.