Problem:出于安全原因,Wordpress multisite仅允许管理员帐户在html中包含图像。可以安装一个关闭这些限制的插件,但它显然会打开一大堆安全漏洞,所以我宁愿避免这种情况。我已经有了bbpress bbcode
和bbpress shortcode whitelist
已安装插件,这意味着用户可以使用[img]http://some.url/to/an/image[/img]
. 然而,在缺少用于wordpress评论的良好bbcode工具栏的情况下,我还想使用MDC Comment Toolbar
插件,它使用html插入图像。因为在单个站点安装中,作者可以在评论中包含html,所以会显示“添加媒体”按钮。但由于其多站点,因此会将其删除。
Partial Solution:我突然想到要编写一个插件,使用preprocess_comment
要查找的挂钩img
html标记并将其转换为bbcodes。但到目前为止,我正在努力让这项工作发挥作用。以下是我的插件到目前为止的内容。它使用XSLTProcessor
但我愿意接受其他想法。。。
function html2bbcode( $commentdata ) {
$xhtml = $commentdata[\'comment_content\'];
$xsl = <<<\'EOB\'
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text">
<xsl:template match="img">[img="<xls:value-of select="@alt"/>"]<xls:value-of select="@src"/>[/img]</xsl:template>
</xsl:stylesheet>
EOB;
$xmldoc = DOMDocument::loadHTML($xhtml);
$xsldoc = DOMDocument::loadXML($xsl);
$proc = new XSLTProcessor();
$proc->registerPHPFunctions();
$proc->importStyleSheet($xsldoc);
$xhtml = $proc->transformToXML($xmldoc);
$commentdata[\'comment_content\'] = $xhtml;
return $commentdata;
}
add_filter( \'preprocess_comment\' , \'html2bbcode\' );
我真的不相信我的xsl是对的。无论输入什么,它似乎都会生成一个空字符串。但解决方案不一定要使用xsl。任何有用的东西。
最合适的回答,由SO网友:AntonChanning 整理而成
我最终用一种稍微不同的方法解决了这个问题。这允许用户在评论中包含图像。我还有一个问题,这确实是一个全新的问题,但在这里值得一提的是,可能不允许用户将新图像上传到帖子中,而只包括库中已有的图像。
function html2bbcode( $commentdata ) {
if(!is_admin()) {
$xhtml = $commentdata[\'comment_content\'];
$parsed_comment = \'\';
$dom = new DOMDocument();
$dom->loadHTML($xhtml);
$img_tags = $dom->getElementsByTagName(\'img\');
foreach ($img_tags as $img) {
$src = (string) $img->getAttribute(\'src\');
if($src == \'\') {
// No image src, no worries.
} else {
$src = str_replace(\'"\', "", $src);
$alt = (string) $img->getAttribute(\'alt\');
$img_class = (string) $img->getAttribute(\'class\');
$bbcode = \' [img=\'.$alt.\']\'.$src.\'[/img] \';
$divNode = $dom->createElement(\'div\');
$textNode = $dom->createTextNode($bbcode);
$divNode->appendChild($textNode);
$img->parentNode->replaceChild($divNode, $img);
}
}
$parsed_comment = $dom->saveHTML();
$parsed_comment = str_replace(\'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">\',\'\',$parsed_comment);
$commentdata[\'comment_content\'] = $parsed_comment;
}
return $commentdata;
}
add_filter( \'preprocess_comment\' , \'html2bbcode\' );