¿Cómo obtener SimplePie fetch_feed sin quitar el código iframe?

10

Estoy tomando una fuente remota en mi complemento y algunas entradas tienen un código iframe que quiero mantener. Sin embargo, SimplePie lo fetch_feedsigue quitando. Aquí está mi código y lo que ya he probado:

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
fuente
1
Sería útil si hiciera un ejemplo fácilmente reproducible. No tiene que compartir el enlace al feed original si es privado, pero simplemente puede arrojar un feed de ejemplo, demostrando el problema, en algún lugar en línea como una esencia.
Rarst

Respuestas:

1

De los documentos de SimplePie aquí : es una strip_htmltagspropiedad en el objeto SimplePie, que entre otros tiene la etiqueta iframe que queremos mantener.

Entonces, aparte de wp_kses, probablemente queremos eliminar la etiqueta de la propiedad anterior.

Por ejemplo, el $rss = fetch_feed( 'http://www.someblog.com/feed/' );nos da el objeto SimplePie.

Si nosotros var_dump($rss)

o incluso mejor "imprimirlo" usando:

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

Veremos todas las entradas recuperadas y todas las propiedades del $rssobjeto. Entre ellos está el que estamos buscando, y podemos aislarlo usando:

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

esto nos dará algo como lo siguiente:

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

De lo anterior, observamos que la keyentrada de iframe es 10. Entonces usamos array_splice para eliminar la entrada, como:

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

Ahora la entrada del iframe está fuera de la $strip_htmltagspropiedad y probablemente ya estamos configurados.

Aviso : No pude encontrar un feed rss de "prueba" que contenga un iframe para probar lo anterior. Entonces, si alguien puede verificarlo, envíe sus comentarios.

Cubakos
fuente