Come ottenere SimplePie fetch_feed senza rimuovere il codice iframe?


10

Sto afferrando un feed remoto nel mio plugin e alcune voci hanno il codice iframe che voglio conservare. Tuttavia, SimplePie fetch_feedcontinua a rimuoverlo. Ecco il mio codice e quello che ho già provato:

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
Sarebbe utile se rendessi l'esempio facilmente riproducibile. Non è necessario condividere il collegamento al feed originale se è privato, ma potresti semplicemente lanciare un feed di esempio, dimostrando il problema, da qualche parte online come una sintesi.
Rarst

Risposte:


1

Dai documenti SimplePie qui : è una strip_htmltagsproprietà nell'oggetto SimplePie, che tra l'altro ha il tag iframe che vogliamo mantenere.

Quindi, a parte wp_kses, probabilmente vogliamo rimuovere il tag dalla proprietà sopra.

Ad esempio, $rss = fetch_feed( 'http://www.someblog.com/feed/' );ci fornisce l'oggetto SimplePie.

Se noi var_dump($rss)

o meglio ancora "stampalo" usando:

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

vedremo tutte le voci recuperate e tutte le proprietà $rssdell'oggetto. Tra quelli c'è quello che stiamo cercando, e possiamo isolarlo usando:

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

questo ci darà qualcosa di simile al seguente:

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

Da quanto sopra notiamo che la keyvoce iframe è 10. Quindi usiamo array_splice per rimuovere la voce, come:

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

Ora la voce iframe è fuori e della $strip_htmltagsproprietà e probabilmente siamo impostati.

Avviso : non sono riuscito a trovare un feed rss "test" contenente alcuni iframe per testare quanto sopra. Quindi, se qualcuno può verificarlo, si prega di fornire un feedback.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.