Smart 404 for WordPress

Save visitors to your WordPress site from unhelpful 404 errors!

When a page cannot be found, Smart 404 will use the current URL to attempt to find a matching page, and redirect to it automatically. Smart 404 also supplies template tags which provide a list of suggestions, for use on a 404.php template page if a matching post can’t be immediately discovered.

Instead of quickly giving up when a visitor reaches a page that doesn’t exist, make an effort to guess what they were after in the first place. This plugin will perform a search of your posts, tags and categories, using keywords from the requested URL. If there’s a match, redirect to that page instead of showing the error. If there’s more than one match, the 404 template can use some template tags to provide a list of suggestions to the visitor.

This plugin is also useful if you have recently changed your permalink structure: With minimal or no adjustment, old permalinks will still work.

My latest project:

The Cartographer banner


Get Smart 404 over at the Smart 404 WordPress Plugin page!


  1. Unzip the package, and upload smart404 to the /wp-content/plugins/ directory on your WordPress site.
  2. Activate the plugin through the ‘Plugins’ menu in WordPress.
  3. Optionally, alter your theme’s 404.php template to list suggestions from Smart 404

Note: If you desire reporting on 404 errors that Smart 404 is unable to remedy, I recommend Joe Hoyle’s JH 404 Logger, which adds an item to your dashboard listing 404 errors. 404 Notifier by Alex King will send emails for 404 errors, but I hear reports that emails are sent for 404 errors that this plugin is able to recover from, not just unrecoverable errors.


There are two configuration options for Smart 404:


Turn on or off searching of posts, pages, tags and categories

Ignored patterns

A newline-separated list of terms or patterns to ignore from the URL. This is particularly useful for supporting old permalinks with an ID number in them. For example, to work with URLs like:


Add the regular expression pattern:


This will ignore all numbers, followed by a hyphen, at the start of the URL.

Template Configuration

To provide a helpful list of suggested posts in your 404 pages, modify the 404.php template in your theme to use a Smart 404 template tag. For example:

<?php if (smart404_has_suggestions()) : ?>
Try one of these links:
<?php smart404_suggestions(); ?>
<?php endif; ?>

Or, for something a little more complicated:

<?php if (smart404_loop()) : ?>
<p>Or, try one of these posts:</p>
<?php while (have_posts()) : the_post(); ?>
<h4><a href="<?php the_permalink() ?>"
title="<?php the_title_attribute(); ?>">
<?php the_title(); ?></a></h4>
  <small><?php the_excerpt(); ?></small>
<?php endwhile; ?>
<?php endif; ?>

Note that smart404_loop() will only work for posts, not pages, due to limitations in the loop mechanism. Several template tags are supplied by Smart 404 for use in the 404.php template:


Returns true if there are some suggestions, false otherwise


Retrieve an array of post objects for rendering manually.


Draw a list of suggested posts.

Pass the parameter “list” to render suggestions as a list.


Query posts for use in a Loop. See the second example above for usage. Note that smart404_loop() will only work for posts, not pages, due to limitations in the loop mechanism.

