Truyền giá trị boolean trong shortcode


16

Trong WordPress shortcodes, làm thế nào tôi có thể vượt qua các thuộc tính boolean?
Cả hai [shortcode boolean_attribute="true"]hoặc [shortcode boolean_attribute=true]đang đưa ra các giá trị chuỗi.

BIÊN TẬP

Sẽ không có vấn đề gì với những người dùng biết họ đang làm gì nếu tôi sử dụng thủ thuật được bình luận bởi @brasofilo. Nhưng một số người dùng sẽ bị mất nếu họ đưa ra một falsegiá trị thuộc tính và nhận truegiá trị. Vậy có giải pháp nào khác không?


2
Đơn giản là đừng vượt qua thuộc tính và falsenếu không, bạn sẽ có true.
brasofilo

Cảm ơn @brasofilo. Nhưng có giải pháp nào khác không? Tôi nghĩ rằng một số người dùng sẽ bị mất nếu họ đưa ra một giá trị "sai" thuộc tính, nhưng họ sẽ nhận được giá trị "đúng".
Sodbileg Gansukh

Câu trả lời:


14

Rất dễ sử dụng 01các giá trị và sau đó đánh máy bên trong hàm:

[shortcode boolean_attribute='1'] hoặc là [shortcode boolean_attribute='0']

nhưng nếu bạn muốn, bạn cũng có thể kiểm tra nghiêm ngặt 'false'và gán nó cho boolean, bằng cách này bạn cũng có thể sử dụng:

[shortcode boolean_attribute='false'] hoặc là [shortcode boolean_attribute='true']

Sau đó:

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


Đó là câu trả lời tuyệt vời. Nhưng tôi nghĩ sẽ thật tuyệt nếu người dùng có lựa chọn đúng hay sai. Xin lỗi tôi không thể chấp nhận câu trả lời của bạn như được chấp nhận.
Sodbileg Gansukh

@SodbilegGansukh mã này cũng hoạt động với 'true''false'
gmazzap

@toscho Tôi vừa sao chép và dán từ codex ;)
gmazzap

3
@SodbilegGansukh Tất cả các đối số được truyền dưới dạng chuỗi, bởi vì chúng chỉ có thể được nhập (gõ) dưới dạng chuỗi. Không có cách nào khác ngoài câu trả lời này. Hãy thử gõ một giá trị boolean không
fuxia

28

Là một phần mở rộng cho câu trả lời @GM (đây là cách khả thi duy nhất để làm điều này), đây là một phiên bản rút gọn / làm đẹp và một phiên bản mở rộng (mà cá nhân tôi thích):

Biến thể rút gọn / làm đẹp

Nó đủ để booleankiểm tra giá trị chứa. Nếu nó true, kết quả sẽ là (bool) true, nếu không nó sẽ là sai. Điều này tạo ra một trường hợp true, tất cả mọi thứ khác falsekết quả.

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

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

Biến thể mở rộng / an toàn cho người dùng

Lý do tại sao tôi thích phiên bản này là vì nó cho phép người dùng nhập vào on/yes/1dưới dạng bí danh true. Điều này làm giảm cơ hội lỗi người dùng khi người dùng không nhớ giá trị thực sự truelà bao nhiêu.

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

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

Ghi chú bổ sung:

1) Luôn vượt qua đối số thứ 3 cho shortcode_atts(). Khác bộ lọc thuộc tính shortcode là không thể nhắm mục tiêu.

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

2) Không bao giờ sử dụng extract(). Ngay cả cốt lõi muốn giảm những cuộc gọi đó. Điều đó cũng tệ hơn đối với globalcác biến, vì các IDE không có cơ hội giải quyết các nội dung được trích xuất và sẽ ném các thông báo lỗi.


1
Wow, đó là một câu trả lời tuyệt vời. Cảm ơn bạn rất nhiều. Tôi ước tôi có đủ danh tiếng để bỏ phiếu cho câu trả lời của bạn. Và cảm ơn bạn rất nhiều vì lời khuyên của bạn.
Sodbileg Gansukh

1
Tôi đã bỏ phiếu thay mặt bạn, Sodbileg. :)
Dero

wp_validate_boolean()Hàm trong WordPress 4.0.0 trở lên rất hữu ích trong việc xác thực các giá trị boolean. Chức năng Nhà phát triển
khảo.wordpress.org/

@AamerShahzad Đây là một thay thế (imho không cần thiết) filter_var( $var, FILTER_VALIDATE_BOOLEAN )., thậm chí cả docblock của chính chức năng này.
kaiser

@kaiser đây chỉ là thông tin.
Aamer Shahzad

0

Đây là một phiên bản đơn giản ngắn hơn, dựa trên câu trả lời của gmazzap:

Sử dụng '1' hoặc '0', sau đó sử dụng tiếng nổ kép "!!" làm thay đổi giá trị "trung thực / chim ưng" thành giá trị tương đương boolean

lưu ý điều này sẽ KHÔNG hoạt động với các chuỗi "đúng" và "sai", chỉ "1" và "0"

[myshortcode myvar="0"]

myshortcodefunction( $args )
{
   $myvar = !! $args['myvar'];
   var_dump($myvar); // prints bool(false)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.