Как получить 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
Было бы полезно, если бы вы сделали пример легко воспроизводимым. Вам не нужно делиться ссылкой на оригинальный канал, если он частный, но вы можете просто добавить пример канала, демонстрирующего проблему, где-то в Интернете, как суть.
Первое

Ответы:


1

Из документов SimplePie здесь : 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 для проверки вышеупомянутого. Так что если кто-то может это проверить, пожалуйста, оставьте отзыв.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.