Pase valor booleano en shortcode

16

En los códigos cortos de WordPress, ¿cómo puedo pasar atributos booleanos?
Ambos [shortcode boolean_attribute="true"]o [shortcode boolean_attribute=true]están dando valores de cadena.

EDITAR

No habría ningún problema para los usuarios que saben lo que están haciendo si uso el truco que fue comentado por @brasofilo. Pero algunos usuarios se perderán si otorgan un falsevalor de atributo y reciben truevalor. Entonces, ¿hay alguna otra solución?

Sodbileg Gansukh
fuente
2
Simplemente no pase el atributo y tendrá false, de lo contrario true.
brasofilo
Gracias @brasofilo. ¿Pero hay alguna otra solución? Creo que algunos usuarios se perderán si le dan un valor "falso" al atributo, pero obtendrán un valor "verdadero".
Sodbileg Gansukh

Respuestas:

14

Es fácil de usar 0y 1valora y luego encasilla dentro de la función:

[shortcode boolean_attribute='1'] o [shortcode boolean_attribute='0']

pero si lo desea, también puede verificarlo estrictamente 'false'y asignarlo a booleano, de esta manera también puede usar:

[shortcode boolean_attribute='false'] o [shortcode boolean_attribute='true']

Luego:

add_shortcode( 'shortcode', 'shortcode_cb' );

function shortcode_cb( $atts ) {
  extract( shortcode_atts( array(
    'boolean_attribute' => 1
  ), $atts ) );
  if ( $boolean_attribute === 'false' ) $boolean_attribute = false; // just to be sure...
  $boolean_attribute = (bool) $boolean_attribute;
}
gmazzap
fuente
Esa es una gran respuesta. Pero pensé que sería genial si los usuarios tuvieran una opción verdadera o falsa. Lo siento, no puedo aceptar su respuesta como aceptada.
Sodbileg Gansukh
@SodbilegGansukh este código también funciona con 'true'y'false'
gmazzap
@toscho que acabo de copiar y pegar desde el códice ;)
gmazzap
3
@SodbilegGansukh Todos los argumentos se pasan como cadenas, ya que solo se pueden ingresar (escribir) como cadenas. No hay otra manera que esta respuesta. Intente escribir un valor booleano sin cadenas ...
fuxia
28

Como extensión de la respuesta @GM (que es la única forma posible de hacer esto), aquí hay una versión ligeramente acortada / embellecida y una versión extendida (que personalmente prefiero):

Variante acortada / embellecida

Es suficiente hacer una booleanverificación del valor contenido. Si es así true, el resultado será (bool) true, de lo contrario será falso. Esto produce un caso único true, todo lo demás falseresulta.

add_shortcode( 'shortcodeWPSE', 'wpse119294ShortcodeCbA' );
function wpse119294ShortcodeCbA( $atts ) {
    $args = shortcode_atts( array(
        'boolAttr' => 'true'
    ), $atts, 'shortcodeWPSE' );

    $args['boolAttr'] = 'true' === $args['boolAttr'];
}

Variante extendida / segura para el usuario

La razón por la que prefiero esta versión es que permite al usuario escribir on/yes/1como un alias para true. Esto reduce la posibilidad de errores del usuario cuando el usuario no recuerda cuál era el valor real true.

add_shortcode( 'shortcodeWPSE', 'wpse119294ShortcodeCbA' );
function wpse119294ShortcodeCbA( $atts ) {
    $args = shortcode_atts( array(
        'boolAttr' => 'true'
    ), $atts, 'shortcodeWPSE' );

    $args['boolAttr'] = filter_var( $args['boolAttr'], FILTER_VALIDATE_BOOLEAN );
}

Notas adicionales:

1) Pase siempre el tercer argumento para shortcode_atts(). De lo contrario, el filtro de atributos de código corto es imposible de identificar.

// The var in the filter name refers to the 3rd argument.
apply_filters( "shortcode_atts_{$shortcode}", $out, $pairs, $atts );

2) Nunca lo use extract(). Incluso el núcleo quiere reducir esas llamadas. Es igualmente peor para las globalvariables, ya que los IDE no tienen la oportunidad de resolver el contenido extraído y arrojarán mensajes de falla.

emperador
fuente
1
Wow, esa es una gran respuesta. Muchas gracias. Desearía tener suficiente reputación para votar por tu respuesta. Y muchas gracias por tu consejo.
Sodbileg Gansukh
1
He votado en su nombre, Sodbileg. :)
Dero
wp_validate_boolean()La función en WordPress 4.0.0 o superior es útil para validar valores booleanos. Referencia de funciones developer.wordpress.org/reference/functions/wp_validate_boolean
Aamer Shahzad
@AamerShahzad Esta es una alternativa (en mi opinión, innecesariamente agregada) a filter_var( $var, FILTER_VALIDATE_BOOLEAN ).lo que incluso el docblock de esta función en sí dice.
Kaiser
@kaiser esto es solo para la información.
Aamer Shahzad
0

Aquí una versión simple más corta, basada en la respuesta de gmazzap:

Use '1' o '0', luego eche un doble golpe "!!" que cambia un valor de "veracidad / falsey" a su equivalente booleano

tenga en cuenta que esto NO funcionará con cadenas "verdaderas" y "falsas", solo "1" y "0"

[myshortcode myvar="0"]

myshortcodefunction( $args )
{
   $myvar = !! $args['myvar'];
   var_dump($myvar); // prints bool(false)
}
teórico
fuente