HTML实体编码不适用于esc_html()和wp_localize_script()

时间:2018-09-28 15:10:29

标签: javascript wordpress

我正在尝试使用wp_localize_script()函数传递JavaScript对象,并期望该对象中包含实体编码的字符串。下面是示例:

$params = array('str' => esc_html('this string has a < symbol and unclosed <td> tag'), 'change' => false);

wp_localize_script( 'custom_setup_js', 'custom_js_params', $params );

输出是什么?

/* <![CDATA[ */ var custom_js_params = {"str":"this string has a < symbol and unclosed <td> tag","change":""}; /* ]]> */

期望什么?

/* <![CDATA[ */
var custom_js_params = {"str":"this string has a &lt; symbol and unclosed &lt;td&gt; tag","change":""};
/* ]]> */

我在做什么错或者我误会了什么?由于我需要JavaScript对象才能在字符串中包含编码的HTML。我已经尝试过使用esc_html()函数进行相同的操作,但没有成功。

PS:字符串来自用户输入,因此需要转义。我只是跳过了它,以更轻松地说明问题。

1 个答案:

答案 0 :(得分:1)

您的HTML实体再次被解码的原因是,wp_localize_script调用了localize中的方法class.wp-scripts.php,该方法的行如下:

$l10n[$key] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8');

此外,您的字符串将传递到wp_json_encode,它将在进行PHP json_encode之前进行一些清理。

换句话说,您的字符串首先被WP清理,然后被PHP正确地转义。根据您的用例,可能没有必要进行任何其他编码或转义。