วิธีรับ SimplePie fetch_feed โดยไม่ต้องลอกรหัส iframe?


10

ฉันกำลังดึงฟีดระยะไกลในปลั๊กอินของฉันและบางรายการมีรหัส iframe ที่ฉันต้องการเก็บไว้ อย่างไรก็ตาม SimplePie fetch_feedยังคงลอกมันออก นี่คือรหัสของฉันและสิ่งที่ฉันได้ลองไปแล้ว:

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
มันจะมีประโยชน์ถ้าคุณทำตัวอย่างทำซ้ำได้ง่าย คุณไม่จำเป็นต้องแชร์ลิงก์ไปยังฟีดดั้งเดิมหากเป็นข้อมูลส่วนตัว แต่คุณสามารถทิ้งฟีดตัวอย่างแสดงให้เห็นถึงปัญหาในที่ออนไลน์เช่นส่วนสำคัญ
Rarst

คำตอบ:


1

จาก SimplePie docs ที่นี่ : เป็นstrip_htmltagsคุณสมบัติในวัตถุ SimplePie ซึ่งในหมู่คนอื่น ๆ ก็มีแท็ก iframe ที่เราต้องการเก็บไว้

ดังนั้นนอกเหนือจาก wp_kses เราอาจต้องการลบแท็กออกจากคุณสมบัติด้านบน

ตัวอย่างเช่นการ$rss = fetch_feed( 'http://www.someblog.com/feed/' );ให้วัตถุ SimplePie แก่เรา

ถ้าเรา var_dump($rss)

หรือดียิ่งขึ้น "พิมพ์สวย" โดยใช้:

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

เราจะเห็นรายการที่เรียกทั้งหมดและคุณสมบัติทั้งหมดของ$rssวัตถุ ในบรรดาที่มีอยู่เรากำลังมองหาและเราสามารถแยกมันได้โดยใช้:

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

สิ่งนี้จะให้สิ่งที่เราต้องการด้านล่าง:

<?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',
     );
?>

จากด้านบนเราทราบว่าkeyรายการ iframe คือ 10 ดังนั้นเราจึงใช้ array_splice เพื่อลบรายการเช่น:

// 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

ตอนนี้รายการ iframe จะไม่ทำงานและเป็นของ$strip_htmltagsคุณสมบัติและอาจเป็นไปได้ว่าเราถูกตั้งค่าแล้ว

คำเตือน : ฉันไม่พบฟีด RSS ทดสอบ "ที่มี iframe บางตัวเพื่อทดสอบข้างต้น ดังนั้นหากใครก็ตามสามารถตรวจสอบได้โปรดให้ข้อเสนอแนะ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.