widgets.php Hack

Are you using the WordPress sidebar feed widget? You may not have noticed, but feeds with different encodings may cause your page to have non-valid mark-up. This may or may not be of concern to you, but if it is, this hack should be helpful.

I say "hack" because this is NOT a plugin, but involves direct modification of the widgets.php file. If you try this, Please be Sure to Save a Back-up of the original file.

Important* Note* This hack requires the iconv function. From the PHP documentation:

To use functions provided by this module, the PHP binary must be built with the following configure line: –with-iconv[=DIR].

Also, if you are on a Windows or IBM server, or the results are not what you expect, Please read the documentation (actually, it's not a bad idea to read it anyway).

Open the content/plugins/widgets/widgets.php file.

In the widget_rss function find this section of code:

} else {
$desc = str_replace(array("n", "r"), ' ', wp_specialchars(strip_tags(html_entity_decode($item['description'], ENT_QUOTES)), 1));
$summary = '';
}

After the line with the closing curly brace add:

$feed_char_enc = $rss->feed_encoding;
$board_char_enc = get_bloginfo('charset');
if($feed_char_enc != $board_char_enc)
{
$conv_link = iconv($feed_char_enc, "$board_char_enc//IGNORE", $link);
$conv_desc = iconv($feed_char_enc, "$board_char_enc//IGNORE", $desc);
$conv_title = iconv($feed_char_enc, "$board_char_enc//IGNORE", $title);
$conv_summary = iconv($feed_char_enc, "$board_char_enc//IGNORE", $summary);
$link = ($conv_link != FALSE) ? $conv_link : $link;
$desc = ($conv_desc != FALSE) ? $conv_desc : $desc;
$title = ($conv_title != FALSE) ? $conv_title : $title;
$summary = ($conv_summary != FALSE) ? $conv_summary : $summary;
}

Which will now be before this line:

echo "<li><a class='rsswidget' href='$link' title='$desc'>$title</a>$summary</li>";

Notice that for the "out charset" I appended the "//IGNORE" string. This removes any characters that can't be converted. This is not entirely desirable, but using the default will result in the converted strings being terminated at the last valid character. A third option is to append the string "//TRANSLIT" instead. You may want to try it, but I found that the converted strings still caused non-valid mark-up.

To see the code with the indentation preserved and without the line breaks (easier to copy-paste) go to http://www.mittineague.com/dev/wh.php

One Comment

  1. Posted February 23, 2009 at 1:04 am | Permalink

    If you are looking for a way to stop RSS feeds with a character encoding different than your WordPress blog's character encoding from causing validation errors, please see rss.php Hack 1