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?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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;
}
Method 2
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.
Method 3
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)
}
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0