带有布尔值和初始化的WP_LOCALIZE_SCRIPT

时间:2016-09-01 作者:l2aelba

我对wp_localize_script, 我无法得到booleanint 作为变量

wp_enqueue_script( \'helloworld\' , \'helloworld.js\', false, \'1.0.0\', true);

$site_config = array();

$site_config[\'boo\'] = (bool)true;
$site_config[\'number\'] = (int)1;

wp_localize_script( \'helloworld\' , \'site_config\' , $site_config );

Why I getting :

var site_config = {"boo":"1","number":"1"};

Why not :

var site_config = {"boo":true,"number":1};
Wordpress 4.6(最新版本)PHP 5.6.10是否已修复?https://core.trac.wordpress.org/ticket/25280 , 我做错了什么或错过了什么?

4 个回复
最合适的回答,由SO网友:l2aelba 整理而成

I just do something like this so long :

wp_add_inline_script(\'helloworld\',\'var site_config =\'.json_encode($site_config));
SO网友:birgire

为什么部分:

可以在WP_Scripts::localize() 方法:

foreach ( (array) $l10n as $key => $value ) {
    if ( !is_scalar($value) )
        continue;

    $l10n[$key] = html_entity_decode( (string) $value, ENT_QUOTES, \'UTF-8\');
}
我们注意到(string) 铸造

解决方法:

latest proposed patch 建议更换is_scalar() 具有is_string() 并移除(string) 铸造这将在自定义包装中起作用。但我认为这不是解决问题的办法,因为核心wp_scripts()->localize() 方法在将来总是可以更改的。

我还认为,通过以下方法修改数据太粗糙:

wp_scripts()->get_data( $handle, \'data\' )
以及

wp_scripts()->add_data( $handle, \'data\', $data )
如果做得好,我们最终可能会为wp_scripts()->localize() ;-)

更灵活的解决方法可能是使用core function:

wp_add_inline_script( $handle, $data, $position )` 
添加我们的动态non-string 价值观

SO网友:Faisal Ramzan

如果布尔值为true 然后它会一直回来1 或者如果布尔值为false 然后它就会回来empty 这就是为什么你1 如果true.

下面的代码在我的本地项目上进行了测试。复制并粘贴它

//Add it in **functions.php**
function load_localize_scripts() {
    wp_enqueue_script(\'localize_script\', get_template_directory_uri() . \'/js/localize_script.js\', array(), \'1.0.0\', true );
    wp_localize_script(\'localize_script\', \'localize_scripts_vars\', array(
                        \'boolean\' => true, // it will return 1 
                        \'integer\' => 10 // it will always return integre
            )
    );
}
add_action(\'wp_enqueue_scripts\', \'load_localize_scripts\');

//Add this in **localize_script.js**
jQuery(document).ready(function() {
    var site_config;
    if (localize_scripts_vars.boolean == \'1\') {
        site_config = {"boolean":\'true\',"number":localize_scripts_vars.integer};
        console.log(site_config);
    } else if (localize_scripts_vars.boolean == \'\' || localize_scripts_vars.boolean == NULL) {
        site_config = {"boolean":\'false\',"number":localize_scripts_vars.integer};
        console.log(site_config);
    };
});
您也可以看到控制台结果
enter image description here

SO网友:rassoh

如果你将布尔型数据包在一个数组中,那么它们会很干净:

$settings = [
  \'booleans\' => [
    \'foo\' => true,
    \'bar\' => false,
  ],
];
wp_localize_script(\'my-script-handle\', \'mySettings\', $settings);
将呈现:

<script type=\'text/javascript\'>
/* <![CDATA[ */
var mySettings = {"booleans":{"foo":true;"bar":false}};
/* ]]> */
</script>
然后可以从脚本中干净地访问它们:

console.log( mySettings.booleans.foo === true ); // true
console.log( mySettings.booleans.bar === false ); // true