Broken Link Checker for WordPress

Notice: This plugin has been transferred to ManageWP. I am no longer working on it. Please direct any feedback to the new developer. See the plugin homepage for more information.

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.

Features

  • Detects links that don’t work, missing images, deleted YouTube videos and other problems.
  • Periodically checks links in posts, pages, comments, custom fields and the blogroll.
  • New and modified entries are checked ASAP.
  • Notifies you on the Dashboard if any problems are found.
  • Lets you edit all instances of a specific link at once.
  • Gives you a list of all links ever posted on your site, with the ability to search and filter it.
  • Lets you apply custom CSS styles to broken and removed links.
  • Highly configurable.

The broken links show up in the Tools -> Broken Links tab along. If any invalid URLs are found a notification will also show up on the Dashboard widget. To save screen real-estate, the widget can be configured to stay closed most of the time and automatically expand when broken links are detected.

Download

broken-link-checker.zip (412 KB)

    Requirements

    • WordPress 3.0 or later
    • MySQL 4.1 or later

    The current version of this plugin is only compatible with WordPress 3.0 and up. If you have an older version of WP, try one of the older releases. Specifically, version 0.8.1 is the last one that’s still compatible with the WP 2.8 branch, and version 0.4.14 is the last one compatible with WP 2.1 – 2.6.x.

    Installation

    Install “Broken Link Checker” just like any other WordPress plugin :

    1. Download the .zip file (see below).
    2. Unzip.
    3. Upload the broken-link-checker folder to you /wp-content/plugins directory.
    4. Activate the plugin in the Plugins tab.
    Related posts :

    2,584 Responses to “Broken Link Checker for WordPress”

    1. White Shadow says:

      @hillman – There is no log.

      The plugin can probably get confused by links that contain a quote. I’ll need a more advanced link-finding regexp to solve that, but it’s doable.

    2. The official regex for URIs is ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?

      Confused yet? 🙂

    3. White Shadow says:

      Nah, it makes perfect sense 😉

      Actually I need a regexp for HTML links. I think I’ll need to update the existing one to use a backreference to ensure it only accepts matching types of quotes for the opening and closing quote of the href parameter (I think that sentence got a bit tangled).

      Anyway, I’m putting that off, because currently I have a more pressing issue – finding out how somebody managed to hack this site today. I’ve got it back working, but now I need to read the logs and whatnot…

    4. […] ) 15-Auto Social Poster 16-Broken Link Checker 17-Global Translator […]

    5. […] plugin Broken Link Checker habe ich erst kürzlich eingebaut. es läuft im hintergrund und scannt alte postings nach […]

    6. OK, more on my broken link checker stopping in the queue. It appears to get hung up when checking a link to http://www.phl.org/ . The site never loads up, the curl call never seems to actually time out as it should, and so the AJAX call comes back with a 504 (Gateway Timeout) error. When I manually removed this link from the blc_linkdata table, it went happily on checking the rest of the queue.

    7. White Shadow says:

      @Michael Hampton – Hmm, I guess I’ll have to think of something to detect cases like that.

    8. Well, curl should be timing out, but it isn’t. Looks like the CURLOPT_TIMEOUT isn’t being honored. I don’t know if that’s a bug in curl or in PHP, but it’s certainly a bug.

      Anyway, I worked around it by just having the link checker pull links from the work queue randomly, i.e.:

      /* check the queue and process any links unchecked */
      $sql="SELECT * FROM $linkdata_name WHERE ".
      " ((last_check<'$check_treshold') OR ".
      " (broken=1 AND check_count<5 AND last_check<'$recheck_treshold')) ".
      " ORDER BY RAND() LIMIT 100";

      Now it’s at least checking most of them. 🙂

    9. White Shadow says:

      @Michael Hampton – I seem to recall that “ORDER BY RAND()” is considered a bad thing performance-wise.

    10. Sure, it’s a performance problem if you’re randomizing a few million records. Randomizing 100 is trivial.

      P.S. Please fix your comment form. I’m going nuts having to re-type my information in all over again every time.

    11. White Shadow says:

      @Michael Hampton – I’ll use a different workaround. The new version should be up soon.

      I think one of my antispam plugins is causing the comment problem. I’ll investigate, but it might take a while.

    12. Çim Çit says:

      really works thanks

    13. Dai says:

      Hello, nice to meet you, Janis.

      This is nice plugin.
      I fixed a lot of broken links on my blog.

      But, first time, I got a error below at “Status : ” area on admin page:

      Fatal error: Cannot redeclare class wpdb in /var/www/wp-includes/wp-db.php on line 53

      So, I remove the line

      require_once(“../../../wp-includes/wp-db.php”);

      from wsblc_ajax.php , thinking it was negative solution.

      Today, I found an article, “Tackle Plugin Compatibility Issues While Using Popular Libraries” : http://weblogtoolscollection.com/archives/2008/08/27/tackle-plugin-compatibility-issues-while-using-popular-libraries/

      Yes, That might be the answer!!

      I changed like below :

      /*
      The AJAX-y part of the link checker.
      */
      require_once(“../../../wp-config.php”);
      if(!class_exists(‘wpdb’)) {
      require_once(“../../../wp-includes/wp-db.php”);
      }

      I GOT IT!!!

      It potentially has same problem in require_once(“../../../wp-config.php”), maybe.

      I wish my work will help you, thank you.

    14. White Shadow says:

      @Dai – While I haven’t encountered this problem before your suggested modification certainly can’t hurt. I’ll add it to the plugin 🙂

      However, I think using “isset($wpdb)” instead of “class_exists(‘wpdb’)” will be a better choice because the comments in wp-db.php indicate that it is possible to replace this class by something else by setting the global variable $wpdb.

      Including wp-config.php should be okay, that just loads the WordPress core.

    15. […] solution: Broken Link Checker for WordPress will check and detect both internal and outbound links that don’t work and notifies you on the […]

    16. Dai says:

      Thank you for update.

      > using “isset($wpdb)” instead of “class_exists(’wpdb’)” will be a better choice

      I guess you’re right, actually, it works fine.
      ‘wp-db.php’ is not one of the “Popular Libraries” like PclZip, but a part of
      WordPress system.
      The article is may not suitable for this situation.

      Anyway, the problem has gone.
      I won’t have to edit when this plugin updated.

      If you need, I’ll try to find out which plugin cause the conflict I wrote.

    17. White Shadow says:

      @Dai – Nah, it’s fine, though feel free to investigate if that helps your peace of mind.

    18. Lucy says:

      This is a great plugin – found loads of dead links on one of my blogs. But on another, I can’t get it to run.

      Both blogs are 2.6.1, and both are hosted on the same server, so I think there must be some interference with another plugin, one that I’m not using with the first, successful installation. Specifically, what happens is that it doesn’t run automatically, and when I click ‘re-check all pages’ in an attempt to trigger it, I get my ‘no results of a search’ page, suggesting other links, up for a few seconds. Then the default Broken Link Checker start page comes up again. Very odd!

      I’ve tried deactivating all the obvious plugins – do you have any suggestions?

    19. White Shadow says:

      @Lucy – Hmm, here are some ideas :

      * When you click the “re-check all” button note the URL of the “search page” (before it redirects). That might give some clues.

      * Check your .htaccess. Maybe there are some security-related rules that are blocking parts of the plugin.

      * Try disabling/enabling any cache-related plugins. My intuition tells me those could have something to do with it (somehow).

      * Check file permissions/file owner of broken-link-checker.php and wsblc_ajax.php (especially the second one). The “right” permissions depend on your server configuration, but in general these files should both have the same permissions as the .php files of other, working WP plugins on your server.

    20. Nokao says:

      Hi man.

      I just tested a hack:
      http://wordpress.org/support/topic/190128?replies=4#post-840910

      And I have this problems, can you kindly search the wp-config file in a relative way?:
      Warning: require_once(../../../wp-config.php) [function.require-once]: failed to open stream: No such file or directory in /home/wordpress/plugins/broken-link-checker/wsblc_ajax.php on line 5

      Fatal error: require_once() [function.require]: Failed opening required ‘../../../wp-config.php’ (include_path=’.:/usr/share/pear:/usr/share/php’) in /home/wordpress/plugins/broken-link-checker/wsblc_ajax.php on line 5

    Leave a Reply