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;', '&', $text);
$text = str_replace('&lt;', '<', $text);
$text = str_replace('&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('&','&'), '&', $text);
$text = str_replace(''', "'", $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("|(`)(.*?)`|", 'bporg_encodeit', $text);
$text = preg_replace_callback("!(^|\n)`(.*?)`!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 !


