Shortcode thuộc tính trống


7

Có cách nào để tạo một thuộc tính trống cho shortcode không?

Thí dụ:

function paragraph_shortcode( $atts, $content = null ) {

   return '<p class="super-p">' . do_shortcode($content) . '</p>';
}

add_shortcode('paragraph', 'paragraph_shortcode'); 

Kiểu người dùng

[đoạn] một cái gì đó [/ đoạn]

và nó cho thấy

<p class="super-p"> something </p>

Làm cách nào để thêm chức năng thuộc tính trống vào mã đầu tiên của tôi? Vì vậy, khi người dùng gõ

[đoạn cuối] một cái gì đó [/ đoạn]

Nó sẽ xuất ra:

<p class="super-p last"> something </p>

Tôi tin rằng thêm một:

extract( shortcode_atts( array(
            'last' => '',
        ), $atts ) );

là một khởi đầu tốt, nhưng làm thế nào để kiểm tra xem người dùng có sử dụng thuộc tính "cuối cùng" trong khi nó không có giá trị không?

Câu trả lời:


1

Có thể có một vài cách để làm điều này. Thật không may, tôi không nghĩ bất kỳ điều gì sẽ dẫn đến chính xác những gì bạn sẽ làm. ( [paragraph last])

  1. Bạn chỉ có thể tạo các mã ngắn riêng biệt để [paragraph_first] [paragraph_last] [paragraph_foobar]xử lý nội dung $ mà không cần bất kỳ thuộc tính nào

  2. Bạn có thể đặt giá trị mặc định cuối cùng falsethay vì '', sau đó yêu cầu người dùng thực hiện[paragraph last=""]content[/paragraph]

  3. Bạn có thể thêm một thuộc tính có ý nghĩa hơn như positionsau đó có thể được sử dụng như [paragraph position="first"]hoặc[paragraph position="last"]

Vì thực tế là WordPress loại bỏ bất kỳ hành vi nào không được mặc định và thực tế là một att không có ="value"giá trị mặc định giống như nếu nó không được liệt kê, tôi không thấy cách nào để đạt được[paragraph last]

Hy vọng rằng một trong 3 cách giải quyết của tôi sẽ hữu ích. Chúc may mắn!


13

WordPress không loại bỏ các thuộc tính mà không có các giá trị như được đề xuất bởi SethMerrick, nhưng nó không xử lý nó như bạn mong đợi. Trong ví dụ của bạn, bạn sẽ không thể kiểm tra isset($atts['last']), nhưng "lần cuối" được truyền dưới dạng giá trị cho thuộc tính không tên. Trong trường hợp này, điều này sẽ dẫn đến TRUE : ($atts[0] == 'last'). Vì vậy, bạn có thể thực hiện một vòng lặp foreach để kiểm tra bất kỳ thuộc tính nào có giá trị "cuối cùng".


1
Đây là cách tôi xây dựng shortcodes cho khách hàng thường xuyên. Dễ gõ, dễ kiểm tra.
fuxia

1
+1 để thực sự trả lời câu hỏi. (Cách giải quyết của SethMerrick chắc chắn là hợp lý, nhưng bỏ lỡ chức năng được mô tả trong câu hỏi.) @Toscho - Bạn sử dụng mã nào để làm điều này? Cách nào để chia sẻ? (Có thể được đăng dưới dạng một câu trả lời riêng biệt.)
supertrue

Câu trả lời này đặc biệt sẽ áp dụng đối với ví dụ trên, nhưng nó không phải là thực sự là một câu trả lời tốt vì một thực hiện của nó sẽ thất bại trong việc phân biệt [example last]từ [example whatever="last"], vì nó sẽ kiểm tra giá trị và bỏ qua của chỉ số.
M Miller

Giải pháp tuyệt vời. Câu trả lời được chọn không thực sự giải quyết được câu hỏi như của bạn, mặc dù nó có một số lựa chọn thay thế hợp lệ.
Mike

