我的用户在注释中发布代码片段。我为此创建了一个快捷码:
function post_codigo($atts,$content=""){
return \'<code>\'.$content.\'</code>\';
}
add_shortcode(\'codigo\',\'post_codigo\');
问题是html在打包到代码标记之前会被过滤掉。
我想如果我能在过滤器之前运行短代码,那么我可以使用
function pre_esc_html($content) {
return preg_replace_callback(
\'#(<code.*?>)(.*?)(</code>)#imsu\',
create_function(
\'$i\',
\'return $i[1].esc_html($i[2]).$i[3];\'
),
$content
);
}
add_filter(
\'the_content\',
\'pre_esc_html\',
9
);
我在这附近找到的。你怎么想的?
更新:好,现在我将我的快捷码更改为:
function post_codigo($atts,$content=""){
return \'<code>\'.esc_html($content).\'</code>\';
}
add_shortcode(\'codigo\',\'post_codigo\');
但它仍然添加了中断,并将整个代码分解为几个部分
标签
最合适的回答,由SO网友:goldenapples 整理而成
可以过滤阵列$no_texturize_shortcodes, 它是从wptexturize中排除的短代码的集合。如果你这样做[codigo]
不会对短代码标记进行纹理化:
add_filter( \'no_texturize_shortcodes\', \'no_texturize_codigo_shortcode\' );
function no_texturize_codigo_shortcode( $excluded_shortcodes ) {
$excluded_shortcodes[] = \'codigo\';
return $excluded_shortcodes;
}
SO网友:Simon
这个no_texturize_shortcodes
filter没有为我做任何事情,因为短代码中的内容已经被wpautop()
以及任何其他连接到the_content
. 我求助于更改do_shortcode
关于the_content
, 所以我可以确定它是两个中的第一个。方法如下:
remove_filter(\'the_content\', \'do_shortcode\', 11); // AFTER wpautop()
add_filter(\'the_content\', \'do_shortcode\', 9); // BEFORE wpautop()
这似乎效果相当不错,但由于这对WordPress处理文本/html转换的方式有很大的改变,我建议您谨慎使用。我猜,您使用的插件/短代码越多,就越有可能遇到与此更改相关的问题。