Перейти к содержимому
🛠 Как добавить расширение .html к URL-адресам WordPress

🛠 Как добавить расширение .html к URL-адресам WordPress

Перенесли сайт с Joomla или статического HTML на WordPress, а поисковики уже проиндексировали сотни страниц с .html в конце? Потерять позиции не хочется, а стандартные настройки постоянных ссылок такого формата не дают.

На практике .html в URL нужен не для красоты. Это страховка от 404 ошибок при переезде, когда старая структура site.ru/page.html меняется на site.ru/page/. Каждая битая ссылка в индексе, потеря трафика. К счастью, WordPress позволяет добавить расширение .html штатно, без костылей и плагинов.

Ниже, три способа: через админку (самый простой), через код functions.php и для произвольных типов записей. Плюс безопасное удаление .html с редиректом, если формат больше не нужен.

💡 Быстрый обзор:

  • Добавить .html через Настройки → Постоянные ссылки, 30 секунд, без кода
  • Если штатный способ не сработал, правим functions.php (3 строки)
  • Для произвольных типов записей, фильтр post_type_link
  • Убрать .html без 404, редирект в .htaccess

Зачем WordPress-ссылкам расширение.html

Раньше, во времена статических сайтов, каждая страница была физическим .html-файлом на сервере. Браузер запрашивал site.ru/about.html и получал готовый документ. WordPress работает иначе: все URL, виртуальные, их обслуживает index.php через mod_rewrite.

Однако привычка к «файловым» окончаниям жива до сих пор. Типичные сценарии, когда .html действительно нужен:

  • Редизайн или переезд со статического сайта. Старые URL уже в индексе Google и Яндекса. Менять их без редиректа, гарантированный обвал позиций на 2-4 месяца.
  • Миграция с Joomla, Drupal, ModX. Многие CMS старой школы по умолчанию генерировали .html в конце адреса.
  • Требование заказчика. Клиент «хочет как было», и точка. Спорить дольше, чем сделать.

WordPress позволяет закрыть все три случая без единого плагина.

Способ первый: через админку

Самый быстрый путь. Зайдите в Настройки → Постоянные ссылки и выберите вариант «Произвольно».

В поле структуры допишите .html в конец шаблона. Например:

1/%category%/%postname%.html

Или если категории не нужны:

1/%postname%.html

Нажмите «Сохранить изменения». Готово. Все новые и существующие URL записей получат окончание .html. Страницы сайта (page) этот способ не затрагивает, для них потребуется код из следующего раздела.

Обратите внимание: если на сайте уже есть проиндексированные ссылки без .html, WordPress сам редирект со старых URL на новые НЕ делает. Понадобится отдельный плагин редиректов или правила в .htaccess.

Способ второй: через functions.php

Бывает, что админка не даёт результата: тема или другой плагин переопределяют структуру ссылок. Тогда идём в код.

Добавьте в functions.php дочерней темы или через плагин Code Snippets:

1/**
2 * Добавляет .html в конец URL страниц WordPress.
3 * После вставки кода зайдите в Настройки → Постоянные ссылки
4 * и нажмите «Сохранить изменения» для сброса кэша rewrite-правил.
5 */
6add_action('init', function() {
7 global $wp_rewrite;
8 if (! strpos($wp_rewrite->get_page_permastruct(), '.html')) {
9 $wp_rewrite->page_structure .= '.html';
10 }
11});

Что здесь происходит: хук init срабатывает при каждой загрузке WordPress и добавляет .html к структуре URL страниц через свойство page_structure глобального объекта $wp_rewrite. Проверка strpos страхует от двойного добавления, если код вставили дважды.

После добавления кода обязательно зайдите в Настройки → Постоянные ссылки и нажмите «Сохранить изменения». Без этого шага WordPress не перестроит кэш rewrite-правил, и новые URL не заработают, получите 404.

Если штатный способ и код не помогают, можно подключить плагин Permalink Manager Lite. У него 100 000+ активных установок, рейтинг 5 звёзд и поддержка rewrite-правил для любого типа контента, включая таксономии и WooCommerce.

Как добавить.html произвольным типам записей (CPT)

У вас на сайте портфолио, отзывы, товары или другой тип контента, созданный через register_post_type. Штатный экран «Постоянные ссылки» на них не влияет. Работаем через фильтр post_type_link:

