最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

customization - Pass boolean value in shortcode

programmeradmin0浏览0评论

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?

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?

Share Improve this question edited Oct 18, 2013 at 10:49 Sodbileg Gansukh asked Oct 18, 2013 at 10:32 Sodbileg GansukhSodbileg Gansukh 6133 gold badges7 silver badges19 bronze badges 2
  • 2 Simply don't pass the attribute and you'll have false, otherwise true. – brasofilo Commented 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. – Sodbileg Gansukh Commented Oct 18, 2013 at 10:35
Add a comment  | 

3 Answers 3

Reset to default 17

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

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.

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)
}
发布评论

评论列表(0)

  1. 暂无评论