事实证明WordPress shortcode系统使用函数shortcode_parse_atts($text);
解析短代码条目以检索属性的名称和值,并将它们成对存储在数组中$atts
, 然后传递给shortcode函数。因此,在您的情况下,在shortcode函数中添加转义操作如下:
$aps_person_description = esc_html($atts[\'aps_person_description\']);
将不起作用,因为
shortcode_parse_atts()
已经检索了属性的名称和值,并且可能错误地解释了属性值中的引号。
要仔细观察,请使用函数shortcode_parse_atts()
使用此正则表达式模式:
/(\\w+)\\s*=\\s*"([^"]*)"(?:\\s|$)|(\\w+)\\s*=\\s*\\\'([^\\\']*)\\\'(?:\\s|$)|(\\w+)\\s*=\\s*([^\\s\\\'"]+)(?:\\s|$)|"([^"]*)"(?:\\s|$)|(\\S+)(?:\\s|$)/
要按以下格式识别属性的名称和值,请执行以下操作:
1. attr1="value1"
2. attr2=\'value2\'
3. attr3=value3
4. "value4"
5. value5
因此,如果用户在值中加引号,很容易出错。例如:
[my_shortcode dog=\'Santa\'s Little Helper\' /]
// $attr is Array ( [0] => dog=\'Santa\'s [1] => Little [2] => Helper\' )
// should be Array ( [dog] => Santa\'s Little Helper )
解析之后的清理显然为时已晚,那么在解析之前的清理呢?我们必须清理整个条目,因为我们还没有任何要处理的属性值。但这也会导致问题,例如:
html_entities("[my_shortcode dog=\'Santa\'s Little Helper\' /]", ENT_QUOTES);
// now entry is [my_shortcode dog='Santa's Little Helper' /]
// after parsing:
Array
(
[dog] => 'Santa's
[0] => Little
[1] => Helper'
)
矛盾之处在于:为了确保解析引擎正确解析,必须清理属性值;但要做到这一点,您必须首先运行解析引擎来获取值。
总之,我认为确保一切正常的合理方法是确保用户以适当的格式输入属性,一旦用户发布格式不好的属性,这将是一个很大的头痛问题。仅供参考,我的经验是$content
. 如果是你,我会aps_person_description
在$content
, 可能是这样的:
[my_shortcode]some text here with "quotes" so it stops the attribute....[/my_shortcode]
报价也不会那么麻烦。