Прочитал я новую заметку Leo Babauta “minimal web”, да задумался: и ведь правда, сайт должен быть лёгким.
Чем проще, тем лучше.
Адрес записей в блоге тоже должен быть возможно короткий: такой адрес легко перепечатать, он не обрезается при перепосте в социальных сетях.
QR-коды, если нужны, тоже получаются проще и компактнее:

Задача

Изменить URL записей на адрес по умолчанию (самый короткий), вида:
http://pozhvanov.com/blog/?p=1167
При этом требуется сохранить работоспособность прежних ссылок, сохранённых в поисковых системах.

Условия

Исторически получилось, что в моём блоге, где триста с лишним записей, и который давно проиндексирован в поисковых системах, использовались постоянные ссылки (пермалинки, от permalink) в стиле Blogger:
http://pozhvanov.com/blog/2011/06/macro-photo-how-to.html
то есть они соответствовали шаблону:
/%year%/%monthnum%/%postname%.html
Всем известно, что настройки постоянных ссылок (пермалинков) находятся в Консоли WordPress:
Консоль > Параметры > Постоянные ссылки
Однако если их „в лоб“ переключить на новую схему, то никто не сможет найти страницы по их старым адресам, и вскоре позиции сайта в поисковых системах резко упадут. Поэтому вопрос нужно решать интеллектуально.

Лирическое отступление на тему SEO

На англоязычных ресурсах, например, в Yoast, рекомендуют придерживаться такой структуры постоянных ссылок:
/%postname%/
и сразу указывать в URL некоторые ключевые слова. Тогда, во-первых, по адресу страницы можно предположить, о чём она, и ещё можно ожидать, что позиция страницы в поисковых системах вырастет. В условиях русскоязычного текста писать часть URL кириллицей – это просто непрактично:
/страница/
     ∇
/%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0/

потому что URL с не-латинскими символами кодируются (URL-encode), и получается невообразимое фуфло. Писать URL транслитом – тоже как-то некрасиво, учитывая неоднозначность перехода. Ну, а если записывать смысловую часть URL по-английски (что я и делал раньше), то неясно, как это влияет на позицию страницы в поиске. Иностранцы на кириллическую страницу не приходят, пусть даже есть ключевые слова в адресе. Получается, что короткий адрес по умолчанию – действительно лучше всего.
В конце концов, главное – контент.
Поисковая система его найдёт.

Решение

Мы будем использовать директивы mod_rewrite в файле .htaccess веб-сервера Apache, чтобы сохранить старые ссылки работоспособными.
Сначала составим список из старых ссылок и идентификаторов записей. Мне было лень писать специальный алгоритм для запроса на сервере и составления этого списка, поэтому сделал его вручную, взяв информацию из консоли WordPress. В результате в текстовом файле накопились такие записи для каждого по́ста:
https://pozhvanov.ru/2011/06/macro-photo-how-to.html
https://pozhvanov.ru/wp-admin/post.php?post=1167&action=edit

Теперь нужен какой-нибудь продвинутый текстовый редактор, поддерживающий поиск и замену с использованием регулярных выражений. Я использовал отличный и бесплатный TextWrangler для Mac.
В текстовом редакторе производим замену:
http://www\.pozhvanov\.com/blog/(?P<year>[0-9]+)/(?P<month>[0-9]+)/(?P<name>.*)\.html\rhttp.*post\.php\?post=(?P<id>[0-9]+)&action=edit\r
на:
RewriteCond %{HTTP_HOST} ^.*$
RewriteRule ^blog\\/\P<year>\\/\P<month>\\/\P<name>\\.html?$ "http\\:\\/\\/www\\.pozhvanov\\.com\\/blog\\/\\?p\\=\P<id>" [R=301,L]

В результате наши записи в списке превращаются в такие:
RewriteCond %{HTTP_HOST} ^.*$
RewriteRule ^blog\/2011\/06\/macro-photo-how-to\.html?$ "http\:\/\/www\.pozhvanov\.com\/blog\/\?p\=1167" [R=301,L]

Теперь весь список нужно поместить в скрытый текстовый файл .htaccess в корневом каталоге сайта. Если такого файла нет, создайте его с правами 644.
Остаётся восстановить работу тегов (ярлыков), категорий и многостраничных постов. Для этого нужно дополнительно поместить в .htaccess запись вида:
RewriteCond %{HTTP_HOST} ^.*$
RewriteRule ^blog\/tag\/([^/]+)$ "http\:\/\/www\.pozhvanov\.com\/blog\/\?tag\=$1" [R=301,L]
 
RewriteCond %{HTTP_HOST} ^.*$
RewriteRule ^blog\/category\/([^/]+)$ "http\:\/\/www\.pozhvanov\.com\/blog\/\?cat\=$1" [R=301,L]
 
RewriteCond %{HTTP_HOST} ^.*$
RewriteRule ^blog\/([0-9]{4})\/([0-9]{2})\/([^/]+)\.html\/([0-9]+)?$ "http\:\/\/www\.pozhvanov\.com\/blog\/$1\/$2\/$3\.html" [R=301,L]

Если блог находится в корневом каталоге, то фрагмент ‘blog’ и спецсимволы справа нужно убрать.
Пока вы экспериментируете и проверяете ссылки, вместо постоянного редиректа (R=301) используйте временный (R=302). Но после отладки обязательно установите постоянный редирект, чтобы не терять позиции в рейтинге поисковых систем.

One thought on “Сделай сам: как в WordPress перейти от сложных ссылок к простым пермалинкам и не потерять аудиторию”

Добавить комментарий