Vous parcourez les archives de forum

Avatar de Dan

par Dan

Permettre du code dans les posts de votre forum

Le 03/11/2010 dans Mes astuces

Dans les posts d’un forum BP, il est quasiment impossible de saisir du code. On peut mettre un peu de html entre les tags <code></code> et c’est tout. Le php passe quasiment pas. Normal, WP et BP sont truffés de filtres…

Néanmoins, à commencer par le forum officiel de buddypress, il est quasi indispensable de pouvoir citer du code compte tenu des questions qui y sont posées. Le code actuellement utilisé par le site officiel  pour accomplir cela est tiré de bbPress. (bbpress/bb-includes/functions.bb-formatting.php)

Boone Gorges, l’un des devs, vient de fournir ce code réinterprété pour être utilisé par tous. http://pastebin.com/Mvyc8TYx Malheureusement ce code n’affiche pas correctement les backtick et encore plus gênant avec du php, les doubles quotes. De plus, wordpress les transforme systématiquement en guillemets typographiques,  des double chevron, donc. Pas bon.

Voici ma version du code, avec les corrections, que vous pouvez utiliser tel quel. Mais attention, je ne vous garanti pas une impunité face à des injections, même si tous les filtres de WP sont actifs par ailleurs. (Mais vous le savez si utilisez WP depuis longtemps, qu’une passoire reste une passoire.  :-)

A placer dans functions.php de votre thème enfant.


//permet de mettre du code dans les posts des forums
// We need the <pre> tag to make code-in-backticks work
function bporg_forums_allowed_tags( $forums_allowedtags ) {
 $forums_allowedtags['pre'] = array();
 return $forums_allowedtags;

}
remove_filter( 'bp_get_the_topic_post_content', 'wptexturize' );
add_filter( 'bp_forums_allowed_tags', 'bporg_forums_allowed_tags' );
add_filter( 'bp_activity_allowed_tags', 'bporg_forums_allowed_tags' );

// Borrowed from bbPress
function bporg_encodeit( $matches ) {
 $text = trim($matches[2]);
 $text = htmlspecialchars($text, ENT_QUOTES);
 $text = str_replace(array("\r\n", "\r"), "\n", $text);
 $text = preg_replace("|\n\n\n+|", "\n\n", $text);
 $text = str_replace('&amp;amp;', '&amp;', $text);
 $text = str_replace('&amp;lt;', '&lt;', $text);
 $text = str_replace('&amp;gt;', '&gt;', $text);
 $text = "<code>$text</code>"; // original
 if ( "`" != $matches[1] )
 $text = "<pre>$text</pre>";
 return $text;
}

// Borrowed from bbPress
function bporg_decodeit( $matches ) {
 $text = $matches[2];
 $trans_table = array_flip(get_html_translation_table(HTML_ENTITIES));
 $text = strtr($text, $trans_table);
 $text = str_replace('<br />', '<coded_br />', $text);
 $text = str_replace('<p>', '<coded_p>', $text);
 $text = str_replace('</p>', '</coded_p>', $text);
 $text = str_replace(array('&#38;','&amp;'), '&', $text);
 $text = str_replace('&#39;', "'", $text);
 if ( '<pre>' == $matches[1] )
 $text = "\n$text\n";
 return "`$text`";
}

// Borrowed from bbPress. Makes code in backticks work, both in forum posts and in activity updates.
function bporg_code_trick( $text ) {
 $text = str_replace(array("\r\n", "\r"), "\n", $text);
 $text = preg_replace_callback("|(&#96;)(.*?)`|", 'bporg_encodeit', $text);
 $text = preg_replace_callback("!(^|\n)`(.*?)&#96;!s", 'bporg_encodeit', $text);
 return $text;
}
add_filter( 'bp_get_the_topic_post_content', 'bporg_code_trick', 1 );
add_filter( 'bp_get_activity_content_body', 'bporg_code_trick', 1 );

J’ai posté ici à l’origine

Attention: ce code ne permet pas l’affichage de TOUT le HTML qui reste limité par la fonction bp_forums_filter_kses dont voici le code actuellement utilisé par défaut sur les forums de BP.


function bp_forums_filter_kses( $content ) {
 global $allowedtags;
 $forums_allowedtags = $allowedtags;
 $forums_allowedtags['span'] = array();
 $forums_allowedtags['span']['class'] = array();
 $forums_allowedtags['div'] = array();
 $forums_allowedtags['div']['class'] = array();
 $forums_allowedtags['div']['id'] = array();
 $forums_allowedtags['a']['class'] = array();
 $forums_allowedtags['img'] = array();
 $forums_allowedtags['br'] = array();
 $forums_allowedtags['p'] = array();
 $forums_allowedtags['img']['src'] = array();
 $forums_allowedtags['img']['alt'] = array();
 $forums_allowedtags['img']['class'] = array();
 $forums_allowedtags['img']['width'] = array();
 $forums_allowedtags['img']['height'] = array();
 $forums_allowedtags['img']['class'] = array();
 $forums_allowedtags['img']['id'] = array();
 $forums_allowedtags['code'] = array();
 $forums_allowedtags['blockquote'] = array();

 $forums_allowedtags = apply_filters( 'bp_forums_allowed_tags', $forums_allowedtags );
 return wp_kses( $content, $forums_allowedtags );

}

Si vous voulez autoriser des  balises supplémentaires, vous devez les ajouter à cette  liste et la coller ensuite dans functions.php de votre thème enfant.

Pour afficher du code sur le forum, vous le placez entre backsticks (altGR+è du clavier français)

Enjoy !

Avatar de Dan

par Dan

S’abonner aux discussions d’un forum ? C’est possible…

Le 02/10/2009 dans En vrac

C’est d’autant plus possible qu’il existe un plugin depuis ce soir et judicieusement intitulé Group Forum Subscripton for BuddyPress
Il permet de s’abonner aux discussions soit pour un sujet précis dans un groupe ou à tout le forum du groupe.
L’abonnement s’éteint automatique quand l’utilisateur quitte le groupe. Quand il clique sur le bouton « Quitter le groupe »  dans Mon Compte->Groupe, pas en quittant la page, hé banane…
Les administrateurs peuvent abonner tous les utilisateurs au forum approprié en un seul clic.
[...]

Plus d’infos sur la page de téléchargement du plugin

Il existe aussi un autre plugin, paru avant-hier, qui fait un peu la même chose en moins poussé.
Il se trouve ici

Et pour ceux qui ne veulent pas s’encombrer inutilement de widgets, il reste le bon vieux ctrl+D quand vous êtes sur la page d’une discussion qui vous intéresse. Votre navigateur gère très vos favoris vous savez ?!!!