Broken Link Checker for WordPress
Sometimes, links get broken. A page is deleted, a subdirectory forgotten, a site moved to a different domain. Most likely many of your blog posts contain links. It is almost inevitable that over time some of them will lead to a “404 Not Found” error page. Obviously you don’t want your readers to be annoyed by clicking a link that leads nowhere. You can check the links yourself but that might be quite a task if you have a lot of posts. You could use your webserver’s stats but that only works for local links.
So I’ve made a plugin for WordPress that will check your posts (and pages), looking for broken links, and let you know if any are found.
Download it now! (40 KB)
Note : This page, and the feature list below are slightly out of date as a major update has been released recently (see details). I’ll get around to updating this page eventually.
Features
- Checks your posts (and pages) in the background (whenever the WP admin panel is open ).
- Detects links that don’t work and missing images. Checks both internal and outbound links.
- Notifies you on the Dashboard if any problems are found.
- Link checking intervals can be configured.
- New/modified posts are checked ASAP.
The broken links show up in the Manage -> Broken Links tab. If any invalid URLs are found a notification will also show up in the sidebar on the Dashboard.
The Broken Links tab displays a list of invalid URLs found along with the relevant posts and the anchor text of the links. “View” and “Edit Post” do exactly what they say and “Discard” will remove the message about a broken link, but not the link itself (so it will show up again later unless you fix it; this plugin doesn’t modify your links).
By default all old posts/links are re-checked every 72 hours, or you can set a different time period.
Notes (Semi-Technical)
I realize there’s a lot of features that could be added to improve this plugin considerably. However, this release is intended to “test the waters” and see if there’s demand for a plugin like this, so I only implemented the most basic functions. The plugin has been upgraded to be slightly beyond “basic”
I thought about using WP’s pseudo-cron to run the link checker by schedule and decided against it. AFAIK the cronjobs execute when a page is requested; since this plugin does some lengthy processing it may increase page load times unacceptably when used in this manner. That’s why I set it to run the checks asynchronously (AJAX) and invisibly in the admin panel.
Installation
Just like any other WordPress plugin -
- Download (see below).
- Unzip.
- Upload the broken-link-checker folder to you wp-content/plugins directory.
- Activate the plugin in the Plugins tab.
Upgrading
- Deactivate the plugin (important!).
- Do steps 1.-3. from “Installation”.
- Upload the broken-link-checker folder to you wp-content/plugins directory.
- Re-activate the plugin in the Plugins tab.
Download
Version 0.5.3 : broken-link-checker.zip (40 Kb)
Requirements
- WordPress 2.7 or later
- MySQL 4.1 or later
Starting with version 0.5 this plugin is only compatible with WordPress 2.7 and up. Older versions (e.g. ver. 0.4.14) should work with WP 2.1 – 2.6.x.
Related posts :
Thanks – Note that I still have the commented-out version of link-classes.php
Fetching http://w-shadow.com/redirect302.php
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /home/portigal/domains/portigal.com/public_html/test_redirect.php on line 10
HTTP Header(s)
HTTP/1.1 302 Found
Date: Sat, 24 Oct 2009 16:58:40 GMT
Server: Apache/2.2.13 (Unix) mod_ssl/2.2.13 OpenSSL/0.9.7a mod_bwlimited/1.4 PHP/5.2.10
X-Powered-By: PHP/5.2.10
Location: http://w-shadow.com/
Vary: User-Agent,Accept-Encoding
Content-Type: text/html; charset=UTF-8
sorry for the multiple comments – the output is in a format that your comment feature doesn’t like, giving me a blank screen upon submit, so I’m snipping out various pieces to see how I can get it to load – I’ll reformat it in Word and see if that helps…
Response info
Array
url => http://w-shadow.com/redirect302.php
content_type => text/html; charset=UTF-8
http_code => 302
header_size => 280
request_size => 67
filetime => -1
ssl_verify_result => 0
redirect_count => 0
total_time => 4.325351
namelookup_time => 4.165701
connect_time => 4.244815
pretransfer_time => 4.244826
size_upload => 0
size_download => 0
speed_download => 0
speed_upload => 0
download_content_length => -1
upload_content_length => -1
starttransfer_time => 4.325252
redirect_time => 0
CURL version info
Array
version_number => 463621
age => 3
features => 1565
ssl_version_number => 0
version => 7.19.5
host => x86_64-unknown-linux-gnu
ssl_version => OpenSSL/0.9.8b
libz_version => 1.2.3
protocols => Array
0 => tftp
1 => ftp
2 => telnet
3 => dict
4 => ldap
5 => http
6 => https
7 => ftps
Right. That warning there – “CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir” – is a clear indication that open_basedir is enabled, and thus redirects don’t work. I was uncertain before, but not any more – this particular error message is generated by PHP itself when a script tries to do something that’s not allowed by the server config.; it can’t be a bug in the script*.
I’ll add a workaround for situations like this. Redirects will show up in the report, but you’ll have to check each one manually to know where it redirects to (because the plugin still won’t be able to follow the redirect).
* That sounded ambiguous. What I mean is the error message shows that the server config. really prevents the plugin from following redirects, as opposed to the plugin just incorrectly thinking it can’t follow them and giving up.
Thank you for this unbelievably useful plugin. I’ve used it almost since it was first released and find it really wonderfully useful on my blogs for isolating sites I’ve linked to that have since died or moved. The growth in the plugin during the last 2 years has been spectacular too!
I’m not sure if this is possible, or if it’s just me, etc., but the one thing that really bugs me is that when I’m editing a URL on the broken links page that I can’t just press ‘enter’ to save the changed link – I have to manually click ’save link’. I am forever forgetting to do that because it seems counterintuitive that ‘enter’ doesn’t work.
The only other tinsy tiny problem I have is that I’d like more documentation – I’m never quite able to remember the differences/effects of “unlink”, “discard”, and “exclude”. Could we have tooltips perhaps for these? I know I’ve looked up the effects a few times but the names aren’t obvious to me so I keep forgetting.
Again, thanks for the hard work you put in – it’s greatly appreciated!
r
Alright, I’ll see if I can make Enter work in that textbox.
The action links do have tooltips – you just need to hover your cursor over one of them for a few seconds to make a one-line description of the link’s function pop up. This works in all the major web browsers (Firefox, Opera, IE and even Chrome).
Thanks ,great plugin
Ahh – guess the tool tips must be a Safari thing then, it just says “javascript:void(0);” for all the tooltips. Thanks again
[...] Почему этот «вредитель» (речь идет о плагине Broken Link Checker ) так действует — ума не приложу. Регулярно [...]
Hi,
Please could you update the Changelog on the WordPress.org Plugin Page? It’s still sitting at Version 0.5.16.
Thanks.
Done. I’m somewhat surprised someone actually reads those
Re: Done. I’m somewhat surprised someone actually reads those
Every time I consider an automatic WP plugin upgrade, I read the changelog FIRST in the pop-up window, as seen here:
There is a new version of Broken Link Checker available. *View version 0.5.18 Details* or *upgrade automatically.*
In WP on Plugins page, click on *View version 0.5.18 Details* (or any plugins upgrade) to see what we’re talking about.
I’m aware of that feature; my previous comment wasn’t entirely serious.
Pardon my assumption.
I’m just surprised at the number of plug-in authors who don’t bother with the Changelog, or decide to *only* host the Changelog on their own site. Your efforts and hard work always appreciated and not taken lightly!
How can i get broken link checker to check my links in user comments?
It’s on my to-do list, but it will be a while before I actually get around to implementing it. The next thing I plan to work on is internationalization.
At the suggestion of my ISP, I created a fresh WP install elsewhere on the same server, installed your plugin, then did a PHP-info. “The difference between the local and global settings for open_basedir meant that it was being set elsewhere a second time. I dug into the DirectAdmin administration menus and found an open_basedir setting that I had not noticed before (maybe a recent feature in DirectAdmin). I have switched this off. I think this will solve the problem.”
And back on portigal.com, the debug settings for your pluin are
PHP version 5.2.5
MySQL version 5.0.41-community
CURL version 7.19.5
Snoopy Installed
Safe mode Off
open_basedir Off
Lockfile /tmp/wp_blc_lock
I think we’re good?! Thanks for all your help!
Note : A few comments on this post have been irretrievably lost due to a server crash.
[...] Broken Link Checker [...]
Hi, service information…
I noticed that the sentence “Found %d broken link” has a label (view broken link) that cannot be translated.
Bye
Giacomo
Hi there! Thanks so much for creating this. It’s working great, with one exception: one particular server always returns a 400 error to Broken Link Checker, but I can load the pages in a standard web browser just fine.
Here are the details for one of the broken links:
. Post published on : October 27, 2009
. Link last checked : October 30, 2009
. HTTP code : 400
. Response time : 2.306 seconds
. Final URL : http://www.animenews.biz/viz-to-publish-rin-ne-volume-1-on-october-20th-2222/
. Redirect count : 0
. Instance count : 1
. This link has failed 2 times.
Log : === First try : 0 (No response) ===
HTTP/1.1 400 Bad Behavior
Date: Fri, 30 Oct 2009 14:39:05 GMT
Server: Apache/2.2.8 (Unix) mod_ssl/2.2.8 OpenSSL/0.9.7a mod_auth_passthrough/2.1 mod_bwlimited/1.4 PHP/5.2.5
X-Powered-By: PHP/5.2.5
Status: 400 Bad Behavior
Connection: close
Content-Type: text/html
Trying a second time with different settings…
=== Second try : 0 (No response) ===
HTTP/1.1 400 Bad Behavior
Date: Fri, 30 Oct 2009 14:39:08 GMT
Server: Apache/2.2.8 (Unix) mod_ssl/2.2.8 OpenSSL/0.9.7a mod_auth_passthrough/2.1 mod_bwlimited/1.4 PHP/5.2.5
X-Powered-By: PHP/5.2.5
Status: 400 Bad Behavior
Content-Length: 978
Connection: close
Content-Type: text/html
Link is broken.
@ Brent : This is a known issue. That site is running the the Bad Behaviour module, which tends to be a bit overzealous about blocking automated web requests. As far as I know, there is currently no practical way to fix this in the plugin.
[...] Translators Wanted I’ve recently added internationalization support to my Broken Link Checker plugin, so if you like the plugin and would like to see it in your own language, consider contributing a [...]
[...] Broken link Checker Search engines do not like broken links. This plugin ensures you have none [...]
[...] Broken Link Checker (http://w-shadow.com/blog/2007/08/05/broken-link-checker-for-wordpress/) [...]
[...] Página do Broken Link Checker [...]
[...] Broken Link Checker [...]
Hi,
Can you tell me if your plugin can detect parked domains? Will that be counted as a broken link?
I know there’s many who leave blog comments with their URL, and one year later, the site is abandoned and turned into a parked domain.
I don’t want any links going to their parked domains…..
No, that’s not currently possible. I’m not even sure how one could detect a parked domain, but I may look into it.
[...] Version 0.5.13 | Par Janis Elsts | Aller sur le site de l’extension [...]