我有一个包含对象文字的javascript工作部件。但是我需要对它进行本地化,我正在尝试找出如何重写它,以便让wp\\u localize\\u script()访问它,并输出正确的格式。
非本地化(非动态)版本如下所示:
var layoyt_config = {
\'header\' : 1
, \'footer\' : 1
, \'ls\' : {\'sb1\':1}
, \'rs\' : {\'sb1\':1,\'sb2\':1}
, \'align\' : \'center\'
};
现在,为了让这些值由php生成(基于一些wp\\U设置),我想使用wp\\U localize\\u脚本,因此我可以从这里开始:
var layoyt_config = my_localized_data.layoyt_config;
为了将数据输入到对象属性中,我“认为”我可以这样做,但显然不行:
$data = array(
\'layout_config\' => {
\'header\' : 1
, \'footer\' : 1
, \'ls\' : {\'sb1\': 1}
, \'rs\' : {\'sb1\': 1,\'sb2\': 1}
, \'align\' : \'center\'
}
);
wp_localize_script(\'my-script-handle\', \'my_localized_data\', $data);
由于这会导致PHP解析错误,我尝试将json重写为数组语法,因为wp\\u localize\\u脚本会将其转换回对象符号,但这对我也不起作用:
$data = array(
\'layout_config\' => array(
\'header\' => 1
, \'footer\' => 1
, \'ls\' => array(\'sb1\'=>1)
, \'rs\' => array(\'sb1\'=>1,\'sb2\'=>1)
, \'align\' => \'center\'
)
);
wp_localize_script(\'my-script-handle\', \'my_localized_data\', $data);
虽然这在php解析器中运行顺利,但由于我的\\u本地化了\\u数据,我在页面源代码中没有得到预期的输出。layout_config变成字符串“Array”,输出如下:
<script type=\'text/javascript\'>
/* <![CDATA[ */
var wpkit_localized_data = {
layout_config: "Array"
};
/* ]]> */
</script>
所以。。我如何才能做到这一点(或者我必须接受必须将对象“展平”为离散变量,如:
lc_header = \'1\';
ls_ls_sb1 = \'1\';
etc...
SO网友:Rarst
免责声明-我对JS安全性方面的东西太了解了。
首先,为了匹配您想要的输出,您需要通过嵌套级别进行关闭。对象名称作为本地化调用中的参数(而不是数组键):
$data = array(
\'header\' => 1
, \'footer\' => 1
, \'ls\' => array(\'sb1\'=>1)
, \'rs\' => array(\'sb1\'=>1,\'sb2\'=>1)
, \'align\' => \'center\'
);
wp_localize_script(\'my-script-handle\', \'layout_config\', $data);
但是
ls
和
rs
因为
WP_Scripts->print_scripts_l10n()
方法不处理变量为array时的情况。
我能想到的最好的修复方法是以下过滤器(如上所述-不确定在生产中使用它会有多安全,但给出总体思路):
add_filter(\'js_escape\',\'js_escape_nested\', 10, 2);
function js_escape_nested($safe_text, $text) {
if(is_array($text) )
return str_replace( \'"\', "\'", json_encode ($text) );
return $safe_text;
}