我正在尝试使用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 < symbol and unclosed <td> tag","change":""};
/* ]]> */
我在做什么错或者我误会了什么?由于我需要JavaScript对象才能在字符串中包含编码的HTML。我已经尝试过使用esc_html()函数进行相同的操作,但没有成功。
PS:字符串来自用户输入,因此需要转义。我只是跳过了它,以更轻松地说明问题。
答案 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正确地转义。根据您的用例,可能没有必要进行任何其他编码或转义。