Wie bekomme ich SimplePie fetch_feed, ohne den Iframe-Code zu entfernen?


10

Ich greife nach einem Remote-Feed in meinem Plugin und einige Einträge enthalten Iframe-Code, den ich behalten möchte. SimplePie entfernt fetch_feedes jedoch immer wieder. Hier ist mein Code und was ich bereits versucht habe:

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
Es wäre hilfreich, wenn Sie das Beispiel leicht reproduzierbar machen würden. Sie müssen keinen Link zum Original- Feed freigeben, wenn dieser privat ist, aber Sie können einfach einen Beispiel-Feed anzeigen, der das Problem demonstriert, irgendwo online wie im Kern.
Rarst

Antworten:


1

Aus den SimplePie-Dokumenten hier : Das ist eine strip_htmltagsEigenschaft im SimplePie-Objekt, die unter anderem das iframe-Tag enthält, das wir behalten möchten.

Abgesehen von wp_kses möchten wir wahrscheinlich das Tag aus der obigen Eigenschaft entfernen.

Zum Beispiel $rss = fetch_feed( 'http://www.someblog.com/feed/' );gibt uns das das SimplePie-Objekt.

Wenn wir var_dump($rss)

oder noch besser "hübsch drucken" mit:

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

Wir sehen alle abgerufenen Einträge und alle Eigenschaften des $rssObjekts. Unter diesen gibt es die, die wir suchen, und wir können sie isolieren, indem wir:

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

Dies gibt uns so etwas wie das Folgende:

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

Aus dem keyObigen geht hervor, dass der Eintrag iframe 10 ist. Daher verwenden wir array_splice, um den Eintrag zu entfernen, wie z.

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

Jetzt ist der iframe-Eintrag außerhalb der $strip_htmltagsEigenschaft und wahrscheinlich sind wir gesetzt.

Hinweis : Ich konnte keinen "Test" -Rss-Feed finden, der einen Iframe zum Testen des oben genannten enthält. Wenn jemand dies überprüfen kann, geben Sie bitte ein Feedback.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.