Недавно пришлось менять настройки постоянных ссылок для одного старого сайта клиента.
В общем, было вот так:
а стало так:
В итоге получилось, что необходимо было настроить около сотни 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ые редиректы.