web-dev-qa-db-ja.com

ショートコードでブール値を渡す

WordPressのショートコードで、ブール属性を渡すにはどうすればいいですか?
[shortcode boolean_attribute="true"][shortcode boolean_attribute=true]の両方が文字列値を与えています。

編集

@brasofiloによってコメントされたトリックを使用すれば、自分が何をしているのかを知っているユーザーにとって問題はありません。しかし、属性falseの値を与えてtrueの値を受け取ると、一部のユーザーは迷子になります。他に解決策はありますか?

14

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

@ G.Mの拡張として。答え(これをするための唯一の可能な方法です)、ここでは少し短くした/美しくした、そして拡張版(私は個人的に好みます):

短縮/美化バリアント

含まれている値をbooleanチェックするだけで十分です。もしそれがtrueなら、結果は(bool) trueになり、そうでなければfalseになります。これは1つのケースtrueを生成し、それ以外はfalseをもたらします。

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

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

拡張/ユーザーセーフな亜種

私がこのバージョンを好む理由は、ユーザーがtrueのエイリアスとしてon/yes/1を入力できることです。これにより、ユーザーが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()には常に3番目の引数を渡します。そうでなければ、ショートコード属性フィルターはターゲットにすることが不可能です。

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

2)extract()を使わないでください。コアでさえもこれらの呼び出しを減らすことを望んでいます。 IDEは抽出された内容を解決する機会がなく、失敗のメッセージを投げるので、変数globalも同様に悪いです。

27
kaiser