Lọc đầu ra shortcode cụ thể?


7

Có một hook trong WordPress mà tôi có thể sử dụng để lọc đầu ra của một shortcode cụ thể không? Một cái gì đó như thế này:

add_filter('shortcode_output', 'my_filter_function', 2);

function my_filter_function ( $output, $shortcode ) {
    ....
}

Trường hợp $shortcodesẽ là một cái gì đó giống [my_schortcode]hoặc thậm chí tốt hơn, shortcode và các thuộc tính của nó được phân tách thành một mảng.

Câu trả lời:


6

Không có bộ lọc mà tôi biết có nghĩa là nhắm mục tiêu các mã ngắn riêng lẻ như bạn muốn.

Bạn có thể lọc các thuộc tính với shortcode_atts_{$shortcode}mặc dù.

Bạn có thể chiếm quyền điều khiển một mã ngắn khác bằng cách tạo cuộc gọi lại của riêng bạn và đăng ký nó với sên mã ngắn ban đầu. Tôi nghĩ đó là những gì bạn có thể sẽ cần phải làm.

Bằng chứng của khái niệm:

function my_gallery_shortcode($atts) {
  return 'howdy';
}
add_shortcode('gallery','my_gallery_shortcode');

Bây giờ hãy thử sử dụng một bộ sưu tập :)


Bạn đúng. Không có bộ lọc cho những gì tôi muốn. Vì vậy, thay vì đó tôi đang lọc the_content. Nó hoạt động cho trường hợp sử dụng của tôi.
ragulka

2
Kể từ v4.7, có một bộ lọc. Xem câu trả lời của Shawn H bên dưới .
Dave Romsey

13

WordPress 4.7 đã giới thiệu một bộ lọc mới do_shortcode_tag, để thực hiện chính xác điều này.


2
+1 cho giải pháp này vì hiện tại nó thay thế câu trả lời được chấp nhận. Sẽ thật tuyệt nếu bạn có thể chỉnh sửa câu trả lời của mình và đưa ra một ví dụ nhỏ về cách sử dụng. Các tham số bộ lọc không rõ ràng .
Aurovrata



Cuối cùng, chờ đợi nhiều năm cho loại thực hiện này. Wp phải luôn áp dụng loại bộ lọc này trước khi kết xuất. Một ví dụ để xóa thụt lề theo thẻ khỏi mã nguồn: function example_shortcode_output($output, $tag, $attr, $m){ if($tag == 'gallery') $output = str_replace("\t", '', $output); return $output; } add_filter('do_shortcode_tag', 'example_shortcode_output', 10, 4);
Jonas Lundman

1

Trong khi không có móc, có một cách giải quyết nhỏ giúp mục tiêu cuối cùng của bạn có thể. Bạn có thể tạo một mã ngắn mới, trên cơ sở từng trường hợp, bạn luôn luôn bao quanh bất kỳ mã ngắn nào khác có đầu ra mà bạn muốn lọc.

Sử dụng trong một bài viết, vv

Here is some post text. Blah blah...
[filter][target_annoying_shortcode size="small" limit="20"][/filter] 
Here is some more text in my post. More blah blah...

Trong hàm.php:

function my_shortcode_output_filter( $attr, $content ) {

    // Express the shortcode into its output
    $content_translated = do_shortcode(trim($content));
    if($shortcode_to_modify == $content || !$content_translated) {
        // Error handling
        return 'There was an error in filtering shortcode: '.$content;  
    }

    // Now modify the output as you like, here...

    $content_translated_and_filtered = $content_translated;

    return $content_translated_and_filtered;
 }
 add_shortcode('filter', 'my_shortcode_output_filter');

0

Điều duy nhất bạn có thể lọc là các thuộc tính cho shortcode:

apply_filters( "shortcode_atts_{$shortcode}", $out, $pairs, $atts );

Điểm là, đó $shortcodelà đối số thứ ba khi đăng ký một shortcode. Đối số này là khá mới và gần như không có shortcode nào sử dụng nó, do đó nó sẽ trở về mặc định - đó là một stringtrong số đó ''.

Điều này dẫn đến một kết quả hài hước:

add_filter( 'shortcode_atts_', 'wpse112294_shortcode_atts_cb' );
function wpse112294_shortcode_atts_cb( $out, $pairs, $atts )
{
    // here we need to find a way to uniquely identify a shortcode
    // for which we ain't got a name

    // something that makes the shortcode unique:
    $found = isset( $pairs['foo_attribute_key'] );
    if ( $found )
    {
        // Instantly remove this filter to save processing time:
        remove_filter( current_filter(), __FUNCTION__ );

        // do something stunning in here!
    }

    return $out;
}

Vì vậy, vâng , với 90% cơ hội chúng ta cần lọc đầu ra của mọi shortcode (!) Và cố gắng xác định bằng cách nào đó xác định shortcode bằng một số đối số mặc định ( $pairs) hoặc bằng các đối số đầu vào (không thể). Sau đó, cuối cùng chúng ta có thể xử lý đầu ra. Chúng ta có thể tự xử lý chuỗi không? Không. Điều này phải được thực hiện theo cách @s_ha_dum đã trình bày ở trên.


0

Trong khi @s_ha_dum đưa ra một câu trả lời xác đáng, bạn có thể tạo một mã ngắn mới cho mục đích lọc một mã ngắn hiện có. Ví dụ,

function filter_function($atts, $content) {
    extract(shortcode_atts(array(
            'att1' => 'val1',
            'att2' => 'val2'
    ), $atts));

    //save shortcode output in $return
    $return = do_shortcode("[existing_shortcode att1='$att1' att2='$att2'".$content."/existing_shortcode]");

    //insert code to modify $return

    echo $return;
}
add_shortcode('new_shortcode','filter_function');

lưu ý rằng đối với [embed]shortcode, bạn phải sử dụng

global $wp_embed;
$return = $wp_embed->run_shortcode("[embed ...

thay vì do_shortcode

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.