Wordpress - Pass boolean value in shortcode

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.


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