3

I am using the fetch_feed() function provided in WordPress to build a SimplePie feed object.

The code from WP is the following:

function fetch_feed($url) {
require_once (ABSPATH . WPINC . '/class-feed.php');

$feed = new SimplePie();

$feed->set_sanitize_class( 'WP_SimplePie_Sanitize_KSES' );
// We must manually overwrite $feed->sanitize because SimplePie's
// constructor sets it before we have a chance to set the sanitization class
$feed->sanitize = new WP_SimplePie_Sanitize_KSES();

$feed->set_cache_class( 'WP_Feed_Cache' );
$feed->set_file_class( 'WP_SimplePie_File' );

$feed->set_feed_url($url);
$feed->set_cache_duration( apply_filters( 'wp_feed_cache_transient_lifetime', 12 * HOUR_IN_SECONDS, $url ) );
do_action_ref_array( 'wp_feed_options', array( &$feed, $url ) );
$feed->init();
$feed->handle_content_type();

if ( $feed->error() )
    return new WP_Error('simplepie-error', $feed->error());

return $feed;
}

How can I modify which HTML elements get stripped during the feed import?

SimplePie in its documentation says that there is a function strip_htmltags(), but I'm not sure how I can use it within the WordPress context. http://simplepie.org/wiki/reference/simplepie/strip_htmltags

Here's what I tried, but didn't work:

function wpse87359_feed_options( $feed) {
$feed->strip_htmltags(array_merge($feed->strip_htmltags, array('h1', 'a', 'img','em')));
}
add_action( 'wp_feed_options', 'wpse87359_feed_options' );
1
  • Anyone can help with this issue?
    – urok93
    Commented Mar 2, 2013 at 11:36

1 Answer 1

4

SimplePie in WordPress uses the built-in kses sanitization, rather than SimplePie's. Instead, you can filter on wp_kses_allowed_html and add your elements there. Keep in mind that this will occur for all post santization, not just via SimplePie.

function se87359_add_allowed_tags($tags) {
    $tags['mytag'] = array('myattr' => true);
    return $tags;
}
add_filter('wp_kses_allowed_html', 'se87359_add_allowed_tags');

If you want to do it just for feeds, something like the following should work:

/**
 * Add in our filter when we run fetch_feed()
 */
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['mytag'] = array('myattr' => true);
    return $tags;
}
5
  • Hmm that's not so ideal, I want this to apply to just content gotten via SimplePie.
    – urok93
    Commented Feb 19, 2013 at 2:49
  • You'll need to do a setup where you only hook this in for feeds. There should be the appropriate hooks around, or if you can't figure it out, I can probably whip something up.
    – Ryan McCue
    Commented Feb 19, 2013 at 11:40
  • I'm not really sure how I can do that, so if you could add that it would be great.
    – urok93
    Commented Feb 20, 2013 at 2:23
  • Do you think you could evolve the answer to work for feeds only?
    – urok93
    Commented Feb 21, 2013 at 1:35
  • This doesn't seem to work as expected. <p> tags have class stripped from them. Adding p to the list of allowed tags with class set to true doesn't do anything.
    – EHerman
    Commented Oct 21, 2015 at 19:18

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.