21

In WordPress shortcodes, how can I pass boolean attributes?
Both of [shortcode boolean_attribute="true"] or [shortcode boolean_attribute=true] are giving string values.

EDIT

There would be no problem for users who know what they're doing if I use the trick which was commented by @brasofilo. But some users will get lost if they give an attribute false value and receive true value. So is there any other solution?

2
  • 2
    Simply don't pass the attribute and you'll have false, otherwise true.
    – brasofilo
    Oct 18, 2013 at 10:33
  • Thanks @brasofilo. But is there any other solution? I think some users will get lost if they give an attribute "false" value, but they will get "true" value. Oct 18, 2013 at 10:35

3 Answers 3

16

Is easy to use 0 and 1 values and then typecasting inside the function:

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

but if you want you can also strictly check for 'false' and assign it to boolean, in this way you can also use:

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

Then:

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;
}
6
  • 8
    Do not use extract(). :)
    – fuxia
    Oct 18, 2013 at 10:53
  • That's great answer. But I thought it would be great if users had true or false choice. Sorry I cannot accept your answer as accepted. Oct 18, 2013 at 10:53
  • @SodbilegGansukh this code works also with 'true' and 'false'
    – gmazzap
    Oct 18, 2013 at 10:56
  • @toscho I just copied and pasted from codex ;)
    – gmazzap
    Oct 18, 2013 at 10:57
  • 3
    @SodbilegGansukh All arguments are passed as strings, because they can be entered (typed) as strings only. There is no other way than this answer. Try to type a stringless boolean value …
    – fuxia
    Oct 18, 2013 at 10:59
32

As an extension to @G.M. answer (which is the only possible way to do this), here's a slightly shortened/beautified and and an extended version (which I personally prefer):

Shortened/Beautified variant

It's enough to do a boolean check for the contained value. If it's true, the result will be (bool) true, else it will be false. This produces a one case true, everything else false result.

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

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

Extended/User-safe variant

The reason why I prefer this version is that it allows the user to type in on/yes/1 as an alias for true. This reduces the chance for user errors when the user doesn't remember what the actual value for true was.

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

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

Additional notes:

1) Always pass the 3rd argument for shortcode_atts(). Else the shortcode attributes filter is impossible to target.

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

2) Never use extract(). Even core wants to reduce those calls. It's equally worse to global variables, as IDEs don't stand a chance to resolve the extracted contents and will throw failure messages.

6
  • 1
    Wow, that's a great answer. Thank you so much. I wish I had enough reputation to vote up for your answer. And thank you so much for your advice. Oct 18, 2013 at 11:16
  • 1
    I voted on your behalf, Sodbileg. :)
    – Dero
    Oct 18, 2013 at 11:50
  • wp_validate_boolean() function in WordPress 4.0.0 or above is helpful in validating boolean values. Function Reference developer.wordpress.org/reference/functions/wp_validate_boolean Sep 8, 2018 at 6:34
  • @AamerShahzad This is a (imho unnecessarily added) alternative to filter_var( $var, FILTER_VALIDATE_BOOLEAN )., what even the docblock of this function itself states.
    – kaiser
    Sep 8, 2018 at 19:53
  • @kaiser this is just for the information. Sep 10, 2018 at 13:41
0

Here a shorter simple version, building on gmazzap's answer:

Use '1' or '0', then cast using a double bang "!!" which changes a "truthy/falsey" value to it's boolean equivalent

note this will NOT work with "true" and "false" strings, only "1" and "0"

[myshortcode myvar="0"]

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.