1/**
2 * Добавляет расширение .html к URL произвольного типа записей "portfolio".
3 * Замените 'portfolio' на свой slug CPT.
4 */
5function sdstudio_cpt_html_permalink($post_link, $post) {
6 if ($post->post_type === 'portfolio') {
7 return home_url('/portfolio/' . $post->post_name . '.html');
8 }
9 return $post_link;
10}
11add_filter('post_type_link', 'sdstudio_cpt_html_permalink', 10, 2);

После вставки кода, снова Настройки → Постоянные ссылки → Сохранить изменения. Фильтр post_type_link работает на лету: WordPress формирует URL, вы перехватываете его для нужного типа записей и дописываете .html.

Если CPT зарегистрирован с кастомным слагом ('rewrite' => array('slug' => 'works')), используйте его в home_url() вместо стандартного названия типа.

Как убрать.html и не сломать индексацию

Решили вернуться к чистым URL без расширений? Просто удалить .html из настроек недостаточно. Старые ссылки, уже попавшие в индекс поисковиков, станут 404.

Порядок действий:

  • Уберите .html из поля «Произвольно» в Настройки → Постоянные ссылки и сохраните.
  • Удалите код из functions.php, если добавляли.
  • Добавьте в .htaccess (в корне сайта, до блока # BEGIN WordPress) редирект:
1RewriteEngine On
2RewriteCond %{REQUEST_FILENAME} !-f
3RewriteRule ^portfolio/(.+)\.html$ /portfolio/$1 [R=301,L]

Для обычных записей и страниц правило аналогичное, достаточно заменить /portfolio/ на нужный сегмент. R=301 указывает поисковикам, что переезд постоянный: вес ссылки передаётся новому URL.

Проверьте результат: откройте в браузере старый адрес с .html, должна произойти переадресация на версию без расширения. Затем загляните в Google Search Console через пару недель и убедитесь, что количество проиндексированных 404 снижается.

Видео: добавляем.html за 2 минуты

Короткая демонстрация всех трёх способов на живом сайте WordPress:

⁉️🤔 Частые вопросы

Работает ли метод с таксономиями, рубриками и метками?

Штатный экран постоянных ссылок таксономии не затрагивает. Для рубрик и меток потребуются собственные rewrite-правила через add_rewrite_rule() или функционал Permalink Manager Pro. Но на практике .html в URL рубрик используют редко: поисковики нормально воспринимают /category/seo/ без расширения.

Что случится со старыми ссылками без.html после изменения структуры?

WordPress не создаёт автоматический редирект со старых URL на новые. Если сайт уже проиндексирован, после смены структуры старые ссылки начнут отдавать 404. Решение: плагин редиректов (например, Redirection) с автоматическим отслеживанием изменений постоянных ссылок. Он запоминает старый slug и сам подставляет 301.

Можно ли использовать.php,.htm или другое расширение?

Технически да, WordPress обрабатывает любую строку в поле «Произвольно». Но с точки зрения поисковиков .php выглядит подозрительно (обычно выдаёт технологию сервера), а .htm, устаревший формат из эпохи Windows 3.1. Расширение .html нейтрально, привычно и не вызывает вопросов ни у пользователей, ни у поисковых роботов.

Поможет ли это при переносе блога с Blogger на WordPress?

Да, это классический сценарий. Blogger по умолчанию отдавал URL в формате /2024/06/post-title.html. При импорте в WordPress через штатный инструмент структура ломается на /2024/06/post-title/. Добавление .html в настройки постоянных ссылок сохраняет совместимость, все старые адреса продолжают работать без ручных редиректов.

Стоит ли добавлять.html: итоговый расклад

Если коротко: для нового проекта на WordPress с нуля .html не нужен. Чистые URL site.ru/post-name/, стандарт, который понимают и пользователи, и поисковики.

Но есть два сценария, где .html полностью оправдан: переезд со статического сайта или другой CMS и миграция с Blogger. В обоих случаях вы сохраняете позиции в поиске и экономите недели на ручных редиректах.

Самый надёжный путь, штатная настройка через админку. Не сработала, functions.php. Для CPT, фильтр post_type_link. Все три способа не требуют плагинов и не нагружают сайт. А когда .html станет не нужен, .htaccess с 301 редиректом аккуратно передаст вес новым URL.