WordPress 自身有一个强大的 HTML 标签过滤系统,会导致在文章和评论中插入的 PHP、CSS、HTML、JS 等代码直接消失,因此需要将code
或pre
内的符号标签编码转义为 HTML 实体。
参考一
代码语言:javascript复制/**
* 转换 code 标签中的 html 代码
* WordPress 如何在文章和评论中插入代码 - 龙笑天下
* https://www.ilxtx.com/html-entities-of-code-fragments-in-posts-and-comments.html
*/
add_filter('pre_comment_content', 'lxtx_encode_code_in_posts_comments');
add_filter('the_content', 'lxtx_encode_code_in_posts_comments');
function lxtx_encode_code_in_posts_comments($source) {
$encoded = preg_replace_callback('/<code>(.*?)</code>/ims',
create_function(
'$matches',
'$matches[1] = preg_replace(
array("/^[r|n] /i", "/[r|n] $/i"), "",
$matches[1]);
return "<code>" . esc_html( $matches[1] ) . "</code>";'
),
$source);
if ($encoded)
return $encoded;
else
return $source;
}
参考二:
代码语言:javascript复制/**
* 转换 pre 标签中的html代码
* 使用'the_content'钩子.
* @author c.bavota
* https://blog.csdn.net/tianqixin/article/details/8902677
*/
add_filter( 'the_content', 'pre_content_filter', 0 );
function pre_content_filter( $content ) {
return preg_replace_callback( '|<pre.*>(.*)</pre|isU' , 'convert_pre_entities', $content );
}
function convert_pre_entities( $matches ) {
return str_replace( $matches[1], htmlentities( $matches[1] ), $matches[0] );
}
参考三:
代码语言:javascript复制/**
* 转换 code 标签中的 html 代码
* https://gitcafe.net/archives/3693.html
*/
add_filter('pre_comment_content', 'encode_code_in_comment');
function encode_code_in_comment($source) {
$encoded = preg_replace_callback('/<code>(.*?)</code>/ims',
create_function('$matches', '$matches[1] = preg_replace(array("/^[r|n] /i", "/[r|n] $/i"), "", $matches[1]);
return "<code>" . htmlentities($matches[1]) . "</"."code>";'), $source);
if ($encoded)
return $encoded;
else
return $source;
}
//转换 pre 标签中的 html 代码
//文章和评论
function meow_prettify_esc_html($content){
$regex = '/(<pres [^>]*?classs*?=s*?[",'].*?prettyprint.*?[",'].*?>)(.*?)(</pre>)/sim';
return preg_replace_callback($regex, 'meow_prettify_esc_callback', $content);}
function meow_prettify_esc_callback($matches){
$tag_open = $matches[1];
$content = $matches[2];
$tag_close = $matches[3];
$content = esc_html($content);
return $tag_open . $content . $tag_close;}
add_filter('the_content', 'meow_prettify_esc_html', 2);
add_filter('comment_text', 'meow_prettify_esc_html', 2);
pre 和 code 可以根据需要修改代码中的正规则匹配