Bulk redirect posts to blog page

tdrayson

A SnippetClub member was looking for a way to redirect a bunch of old blog posts to the blog archive page. The solution I came up with was to store an array of all the URLs to match against, if there was a match, we could then redirect the user to our blog page.

1. Hook into the template_redirect action.

We will first hook into the template_redirect action built into WordPress. As quoted from the WordPress docs:

This action hook executes just before WordPress determines which template page to load. It is a good hook to use if you need to do a redirect with full knowledge of the content that has been queried.

PHP

        /*
 * tct_redirect_old_posts
 *
 * @function Redirects a list of posts to a specific page
 * @author Taylor Drayson
 * @since 25/05/2023
*/
add_action('template_redirect', 'tct_redirect_old_posts');
function tct_redirect_old_posts() {

    // Should redirect?
    $redirect = tct_handle_post_redirects();

    if ($redirect === null){
		return;
	}

    wp_safe_redirect($redirect, 301);
    exit;
}
      
Copy

Code breakdown:

  • In our hook, we are going to run our redirect handler function. This will either return a URL, or null depending on the current URL the user has visited.
  • If our handle redirect function returns null, we do nothing and let WordPress continue to load the page it was going to load.
  • However, if we return a URL, then we are going to use the wp_safe_redirect function to return a 301 redirect to our returned URL.

2. Old posts list

We now need to create a function that stores an array of all the URLs we want to match.

PHP

        function tct_old_posts_list(){
    return [
        '/old-page',
        '/super-old-page',
    ];
}
      
Copy

Code breakdown:

  • In this function we are creating a separate item in the array for each URL path we need to match.
  • You can have complex paths if your website has them.
  • For example you can have /my-old-page and also /blog/my-old-article which has /blog/ in front of the end part of the path.
  • NOTE: Ensure you have the / (slash) at the beginning as this is how we will be matching against in all our validations later.

3. Should we redirect? function

Now we want to create our function which will actually run the logic.

PHP

        function tct_handle_post_redirects(){

    $target_url = '/blog'; // url to redirect to if match

    // Get the current URL
    $current_url = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

    // Extract the path from the URL
    $path = parse_url($current_url, PHP_URL_PATH);

    if ($path === null) {
        return $url;
    }

    $path = strtolower($path);
    $path = rtrim($path, "/");

    $urls = tct_old_posts_list();

    if (in_array($path, $urls)){
        return site_url($target_url);
    }

    return null;
}
      
Copy

Code breakdown:

  • The first thing we have done is set the target URL. This is where we will redirect to if our function finds any matches.
  • Next we are getting the current URL that the user has visited and extracting just the path. This will be everything after your domain.
    • For example: https://snippetclub.com/my-blog-post would return the path /my-blog-post
    • Another example: https://snippetclub.com/article/another-article would return the path /article/another-article
  • We have a couple of checks and formatting, to ensure consistent validation of our URLs.
  • Finally we have our function that we created early that contains our array of old URL paths.
  • We run a check to search if our $path matches any of the paths inside our array.
  • If a match is found, we should return our target URL we set earlier, otherwise we return null.

👋🏻 Weekly Tutorial Digest

I send out a weekly newsletter with links to new tutorials written in the last week, you can subscribe below.

Newsletter

🔒I won't send you spam, I promise