Câu trả lời được chấp nhận ở đây là cả sai và đúng. Cụm từ:
"WordPress loại bỏ bất kỳ atts nào không được mặc định"
chỉ đúng chỉ củashortcode_atts
chức năng và không phải là chức năng WP shortcode như một toàn thể.
Nếu bạn nhìn vào đoạn mã dưới đây:
add_shortcode( 'paragraph', 'custom_shortcode_paragraph' );
function custom_shortcode_paragraph( $atts ) {
// Attribute Defaults Function
$atts = shortcode_atts(
array(
'last' => false,
),
$atts
);
$isLast = $atts['last'] !== false;
}
Việc sử dụng shortcode như thế nào [paragraph last] something [/paragraph]
sẽ luôn có giá trị false
cho$isLast
var.
Vấn đề là khi shortcode_atts
hàm chạy, nó sẽ loại bỏ các thuộc tính không có giá trị. Tuy nhiên, họ hoàn toàn trong $atts
mảng trước thời điểm đó. Một var_dump
trong $atts
những dòng đầu tiên của custom_shortcode_paragraph
hàm sẽ tạo ra:
array(1) {
[0]=>
string(4) "last"
}
Vì vậy, số 0 mục thứ trong mảng là một chuỗi tên thuộc tính buộc phải viết thường.
Thay vào đó, hãy thay đổi mã thành như sau:
add_shortcode( 'paragraph', 'custom_shortcode_paragraph' );
function custom_shortcode_paragraph( $atts ) {
// look for the existance of the string 'last' in the array
$last = in_array('last', $atts); // $last is now a boolean
// Attribute Defaults Function
$atts = shortcode_atts(
array(
'last' => $last, // default to true if the attribute existed valueless
),
$atts
);
$isLast = $atts['last'] !== false;
}
Bây giờ bạn có $atts['last'] === true && $isLast === true
mã ngắn:
[paragraph last] something [/paragraph]
nếu bạn kết thúc việc thêm một giá trị thì shortcode:
[paragraph last="any value at all"] something [/paragraph]
sẽ năng suất $atts['last'] === "any value at all" && $isLast === true
. $last
sẽ là false
vì $atts
mảng trong đầu có nội dung:
array(1) {
["last"]=>
string(16) "any value at all"
}
Vì vậy, giá trị của mục mảng không còn là tên thuộc tính và in_array('last', $atts) === false
vì vậy giá trị mặc định shortcode_atts
là sai. nhưng đó chỉ là một mặc định được ghi đè bởi giá trị thực tế any value at all
và sau đó $atts['last'] !== false
là true
bởi vì "any value at all" !== false
.
Tất cả đã nói, tôi nghĩ rằng điều này làm những gì bạn muốn và có khả năng phục hồi lỗi người dùng.