将对象/JSON传递给wp_LOCALIZE_SCRIPT

时间:2011-02-06 作者:mikkelbreum

我有一个包含对象文字的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...

2 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

的确wp_localize_script() is simple, 它只是在值周围添加引号并转义内容,希望所有值都是字符串。

然而l10n_print_after 阵列的键,将在没有任何干扰的情况下打印。它可以用于在传递字符串后执行任意代码。您可以使用它来传递额外的数据。

$data = array(
    \'layout_config\' => {
      \'ls\' : {\'sb1\': 1}
    }
);
$reshuffled_data = array(
    \'l10n_print_after\' => \'my_localized_data = \' . json_encode( $data ) . \';\'
);
wp_localize_script(\'my-script-handle\', \'my_localized_data\', $reshuffled_data);
您将得到如下代码:

var my_localized_data = {}; // What is left of your array
my_localized_data = {\'layout_config\': {\'ls\': {\'sb1\': 1}}}; // From l10n_print_after

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);
但是lsrs 因为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;
}

结束