WordPress编码标准嗅探处理do_shortcode()
作为“自动转义函数”。2015年,这些GitHub问题中似乎已经讨论了这一点:
https://github.com/WordPress/WordPress-Coding-Standards/issues/167https://github.com/WordPress/WordPress-Coding-Standards/issues/428
将其添加到列表时使用的解释是:
我与VIP支持人员讨论了这一点(#44195)。David在与另一位团队成员商议后表示,这是不必要的,因为我们在HTML发出的地方(在短代码的代码中)进行转义。
但我不确定我是否同意这个推理。如果您这样使用它:
<?php echo do_shortcode( \'[liveperson]\' ); ?>
如果短代码是硬编码的,这是有意义的,因为唯一要转义的是短代码的输出,应该通过短代码回调转义。
然而,在您的情况下,您正在使用do_shortcode()
允许从自定义字段在用户提供的文本中执行短代码。该文本确实需要转义,但是do_shortcode()
不执行任何实际转义。
因此,处理此类字段的安全方法是通过wp_kses()
或wp_kses_post()
, 要删除不允许的标签,请执行do_shortcode()
这样就可以执行短代码,而无需再次转义。
$text = get_field( \'field_name\' );
echo do_shortcode( wp_kses_post( $text ) );
它不会对代码嗅探器报告什么/不报告什么产生任何影响,但至少用户提供的文本是经过清理的。
一个限制是,如果使用esc_html()
, 因为这会干扰短代码属性。这种清理也不会阻止用户输入可能影响布局的不平衡标记,这是逃避通常有帮助的一件事。为了解决这个问题,您可以添加force_balance_tags()
:
$text = get_field( \'field_name\' );
echo do_shortcode( force_balance_tags( wp_kses_post( $text ) ) );