﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	severity	resolution	keywords	cc
20379	dashboard_incoming_links fails to update when 'home' changes, so google rss is wrong	kitchin		"When the user changes 'home', the wp_option 'dashboard_widget_options' is updated. But WP fails to update it completely, so the default Google RSS syndication URL is broken.

The borked value is:

dashboard_widget_options: dashboard_incoming_links: url

which is of the form

http://blogsearch.google.com/blogsearch_feeds?scoring=d&ie=utf-8&num=10&output=rss&partner=wordpress&q=link:http://example.com/

The string at the end, example.com, is supposed to change but it does not.

Here is the problem.
(Trunk has the same code as the current ver. 3.3.1.)

http://core.trac.wordpress.org/browser/trunk/wp-admin/includes/dashboard.php#L59
constructs 'url' as follows, expanded for readability:

{{{
'url' => isset($widget_options['dashboard_incoming_links']['url'])
	? apply_filters(
		'dashboard_incoming_links_feed',
		$widget_options['dashboard_incoming_links']['url']
	)
	: apply_filters(
		'dashboard_incoming_links_feed',
		'http://blogsearch.google.com/blogsearch_feeds?scoring=d&ie=utf-8&num=' . $num_items . '&output=rss&partner=wordpress&q=link:' . trailingslashit( get_option('home') )
	),
}}}

Since 'url' is already set, it never changes! The value of get_option('home') is not used.

This code block is only reached when 'home' has changed, or on initial setup, so it does not make much sense to ignore 'home'.

I'm not sure if there is any reason to keep the tertiary. Solution 1 below is the simple fix.
Solution 2 is a heuristic fix to handle the case where a plugin or theme has updated the database, instead of using the filter. It mimics the current (possibly wrong) behavior in that case.

Solution 1:
{{{
$widget_options['dashboard_incoming_links'] = array(
	...
	'url' => apply_filters( 'dashboard_incoming_links_feed', 'http://blogsearch.google.com/blogsearch_feeds?scoring=d&ie=utf-8&num=' . $num_items . '&output=rss&partner=wordpress&q=link:' . trailingslashit( get_option('home') ) ),
}}}

Solution 2:
{{{
$url_prefix = 'http://blogsearch.google.com/blogsearch_feeds?scoring=d&ie=utf-8&num=' . $num_items . '&output=rss&partner=wordpress&q=link:';
$url = $url_prefix . trailingslashit( get_option( 'home' ) );
if ( isset ( $widget_options['dashboard_incoming_links']['url'] ) ) {
	if ( 0 !== strpos( $widget_options['dashboard_incoming_links']['url'], $url_prefix ) ) {
		$url = $widget_options['dashboard_incoming_links']['url'];
	}
}
$widget_options['dashboard_incoming_links'] = array(
	...
	'url' => apply_filters( 'dashboard_incoming_links_feed', $url ),
}}}

The importance of this bug is twofold:
1. No clear workaround for the user, even with basic PHPMyAdmin skills. The incorrect value is in a serialized array in the table 'wp_options'.
2. Users may not realize the feed is borked, since there is no Dashboard UI. I think there used to be. The WP forums have several 5-year old threads about it.

By the way, $num_items never changes by default. It could only be updated by plugins or themes, and Solution 2 assumes they know what they are doing there too.
"	defect (bug)	new	normal	Awaiting Review	Feeds	3.3.1	normal			