7

Khi [example attr1="value1" attr2 attr3="value3" attr4]được phân tích cú pháp, $attstham số mang lại:

$atts = array (
    'attr1' => 'value1',
          0 => 'attr2',
    'attr3' => 'value3',
          1 => 'attr4'
);

Bạn có thể bình thường hóa như vậy, sau đó bạn có thể gọi shortcode_attsnó.

if (!function_exists('normalize_empty_atts')) {
    function normalize_empty_atts ($atts) {
        foreach ($atts as $attribute => $value) {
            if (is_int($attribute)) {
                $atts[strtolower($value)] = true;
                unset($atts[$attribute]);
            }
        }
        return $atts;
    }
}

function paragraph_shortcode ($atts, $content = null) {
    extract(shortcode_atts(
        array (
            'last' => ''
        ),
        normalize_empty_atts($atts)
    ));

    return '<p class="super-p'
        .($last ? ' last' : '')
        .'">'
        .do_shortcode($content)
        .'</p>';
}

add_shortcode('paragraph', 'paragraph_shortcode');

Ghi chú khác:

  • [paragraph last]sẽ làm $last = true. [paragraph last="1"]sẽ làm $last = '1'.
  • Các thuộc tính không phân biệt chữ hoa chữ thường, vì vậy [paragraph LAST]tương đương với [paragraph last].
  • Các thuộc tính không thể hoàn toàn là số, vì vậy foreachvòng lặp tôi tạo là an toàn đối với các thuộc tính được lập chỉ mục số nguyên.

+1. Chức năng như vậy thực sự nên được nhúng vào lõi, để WP cung cấp các thuộc tính theo cách phù hợp hơn. Làm tốt!
geomagas

4

Tôi biết điều này đã cũ, nhưng tôi không cảm thấy bất kỳ câu trả lời nào là câu trả lời đầy đủ, nhỏ gọn. Nhiều người đang đề xuất chạy $attsmảng thông qua một foreach để tìm xem giá trị của bạn có tồn tại không. Trong thực tế, tôi không cảm thấy nó cần phải phức tạp đến thế; mảng_search có thể được sử dụng thay thế để đơn giản hóa mọi thứ.

Trong trường hợp ví dụ của bạn, bạn có thể sử dụng điều này:

[paragraph last] something [/paragraph]

sau đó để xác định xem thuộc tính trống có được cung cấp hay không, hãy sử dụng một điều kiện cơ bản để kiểm tra và xem liệu khóa trả về null hay dưới dạng số nguyên (bao gồm 0):

// Returns the array key, if empty attribute is found
$last_key = array_search('last', $atts);

// Determine if the key is an integer, zero or greater
// (In the event you're passing multiple empty attributes)
if(is_int($last_key)) {
  // Do something, your attribute is set
}

1

Tôi tìm thấy cái này: http://richjenks.com/wp-shortcode-attribut-without-values/

function get_flags($atts) {

    $flags = array();

    if (is_array($atts)) {
        foreach ($atts as $key => $value) {
            if ($value != '' && is_numeric($key)) {
                array_push($flags, $value);
            }
        }
    }

    return $flags;

}

SỬ DỤNG

$flags = get_flags($atts);
if (in_array('your_flag', $flags) {
    // Flag is present
}

1
cảm ơn vì -1! giải pháp này hoạt động với ít tính năng hơn và ít mã hơn.
benoît

1

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ị falsecho$isLast var.

Vấn đề là khi shortcode_attshà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 $attsmảng trước thời điểm đó. Một var_dumptrong $attsnhững dòng đầu tiên của custom_shortcode_paragraphhà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 === truemã 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. $lastsẽ là false$attsmả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) === falsevì vậy giá trị mặc định shortcode_attslà sai. nhưng đó chỉ là một mặc định được ghi đè bởi giá trị thực tế any value at allvà sau đó $atts['last'] !== falsetruebở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.

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.