Comment obtenir SimplePie fetch_feed sans supprimer le code iframe?

10

J'attrape un flux distant dans mon plugin et certaines entrées ont un code iframe que je veux conserver. Cependant, SimplePie fetch_feedcontinue de le supprimer. Voici mon code et ce que j'ai déjà essayé:

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
la source
1
Il serait utile de rendre l'exemple facilement reproductible. Vous n'êtes pas obligé de partager le lien vers le flux d' origine s'il est privé, mais vous pouvez simplement afficher un exemple de flux, illustrant le problème, quelque part en ligne comme un résumé.
Rarst le

Réponses:

1

D'après les documents SimplePie ici : la est une strip_htmltagspropriété dans l'objet SimplePie, qui a entre autres la balise iframe que nous voulons conserver.

Donc, à part les wp_kses, nous voulons probablement supprimer la balise de la propriété ci-dessus.

Par exemple, le $rss = fetch_feed( 'http://www.someblog.com/feed/' );nous donne l'objet SimplePie.

Si nous var_dump($rss)

ou encore mieux "joli print" en utilisant:

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

nous verrons toutes les entrées récupérées et toutes les propriétés de l' $rssobjet. Parmi ceux-ci, il y a celui que nous recherchons, et nous pouvons l'isoler en utilisant:

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

cela nous donnera quelque chose comme ci-dessous:

<?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 ce qui précède, nous notons que l' keyentrée iframe est 10. Nous utilisons donc array_splice pour supprimer l'entrée, comme:

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

Maintenant, l'entrée iframe est hors de la $strip_htmltagspropriété et probablement nous sommes définis.

Remarque : je n'ai pas trouvé de flux rss "test" contenant des iframes pour tester ce qui précède. Donc, si quelqu'un peut le vérifier, veuillez fournir des commentaires.

Cubakos
la source