WordPress 自身有一个强大的 HTML 标签过滤系统,会导致在文章和评论中插入的 PHP、CSS、HTML、JS 等代码直接消失,因此需要将code
或pre
内的符号标签编码转义为 HTML 实体。
参考一
/** * 转换 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; }
参考二:
/** * 转换 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] ); }
参考三:
/** * 转换 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 = '/(<pre\s+[^>]*?class\s*?=\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 可以根据需要修改代码中的正规则匹配