¿Cómo se pasa un valor booleano a wp_localize_script [duplicado]

2

¿Cuál es la mejor manera de pasar un boolean a wp_localize_script a partir de lo que puedo ver, todo se interpreta como cadenas.

Tengo un formulario de opciones de usuario backend para un complemento, cuando los valores se devuelven, los estoy usando para un script jQuery, uno de ellos es un booleano, el usuario selecciona verdadero o falso de un menú desplegable, usando wp_localize_script los obtiene como cadenas (no booleanos) "true" o "false" que fallarán ese parámetro en el script.

<?php

  $options = get_option('ng_slicknavmenu');
  // Add PHP plugin variables to the $params[] array to pass to jQuery
  $data = array (
    'ng_slicknav_menu'         => $options['ng_slicknav_menu'],
    'ng_slicknav_parent_links' => $options['ng_slicknav_parent_links'], // this is a boolean true/false
    'ng_slicknav_speed'        => $options['ng_slicknav_speed'] ,
  );

  // Pass PHP variables to jQuery script
  wp_localize_script( 'slickinit', 'phpVars', $data );

Así es como lo estoy haciendo en este momento en mi archivo js init

   if( phpVars.ng_slicknav_parent_links === "true" )
        $links = true;
    else
        $links = false;


jQuery(document).ready(function($){

ng_slicknav_speedInt = parseInt(phpVars.ng_slicknav_speed, 10);

jQuery(document).ready(function($) {
            $(phpVars.ng_slicknav_menu).slicknav({
                allowParentLinks: $links,
                duration:ng_slicknav_speedInt,
            });
            });
 });

¿Pero hay una mejor manera?

He probado algunas soluciones de Pasando valores booleanos con wp_localize_script ...

'ng_slicknav_parent_links' => ($options['ng_slicknav_parent_links']) ? true : false,

y

'ng_slicknav_parent_links' => (bool)$options['ng_slicknav_parent_links'],

Pero la respuesta no funciona. Las respuestas allí para ambos resultan en una cadena de "1" para ambos valores que es incorrecta.

    
pregunta neilgee 03.05.2015 - 03:54

1 respuesta

4

Lamentablemente, wp_localize_script() lanza todos los escalares (tipos simples) en la matriz pasada a las cadenas (¡¿y luego ejecuta html_entity_decode() en ellos ?!), por lo que los cambios mencionados por la respuesta que usted cita & @TheDeadMedic obtendrá stringified "1" / "" si es booleano y numera cadenas si es ints, que no funcionará con complementos de javascript que exigen valores exactos.

Una forma de evitarlo es poner tus argumentos en una matriz dentro de la matriz pasada, luego no se dañan, por ejemplo:

$data = array (
    'ng_slicknav' => array(
        'menu'         => $options['ng_slicknav_menu'],
        'parent_links' => (bool) $options['ng_slicknav_parent_links'],
        'speed'        => (int) $options['ng_slicknav_speed'] ,
    ),
);

Y puedes consultarlos directamente en tu javascript:

jQuery(document).ready(function($) {
    $(phpVars.ng_slicknav.menu).slicknav({
        allowParentLinks: phpVars.ng_slicknav.parent_links,
        duration:phpVars.ng_slicknav.speed,
    });
});
    
respondido por el bonger 03.05.2015 - 22:09

Lea otras preguntas en las etiquetas