WordPress.org

Make WordPress Core

Opened 4 years ago

Closed 3 years ago

Last modified 3 years ago

#20379 closed defect (bug) (invalid)

dashboard_incoming_links fails to update when 'home' changes, so google rss is wrong

Reported by: kitchin Owned by:
Milestone: Priority: normal
Severity: normal Version: 3.3.1
Component: Feeds Keywords:
Focuses: Cc:

Description

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.

Change History (8)

#1 @kitchin
4 years ago

Here is a plugin I wrote implementing Solution 2. I only tested it in the default case though.
http://pastebin.com/UuDGqm3G

#2 @SergeyBiryukov
4 years ago

Replying to kitchin:

  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'.

As a workaround, one can fix the link by simply clicking Configure in the Incoming Links widget header. Number of items can also be changed there.

  1. 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.

Not sure what you mean by "Dashboard UI".

#3 @kitchin
4 years ago

Thanks for the quick reply. I was looking at Dashboard/Widgets, not on the Dashboard home.

Do you think it should change when 'home' changes?

#4 @kitchin
4 years ago

Otherwise, I can add the info about how to use the Dashboard UI to http://codex.wordpress.org/Moving_WordPress

#5 @kitchin
4 years ago

Instead I updated http://codex.wordpress.org/Changing_The_Site_URL

I still think this is a bug. The instructions to update this default option are so obscure I imagine most people will miss it when changing a Site URL. And WP already has the code to construct the default URL reflecting the Site URL.

Here's what I put in codex:

Fix the Incoming Links URL. This one is easy to miss. Look on the main Dashboard screen, at Incoming Links. Hover over the area to the right of "Incoming Links" to reveal the "Configure" link. Edit the URL to reflect the new site address.

#7 @kitchin
3 years ago

  • Resolution set to invalid
  • Status changed from new to closed

This ticket can be closed, 3.8 no longer has dashboard_incoming_links. See #26604.

#8 @SergeyBiryukov
3 years ago

  • Milestone Awaiting Review deleted
Note: See TracTickets for help on using tickets.