问题描述

在 WordPress 短码中,我如何传递布尔属性? [shortcode boolean_attribute="true"][shortcode boolean_attribute=true]都提供字符串值。

编辑

如果我使用 @brasofilo 评论的伎俩,知道他们正在做什么的用户将没有问题。但是如果一个用户给出了一个属性 false 的值并且接收到 true 的值,一些用户就会丢失。那么还有其他解决方案吗?

最佳解决方案

很容易使用 01 值,然后在类型转换内的功能:

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

但是如果你想要也可以严格检查'false'并将其分配给布尔值,这样也可以使用:

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

然后:

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

次佳解决方案

作为 @ G.M 的扩展。答案 (这是唯一可能的方法),这里稍微缩短/美化和扩展版本 (我个人更喜欢):

缩短/美化变体

boolean 检查包含的值是足够的。如果是 true,结果将为 (bool) true,否则为 false 。这产生一个案例 true,其他一切 false 的结果。

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

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

扩展/User-safe 变体

我喜欢这个版本的原因是它允许用户输入 on/yes/1 作为 true 的别名。当用户不记得 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 );
}

补充笔记:

1) 始终通过 shortcode_atts()的第三个参数。否则,短码属性过滤器是不可能的目标。

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

2) 切勿使用 extract()。即使是核心想减少这些电话。 global 变量同样更糟,因为 IDE 不能有机会解析提取的内容,并会丢失失败消息。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。