Berikan nilai boolean dalam kode pendek

16

Di WordPress shortcode, bagaimana saya bisa melewatkan atribut boolean?
Keduanya [shortcode boolean_attribute="true"]atau [shortcode boolean_attribute=true]memberikan nilai string.

EDIT

Tidak akan ada masalah bagi pengguna yang tahu apa yang mereka lakukan jika saya menggunakan trik yang dikomentari oleh @brasofilo. Tetapi beberapa pengguna akan tersesat jika mereka memberikan falsenilai atribut dan menerima truenilai. Jadi, apakah ada solusi lain?

Sodbileg Gansukh
sumber
2
Cukup jangan lulus atribut dan Anda akan memiliki false, jika tidak true.
brasofilo
Terima kasih @brasofilo. Tetapi apakah ada solusi lain? Saya pikir beberapa pengguna akan tersesat jika mereka memberikan nilai atribut "false", tetapi mereka akan mendapatkan nilai "true".
Sodbileg Gansukh

Jawaban:

14

Mudah digunakan 0dan 1menghargai dan kemudian mengetik di dalam fungsi:

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

tetapi jika mau, Anda juga dapat dengan ketat memeriksa 'false'dan menetapkannya ke boolean, dengan cara ini Anda juga dapat menggunakan:

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

Kemudian:

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;
}
gmazzap
sumber
Itu jawaban yang bagus. Tapi saya pikir akan lebih bagus jika pengguna memiliki pilihan benar atau salah. Maaf saya tidak dapat menerima jawaban Anda sebagaimana diterima.
Sodbileg Gansukh
@ SodbilegGansukh kode ini juga berfungsi dengan 'true'dan'false'
gmazzap
@toscho Saya baru saja menyalin dan menempel dari codex ;)
gmazzap
3
@SodbilegGansukh Semua argumen dilewatkan sebagai string, karena mereka dapat dimasukkan (diketik) sebagai string saja. Tidak ada cara lain selain jawaban ini. Cobalah untuk mengetik nilai boolean tanpa string…
fuxia
28

Sebagai ekstensi untuk jawaban @GM (yang merupakan satu-satunya cara yang mungkin untuk melakukan ini), inilah versi yang sedikit disingkat / dipercantik dan dan diperpanjang (yang secara pribadi saya sukai):

Varian yang dipersingkat / Dipercantik

Cukup dengan booleanmemeriksa nilai yang terkandung. Jika ya true, hasilnya akan (bool) true, kalau tidak akan salah. Ini menghasilkan satu kasus true, semua falsehasil lainnya .

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

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

Varian Diperpanjang / Aman bagi pengguna

Alasan mengapa saya lebih suka versi ini adalah karena ini memungkinkan pengguna untuk mengetik on/yes/1sebagai alias untuk true. Ini mengurangi kemungkinan kesalahan pengguna ketika pengguna tidak ingat apa nilai sebenarnya untuk trueitu.

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

    $args['boolAttr'] = filter_var( $args['boolAttr'], FILTER_VALIDATE_BOOLEAN );
}

Catatan tambahan:

1) Selalu berikan argumen ke-3 untuk shortcode_atts(). Jika tidak, filter atribut shortcode tidak dapat ditargetkan.

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

2) Jangan pernah gunakan extract(). Bahkan inti ingin mengurangi panggilan itu. Ini sama buruknya dengan globalvariabel, karena IDE tidak memiliki kesempatan untuk menyelesaikan konten yang diekstraksi dan akan melempar pesan kegagalan.

kaisar
sumber
1
Wow, itu jawaban yang bagus. Terima kasih banyak. Saya harap saya punya cukup reputasi untuk memilih jawaban Anda. Dan terima kasih banyak atas saran Anda.
Sodbileg Gansukh
1
Saya memilih atas nama Anda, Sodbileg. :)
Dero
wp_validate_boolean()fungsi di WordPress 4.0.0 atau lebih tinggi sangat membantu dalam memvalidasi nilai boolean. Referensi Fungsi developer.wordpress.org/reference/functions/wp_validate_boolean
Aamer Shahzad
@AamerShahzad Ini adalah (imho yang tidak perlu ditambahkan) alternatif untuk filter_var( $var, FILTER_VALIDATE_BOOLEAN )., apa yang bahkan menyatakan docblock dari fungsi ini sendiri.
kaiser
@kaiser ini hanya untuk informasi.
Aamer Shahzad
0

Di sini versi sederhana yang lebih pendek, yang didasarkan pada jawaban gmazzap:

Gunakan '1' atau '0', lalu gunakan double bang "!!" yang mengubah nilai "truthy / falsey" menjadi setara boolean

perhatikan ini TIDAK akan bekerja dengan string "benar" dan "salah", hanya "1" dan "0"

[myshortcode myvar="0"]

myshortcodefunction( $args )
{
   $myvar = !! $args['myvar'];
   var_dump($myvar); // prints bool(false)
}
ahli teori
sumber