Редирект со старых адресов на новые после смены постоянных ссылок

Недавно пришлось менять настройки постоянных ссылок для одного старого сайта клиента. 

В общем, было вот так:

а стало так:

В итоге получилось, что необходимо было настроить около сотни 301-ых редиректов со старых адресов записей вида: http://site.ru/%postname%/ на новые вида: http://site/%category%/%postname%/. 

Через правила .htaccess наверное такую задачу автоматизировано не решить, прописывать больше 100-и редиректов очень не хотелось и тогда было принято решение обработать 404-ую ошибку WordPress’а, когда он не может найти страницу записи с адресом вида: http://site.ru/%postname%/ – искать запись в WordPress с ярлыком (slug’ом) равным этому %postname% и если она есть, то делать 301ый редирект на неё. 

Банальный код, спасший меня от большой рутины:

add_action('template_redirect', function() {
    // если WordPress собирается показать нам 404-ую страницу
    if ( is_404() ) {
        global $wp;
        // пытаемся найти пост по его slug'у или пути, который берем из части URL'а ($wp->request) после домена
        $_post = get_page_by_path($wp->request, OBJECT, 'post');
        // если пост найден:
        if ( is_object($_post) ) {
        	// делаем 301-ый редирект по ссылке на найденый пост
            wp_redirect( get_permalink($_post), 301 );
            exit();
        }
    }
});

Если возникнет вопрос: а собственно зачем всё это?  А потому что, сайт старый, клиент так вот захотел поменять адреса, а Поисковые системы же уже давно проиндексировали посты (записи) по старым URL-адресам, вот что бы они их не потеряли – нам нужны были 301ые редиректы.

ПОДЕЛИТЬСЯ

Программист, преподаватель, консультант.
Активный фрилансер и тех. директор студии AVGroup.
Фанат WordPress'а, а также всего - что даёт скорость в веб-разработке.