wp_localize_script con boolean e init

2

Tengo un problema con wp_localize_script , que no puedo obtener boolean y int como variable

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 );

Por qué me sale:

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

Por qué no:

var site_config = {"boo":true,"number":1};
  • Wordpress 4.6 (más reciente)
  • PHP 5.6.10

¿No se arregla? enlace , ¿hago algo mal o me falta algo?

    
pregunta l2aelba 01.09.2016 - 11:19

3 respuestas

1

Solo hago algo como esto por mucho tiempo:

wp_add_inline_script('helloworld','var site_config ='.json_encode($site_config));
    
respondido por el l2aelba 05.09.2016 - 13:33
2

Por qué parte:

La parte Por qué se puede encontrar dentro del método 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');
}

donde notamos el (string) casting.

Soluciones:

El último parche propuesto sugiere reemplazar is_scalar() con is_string() y eliminar el (string) cast. Eso funcionaría, por ejemplo. en un envoltorio personalizado. Pero no creo que sea el camino a seguir, porque el método core wp_scripts()->localize() siempre puede cambiar en el futuro.

También creo que es demasiado difícil modificar los datos a través de los métodos:

wp_scripts()->get_data( $handle, 'data' )

y

wp_scripts()->add_data( $handle, 'data', $data )

Haciéndolo correctamente, podríamos terminar escribiendo un contenedor duplicado para wp_scripts()->localize() ;-)

Una solución alternativa más flexible podría ser utilizar la función principal :

wp_add_inline_script( $handle, $data, $position )' 

para agregar nuestros valores dinámicos sin cadena .

    
respondido por el birgire 01.09.2016 - 11:31
1

Si el valor booleano es verdadero , devolverá siempre 1 o si el valor booleano es falso , devolverá vacío es por eso que obtienes 1 en caso de true .

El código de abajo está probado en mi proyecto local. Cópialo y pégalo exactamente

//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);
    };
});

También puede ver el resultado de la consola

    
respondido por el Faisal Ramzan 01.09.2016 - 12:19

Lea otras preguntas en las etiquetas