Bagaimana cara mendapatkan SimplePie fetch_feed tanpa menghapus kode iframe?

10

Saya mengambil feed jarak jauh di plugin saya dan beberapa entri memiliki kode iframe yang ingin saya simpan. Namun, SimplePie fetch_feedterus menghapusnya. Ini kode saya dan apa yang sudah saya coba:

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;' ) );
johnh10
sumber
1
Akan sangat membantu jika Anda membuat contoh yang mudah direproduksi. Anda tidak harus membagikan tautan ke umpan asli jika bersifat pribadi, tetapi Anda dapat dengan mudah memunculkan contoh feed, menunjukkan masalah, di suatu tempat online seperti intisari.
Paling lambat

Jawaban:

1

Dari dokumen SimplePie di sini : ini adalah strip_htmltagsproperti di objek SimplePie, yang di antaranya memiliki tag iframe yang ingin kita simpan.

Jadi, terlepas dari wp_kses, mungkin kami ingin menghapus tag dari properti di atas.

Misalnya, $rss = fetch_feed( 'http://www.someblog.com/feed/' );memberi kita objek SimplePie.

Jika kita var_dump($rss)

atau bahkan lebih baik "cetak cantik" dengan menggunakan:

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

kita akan melihat semua entri yang diambil dan semua properti $rssobjek. Di antara mereka ada yang kita cari, dan kita bisa mengisolasinya dengan menggunakan:

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

ini akan memberi kita sesuatu seperti di bawah ini:

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

Dari penjelasan di atas, kami mencatat bahwa keyentri iframe adalah 10. Jadi kami menggunakan array_splice untuk menghapus entri, seperti:

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

Sekarang entri iframe sudah keluar dan dari $strip_htmltagsproperti dan mungkin kita sudah siap.

Perhatikan : Saya tidak dapat menemukan "rss feed" test "berisi beberapa iframe untuk menguji di atas. Jadi, jika ada yang bisa memverifikasinya, berikan umpan balik.

Cubakos
sumber