ส่งค่าบูลีนในรหัสย่อ


16

ในรหัสย่อของ WordPress ฉันจะส่งแอตทริบิวต์บูลีนได้อย่างไร
ทั้งสองอย่าง[shortcode boolean_attribute="true"]หรือ[shortcode boolean_attribute=true]กำลังให้ค่าสตริง

แก้ไข

จะไม่มีปัญหาสำหรับผู้ใช้ที่รู้ว่าพวกเขากำลังทำอะไรหากฉันใช้เคล็ดลับซึ่งถูกคอมเม้นต์โดย @brasofilo แต่ผู้ใช้บางคนจะหลงทางถ้าพวกเขาให้falseค่าคุณลักษณะและรับtrueค่า มีวิธีอื่นอีกไหม?


2
เพียงแค่ไม่ผ่านแอตทริบิวต์และคุณจะมีมิฉะนั้นfalse true
brasofilo

ขอบคุณ @brasofilo แต่มีวิธีแก้ปัญหาอื่น ๆ อีกไหม? ฉันคิดว่าผู้ใช้บางคนจะหลงทางหากพวกเขาให้ค่าแอตทริบิวต์ "false" แต่พวกเขาจะได้รับค่า "จริง"
Sodbileg Gansukh

คำตอบ:


14

ใช้งานง่าย0และมี1คุณค่าจากนั้นพิมพ์ซ้ำภายในฟังก์ชั่น:

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


นั่นเป็นคำตอบที่ยอดเยี่ยม แต่ฉันคิดว่ามันจะยอดเยี่ยมถ้าผู้ใช้มีตัวเลือกจริงหรือเท็จ ขออภัยฉันไม่สามารถยอมรับคำตอบของคุณตามที่ยอมรับ
Sodbileg Gansukh

@SodbilegGansukh รหัสนี้ใช้ได้กับ'true'และ'false'
gmazzap

@toscho ฉันเพิ่งคัดลอกและวางจากcodex ;)
gmazzap

3
@SodbilegGansukh อาร์กิวเมนต์ทั้งหมดถูกส่งผ่านเป็นสตริงเนื่องจากสามารถป้อน (พิมพ์) เป็นสตริงเท่านั้น ไม่มีทางอื่นนอกจากคำตอบนี้ ลองพิมพ์ค่าบูลีนแบบไม่มีสตริง ...
fuxia

28

ในฐานะที่เป็นส่วนขยายของคำตอบ @GM (ซึ่งเป็นวิธีเดียวที่เป็นไปได้ในการทำเช่นนี้) นี่คือย่อ / สวยงามเล็กน้อยและเป็นรุ่นขยาย (ซึ่งฉันชอบเอง):

สั้นลง / ตัวแปรที่สวยงาม

มันเพียงพอที่จะทำการbooleanตรวจสอบค่าที่มีอยู่ ถ้าเป็นtrueเช่นนั้นผลลัพธ์จะเป็น(bool) trueเช่นนั้นมิฉะนั้นจะเป็นเท็จ สิ่งนี้ก่อให้เกิดกรณีเดียวtrueทุกอย่างเป็นfalseผล

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

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

ตัวแปรเพิ่มเติม / ปลอดภัยสำหรับผู้ใช้

เหตุผลที่ผมชอบรุ่นนี้ก็คือว่ามันจะช่วยให้ผู้ใช้สามารถพิมพ์ในเป็นชื่อแทนสำหรับ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 ไม่มีโอกาสแก้ไขเนื้อหาที่แตกแล้วและจะส่งข้อความความล้มเหลว


1
ว้าวนั่นเป็นคำตอบที่ดี ขอบคุณมาก. ฉันหวังว่าฉันจะมีชื่อเสียงพอที่จะลงคะแนนสำหรับคำตอบของคุณ และขอบคุณมากสำหรับคำแนะนำของคุณ
Sodbileg Gansukh

1
ฉันลงคะแนนในนามของคุณ Sodbileg :)
Dero

wp_validate_boolean()ฟังก์ชั่นใน WordPress 4.0.0 ขึ้นไปมีประโยชน์ในการตรวจสอบค่าบูลีน การอ้างอิงฟังก์ชั่นdeveloper.wordpress.org/reference/functions/wp_validate_boolean
Aamer Shahzad

@AamerShahzad นี่เป็นทางเลือก (เพิ่ม imho โดยไม่จำเป็น) filter_var( $var, FILTER_VALIDATE_BOOLEAN ).สิ่งที่แม้แต่ docblock ของฟังก์ชั่นนี้เองก็ระบุ
ไกเซอร์

@kaiser นี่เป็นเพียงข้อมูล
Aamer Shahzad

0

นี่เป็นเวอร์ชั่นง่าย ๆ ที่สั้นกว่าสร้างตามคำตอบของ gmazzap:

ใช้ '1' หรือ '0' จากนั้นจึงใช้ปุ่มปังคู่ "!!" ซึ่งเปลี่ยนค่า "ความจริง / เท็จ" เป็นค่าบูลีนที่เทียบเท่า

โปรดทราบว่าสิ่งนี้จะไม่ทำงานกับสตริง "true" และ "false" เพียง "1" และ "0"

[myshortcode myvar="0"]

myshortcodefunction( $args )
{
   $myvar = !! $args['myvar'];
   var_dump($myvar); // prints bool(false)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.