Làm cách nào để có được SimplePie fetch_feed mà không tước mã iframe?


10

Tôi đang lấy một nguồn cấp dữ liệu từ xa trong plugin của mình và một số mục có mã iframe tôi muốn giữ. Tuy nhiên, SimplePie fetch_feedtiếp tục tước nó ra. Đây là mã của tôi và những gì tôi đã thử:

kses_remove_filters(); # remove kses filters but SimplePie strips codes anyway
$rss = fetch_feed( 'http://www.someblog.com/feed/' );
$rss_items = $rss->get_items( 0, 2 );  # get two entries for this example
foreach ( $rss_items as $item ) {
    # just dump to screen:
    echo "<div id='message' class='updated'><p>" .  $item->get_content() . "</p></div>";
}
kses_init_filters(); # remove kses filters but SimplePie strips codes anyway


# also tried adding iframe to kses_allowed_html filter:
function se87359_add_filter( &$feed, $url ) {
    add_filter('wp_kses_allowed_html', 'se87359_add_allowed_tags');
}
add_filter( 'wp_feed_options', 'se87359_add_filter', 10, 2 );
function se87359_add_allowed_tags($tags) {
    // Ensure we remove it so it doesn't run on anything else
    remove_filter('wp_kses_allowed_html', 'se87359_add_allowed_tags');
    $tags['iframe'] = array(
    'src' => true,
    'width' => true,
    'height' => true,
    'class' => true,
    'frameborder' => true,
    'webkitAllowFullScreen' => true,
    'mozallowfullscreen' => true,
    'allowFullScreen' => true
    );
    return $tags;
}

# also made sure not to cache the feed (for testing only):
function do_not_cache_feeds(&$feed) {
    $feed->enable_cache(false);
}
add_action( 'wp_feed_options', 'do_not_cache_feeds' );

# in case above doesn't work, set transient lifetime to 1 second:
add_filter( 'wp_feed_cache_transient_lifetime', create_function( '$a', 'return 1;' ) );

1
Nó sẽ hữu ích nếu bạn làm ví dụ dễ tái tạo. Bạn không phải chia sẻ liên kết đến nguồn cấp dữ liệu ban đầu nếu nó ở chế độ riêng tư, nhưng bạn có thể chỉ cần đưa ra nguồn cấp dữ liệu mẫu, chứng minh vấn đề, ở đâu đó trực tuyến như một ý chính.
Rarst

Câu trả lời:


1

Từ các tài liệu SimplePie ở đây : thuộc strip_htmltagstính trong đối tượng SimplePie, trong số các tài liệu khác có thẻ iframe mà chúng tôi muốn giữ.

Vì vậy, ngoài wp_kses, có lẽ chúng tôi muốn xóa thẻ khỏi thuộc tính trên.

Chẳng hạn, việc $rss = fetch_feed( 'http://www.someblog.com/feed/' );cung cấp cho chúng ta đối tượng SimplePie.

Nếu chúng ta var_dump($rss)

hoặc thậm chí tốt hơn "in đẹp" nó bằng cách sử dụng:

highlight_string("<?php\n\$rss =\n" . var_export($rss, true) . ";\n?>");

chúng ta sẽ thấy tất cả các mục được tìm nạp và tất cả các thuộc tính của $rssđối tượng. Trong số những người có một cái chúng tôi đang tìm kiếm, và chúng tôi có thể cô lập nó bằng cách sử dụng:

highlight_string("<?php\n\$rss->strip_htmltags =\n" . var_export($rss->strip_htmltags, true) . ";\n?>");

Điều này sẽ cho chúng ta một cái gì đó như dưới đây:

<?php
    $rss->strip_htmltags =
      array (
        0 => 'base',
        1 => 'blink',
        2 => 'body',
        3 => 'doctype',
        4 => 'embed',
        5 => 'font',
        6 => 'form',
        7 => 'frame',
        8 => 'frameset',
        9 => 'html',
       10 => 'iframe',
       11 => 'input',
       12 => 'marquee',
       13 => 'meta',
       14 => 'noscript',
       15 => 'object',
       16 => 'param',
       17 => 'script',
       18 => 'style',
     );
?>

Từ những điều trên, chúng tôi lưu ý rằng keymục nhập iframe là 10. Vì vậy, chúng tôi sử dụng mảng_splice để xóa mục nhập, như:

// Remove these tags from the list
$strip_htmltags = $rss->strip_htmltags; //get a copy of the strip entries array
array_splice($strip_htmltags, 10, 1); //remove the iframe entry
$rss->strip_htmltags = $strip_htmltags; // assign the strip entries without those we want

Bây giờ, mục nhập iframe đã hết và thuộc $strip_htmltagstính và có lẽ chúng ta đã đặt.

Lưu ý : Tôi không thể tìm thấy nguồn cấp dữ liệu rss "thử nghiệm" có chứa một số iframe để kiểm tra ở trên. Vì vậy, nếu bất cứ ai có thể xác minh nó, xin vui lòng cung cấp một số thông tin phản hồ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.