, , , . Bookmark the permalink. Both comments and trackbacks are currently closed.


  1. Posted December 18, 2011 at 7:12 pm | Permalink

    I’ve been able to confirm that this plugin, combined with the 404 notifier you mention, does indeed mail, even though the 404 is found. I’m running the latest version (as of this moment) of both WordPress and both plugins.

  2. Posted February 7, 2012 at 6:50 pm | Permalink

    I liked this plug-in, almost fixed all my URL problems caused by the permalink change that I had to make this mounth, but my site also have a lot of attached files and there lies a problem, It would be nice if it had the option to search in attachment posts too. I readied that you are without time to work in the plug-in, but if you could give some pointers in how to work this out, I would be very glad.

    Anyway, nice work with the plugin, tks for the attention.

  3. Posted February 27, 2012 at 10:57 am | Permalink

    Just installed the plugin and created a custom 404 page.

    The suggestion list is ordered with the latest post first. I want it ordered with the ‘most relevant’ first. Is that possible?

    Anyways, nice plugin.

    Thanks, Biju

  4. Posted March 4, 2012 at 2:33 pm | Permalink

    The plugin is a very good one. I have not come across a better way of tackling 404 pages – it satisfies the requirements of SEO (from the cursory study I made about how the plugin works) and of course it is an excellent way to ensure the website visitor does not land at a dead end.

    Keep up the good work. I was curious to know how long have you been working with WordPress and please suggest a resource to use to become a WordPress expert.

    Thanks in advance.

  5. Piyush
    Posted April 14, 2012 at 4:43 pm | Permalink

    Awesome Plugin buddy….. It helped me a lot when i shifted my blog from blogger to wordpress..

    A special thnx to you guyz… :)

  6. Posted July 29, 2012 at 7:19 am | Permalink

    my site had a 404 error and i was looking for a plugin and found this one. i wanted to see some screenshots or some demo about how this plugin works?

    any such examples please? i came to this plugin page from shoutmeloud recommendation

  7. Posted July 29, 2012 at 3:14 pm | Permalink

    Hello Tom,

    thanks for your rely..

    when i click on the link you provided it goes to this url,

    is this how the 404 plugin works?

  8. Posted August 2, 2012 at 1:24 pm | Permalink

    Hello Tom,

    yeah, that is what exactly i was looking for…

    thanks a lot :)

  9. scimon
    Posted August 21, 2012 at 5:08 pm | Permalink

    This plugin is pretty good, but seems a bit stale. It also seems to fail to find a relevant substitute, or sometimes ends up with only one odd suggestion and redirects to it. Some stemming would be handy e.g; a renamed /teaching does not seem to end up finding /teach as a suggestion.

    • Posted August 22, 2012 at 1:53 am | Permalink

      /teaching does not seem to end up finding /teach as a suggestion.

      perhaps the Ignored patterns regexp could take & execute a substitution of null for common suffixes? ie: /*ing//

      let me know if it doesn’t, & i might take a look;-)

    • Posted August 22, 2012 at 1:57 am | Permalink

      hmmm, maybe the Ignored patterns regex can b futzed 2 remove common suffixes: /ing//

    • Posted August 22, 2012 at 11:36 am | Permalink

      This is indeed possible – you just need to configure the plugin to do so, I think.

      Add the following line to the “Ignored patterns” field in the plugin’s settings, and that should do it:


      • Posted August 22, 2012 at 1:13 pm | Permalink

        just tried that & it doesn’t seem 2 work…i’ll look into how ig.pats work when i get a chance

      • Posted August 22, 2012 at 7:24 pm | Permalink

        just noticed this in my error log:

        PHP Fatal error: Call to undefined function add_action() in smart404.php on line 392

        which is:

        add_action( ‘template_redirect’, ‘smart404_redirect’ );

        • Posted August 22, 2012 at 7:28 pm | Permalink

          nevermind, it was in a non-wp directory, tried 2 load it from the url

  10. tom
    Posted August 22, 2012 at 2:01 am | Permalink

    oops, 1st post resulted in a 500 error, so i reposted…looks like both took;-)

  11. Posted October 9, 2012 at 6:46 pm | Permalink


    what is the easiest way to turn off the redirection and just keeping the suggestion?


    • Posted October 9, 2012 at 8:00 pm | Permalink

      Comment the lines:

       add_action( 'template_redirect', 'smart404_redirect' );
       add_filter( 'redirect_canonical', 'smart404_redirect_canonical_filter', 10, 2 );

      at the bottom (add “//” at the beginning of the line).

      • Posted November 11, 2012 at 12:39 pm | Permalink

        Hey, thank you, but your solution does’nt work.

        • Posted November 11, 2012 at 12:40 pm | Permalink

          Sorry, it does work but i dont get any suggestions.

  12. nathan
    Posted October 14, 2012 at 4:32 pm | Permalink

    I already changed query_posts( array( “post__in” => $postids ) );


    query_posts( array( “post__in” => $postids, “showposts” => 10 ) );

    but it still show 5 related posts instead of 10. How to fix this?

  13. Posted October 28, 2012 at 4:58 pm | Permalink

    I think Smart 404 is redirecting from pages that it shouldn’t be redirecting from. How can I look into this?

  14. Posted December 13, 2012 at 4:59 pm | Permalink

    ignored patterns seems to be ignored;-}

    [email protected]@i,@/(trackback|feed|(comment-)?page-?[0-9])/[email protected],@\\.(html|php)[email protected],@/?\\?.*@i [uri=/about-us/wp-xxx= search_words=wp xxx

    perhaps i’m misunderstaning regex/array_map/create_function?

    • Posted February 26, 2013 at 5:42 pm | Permalink

      output from my debug:

      smart404_redirect: ignored_patterns_input=wp-.* (ing|s|er|est)$ smart404_redirect: [email protected]* (ing|s|er|est)[email protected],@/(trackback|feed|(comment-)?page-?[0-9]*)/[email protected],@\.(html|php)[email protected],@/?\?.*@i

      so why isn’t $patterns_array = explode( '\n', $patterns ); creating elements like ` $patterns_array[] = “/?\?.*”;’ does so that the array_map creates separate patterns?

      • Posted February 26, 2013 at 6:45 pm | Permalink

        fixed it:

        $patterns_array = preg_split('/\n|\r/', $patterns, -1, PREG_SPLIT_NO_EMPTY);

        instead of

        $patterns_array = explode( '\n', $patterns );

  15. nathan
    Posted December 14, 2012 at 3:37 am | Permalink

    Is there anyway redirect the search term to instead of showing the result at 404 page.

    • scimon
      Posted December 20, 2012 at 4:41 pm | Permalink

      You can do that in a 404 template, with something like: $term=str_replace("_", "-", basename(trim(urldecode($_SERVER["REQUEST_URI"])))); query_posts(array("s"=>$term));

  16. Posted December 14, 2012 at 1:29 pm | Permalink

    well, it works sometimes: with only “wp-.*” in ignored patterns correctly finds but adding “index.php” to ignored patterns breaks it: returns: wp index in the search terms…i’ll dive into regex when i get a chance…

  17. Posted December 20, 2012 at 4:35 pm | Permalink

    I have added a patch to the forums that: 1) removes unnecessary calls to exit 2) provides a saner redirection behavior for content matches [iff there is one match in posts AND pages] 3) try to ignore sticky posts 4) note that code could simplified if options were tweaked to store singular form [post V posts]

  18. BAC
    Posted February 23, 2013 at 7:08 pm | Permalink


    Noticed that the Infinite Scroll plugin causes smart 404 to show a random post when reaching the end of an archive.

    from the infinite scroll site “Infinite scroll is configured to die when it hits a 404 Not Found status code, so when it goes through all your archives it should hit a /page/43/ (or something) that doesn’t exist, then show a message “Congrats, you’ve reached the end of the internet.” “

    Can you think of any way round this?

    • airdrummer
      Posted February 25, 2013 at 10:18 pm | Permalink

      sorry, i don’t use infinite scroll…is there some way i.s. requests can be identified? by referer perhaps?

  19. Posted July 5, 2013 at 2:31 pm | Permalink


    I have using a custom 404.php page that will redirect all 404 page request to home page. here is the code of 404.php file.

    You can use the same..


  20. Posted November 29, 2013 at 1:18 pm | Permalink

    Thanks for sharing Info…..! The latest version doesn’t work at all for me either. I tried disabling all other plug-ins, and that didn’t help. The 404 script doesn’t show anything. Same with my other site at It worked just fine before!

    Could it be a conflict with the Thesis theme perhaps?