current_shortcode () - phát hiện shortcode hiện đang sử dụng


11

Trong một lớp plugin tôi muốn cung cấp các trường đơn giản cho dữ liệu công khai: email, số điện thoại, Twitter, vv Danh sách có thể được mở rộng.

Xem plugin Dữ liệu liên hệ công khai trên GitHub để biết chi tiết.

Để giữ cho việc sử dụng đơn giản, tôi cũng muốn cung cấp các mã ngắn dễ gõ:

  • [public_email]
  • [public_phone]
  • [public_something]

Sự khác biệt duy nhất là phần thứ hai. Tôi không muốn tranh luận thêm cho các mã ngắn vì chúng dễ bị lỗi. Vì vậy, tôi đăng ký một trình xử lý shortcode cho tất cả các trường trong lớp plugin của mình:

foreach ( $this->fields as $key => $value )
{
    add_shortcode( 'public_' . $key, array( $this, 'shortcode_handler' ) );
}

Bây giờ shortcode_handler()phải biết shortcode nào đã được gọi. Câu hỏi của tôi là: Làm thế nào để tôi làm điều này?

Cách giải quyết hiện tại của tôi là một chức năng khác:

protected function current_shortcode()
{
    $backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS );
    return $backtrace[3]['args'][0][2];
}

Điều này làm việc cho the_content(). Nhưng nó không thanh lịch cũng không mạnh mẽ.
Tôi đã đọc wp-includes/shortcodes.php, nhưng tôi không thể thấy ngay bây giờ làm thế nào để làm điều đó tốt hơn.


1
Bây giờ bạn có tất cả sự tò mò của tôi. Tôi sẽ xem xét điều này trong thời gian ngắn. Tôi biết shortcodes.php chỉ là một loạt các hàm, nếu nó được viết chính xác bằng OOP, chắc chắn sẽ có một biến lớp current_shortcode và làm cho mọi thứ dễ dàng hơn. Theo hiểu biết của tôi, Wordpress chỉ lưu trữ tất cả các mã ngắn và các cuộc gọi lại trong một mảng, tôi tự hỏi liệu có cách nào để lưu trữ từng mã ngắn vào một biến khi nó được xử lý và không hack các tệp lõi không?
Dwayne Charrington

@toscho Đồng ý, tôi nghĩ đó thực sự là một vấn đề, việc tu sửa theo cách mà các đoạn mã ngắn được thực hiện, (bao gồm nhiều OOP như Widgets) nên được ghi nhớ. Tôi rất muốn giúp đỡ về điều đó, và sau đó gửi nó dưới dạng cập nhật cho Core.
Webord

@brasofilo Đúng rồi, tôi vừa mới làm vậy.
fuxia

Câu trả lời:


3

Điều này chưa được kiểm tra , nhưng hàm gọi lại được cung cấp với một loạt các đối số, $argscung cấp (nếu có) các tham số được cung cấp với shortocode. Mục nhập zeroth đôi khi chứa tên của shortcode được sử dụng (ví dụ public_email). Đôi khi ý tôi là ...

Mục nhập zeroeth của mảng thuộc tính ($ atts [0]) sẽ chứa chuỗi khớp với biểu thức chính mã ngắn, nhưng CHỈ nếu nó khác với tên gọi lại, xuất hiện dưới dạng đối số thứ ba cho hàm gọi lại.

(Xem Codex ). Đối với mục đích của bạn sau đó $atts[0]sẽ chứa một trong hai public_email, public_phonevv

function shortcode_handler($atts,$content=NULL){
     if(!isset($atts[0]))
         return; //error?

     switch($atts[0]):
         case 'public_email':
              //deal with this case
              break;
         case 'public_phone':
              //deal with this case
              break;
         case 'public_something':
              //deal with this case
              break;
     endswitch;   
}

À, tôi nhớ rồi, tôi đã gặp phải điều gì đó tương tự từ lâu rồi. Trong trường hợp của tôi, nó là đối số thứ ba cho trình xử lý shortcode. Đầu tiên là $args, thứ hai $contentvà cuối cùng là shortcode!
fuxia

Có thật không? Shortcode khác với tên gọi lại 'shortcode_handler' ... Tôi đã nghĩ rằng nó sẽ được đưa ra trong $args. Nhưng nếu điều đó làm việc cho bạn ...: D.
Stephen Harris

2

Dựa trên câu trả lời của Stephen Harris, tôi đã bắt tất cả người xử lý chấp nhận đối số thứ ba, đó là tên shortcode:

/**
 * Handler for all shortcodes.
 *
 * @param  array  $args
 * @param  NULL   $content Not used.
 * @param  string $shortcode Name of the current shortcode.
 * @return string
 */
public function shortcode_handler(  $args = array (), $content = NULL, $shortcode = '' )
{
    $key = $this->current_shortcode_key( $shortcode );
    $args['print'] = FALSE;
    return $this->action_handler( $key, $args );
}

/**
 * Returns the currently used shortcode. Sometimes.
 *
 * @return string
 */
protected function current_shortcode_key( $shortcode )
{
    return substr( $shortcode, 7 );
}

Xem nó trong hành động trong các plugin được liên kết trong câu hỏi của tôi.

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.