ЧПУ и настройка ссылок WordPress: permalinks и .htaccess

ЧПУ и настройка ссылок WordPress: permalinks и .htaccess

Кратко: ЧПУ (человекопонятный URL) — это адрес вида /chpu-wordpress-nastroyka-ssylok/ вместо /?p=123. Человек и поисковик сразу понимают, о чём страница, а адрес можно продиктовать по телефону. В WordPress структура ссылок задаётся в разделе «Настройки → Постоянные ссылки», а физическую маршрутизацию выполняет файл .htaccess на Apache или директивы rewrite на Nginx. Рабочий вариант для большинства сайтов — короткая стабильная структура /%postname%/. Если вы меняете ссылки на живом сайте, обязательно настройте 301-редиректы со старых адресов, иначе потеряете позиции и трафик. Ниже — настройка по шагам, готовые правила .htaccess и Nginx, свои rewrite-правила с кодом, таблица редиректов и типичные ошибки новичков.

Что такое ЧПУ и почему адрес страницы важен

ЧПУ расшифровывается как «человекопонятный URL». Это адрес страницы, собранный из осмысленных слов, а не из цифр и знаков вопроса. Сравните два варианта одной и той же записи:

https://site.ru/?p=1387
https://site.ru/kak-nastroit-chpu-wordpress/

Первый адрес ничего не говорит ни человеку, ни поисковому роботу. Второй сразу отвечает на вопрос «о чём эта страница» — и в строке браузера, и в выдаче Яндекса или Google. Именно поэтому правильные ЧПУ — это не косметика, а базовая часть SEO.

Что дают человеко-понятные ссылки на практике:

  • Ключевое слово в адресе. Если в URL есть «chpu-wordpress», это дополнительный сигнал релевантности. Влияние небольшое, но бесплатное.
  • Читаемость в выдаче. В сниппете поисковик часто показывает адрес. Понятный URL повышает доверие и кликабельность.
  • Удобство для людей. Ссылку можно продиктовать, запомнить, скопировать без обрезки. Это важно для соцсетей и мессенджеров.
  • Чистая аналитика. В Яндекс Метрике отчёт по страницам читается глазами: видно, какая статья приносит трафик, без расшифровки ID.

По умолчанию «из коробки» WordPress отдаёт как раз некрасивые ссылки с ID. Задача этой статьи — превратить их в ЧПУ и заодно понять, что происходит внутри: как тема, ядро и сервер договариваются, какой материал показать по запрошенному адресу.

Как в WordPress устроены постоянные ссылки

Внутри WordPress есть таблица wp_posts, где у каждой записи хранится поле post_name — это и есть слаг, «хвост» ссылки. А ещё есть настройка permalink_structure, которая лежит в таблице wp_options. Она описывает шаблон адреса: какие части и в каком порядке подставлять.

Когда к сайту приходит запрос на адрес вида /kak-nastroit-chpu/, сервер (Apache или Nginx) должен понять: это не реальный файл на диске, а запрос к CMS. Для этого в дело вступает перезапись URL — mod_rewrite. Все адреса «вида ЧПУ» аккуратно отправляются в index.php, а дальше WordPress сам разбирает строку и решает, что показать.

Схема выглядит так:

  1. Браузер запрашивает https://site.ru/kak-nastroit-chpu/.
  2. Apache по правилу из .htaccess переадресует запрос на index.php, не меняя адрес в строке браузера.
  3. Ядро WordPress парсит строку запроса и сопоставляет её с правилами перезаписи (rewrite rules).
  4. Находится подходящая запись, формируется объект WP_Query, выбирается шаблон темы и отдаётся HTML.

Ключевая мысль: ЧПУ — это «витрина», а настоящий маршрут обрабатывают правила перезаписи. Если правила устарели или .htaccess недоступен, вы получите 404 даже при корректной настройке в админке. Поэтому важно понимать обе части — и настройку структуры, и работу сервера. Как устроены запросы глубже, разобрано в статье про REST API WordPress для новичков.

Настройка ЧПУ по шагам: «Постоянные ссылки»

Самое простое начинается в админке. Зайдите в «Настройки → Постоянные ссылки» и выберите структуру. Для большинства сайтов оптимален вариант «Название записи» — это структура /%postname%/. Для блога с крупной рубрикацией иногда добавляют рубрику, но новичку лучше не усложнять.

Разберём доступные теги структуры, чтобы вы выбирали осознанно:

Тег структуры Что подставляет Пример адреса Когда использовать
%postname% Слаг записи /kak-nastroit-chpu/ Универсальный вариант, лучший для блога и услуг
%post_id% Числовой ID записи /1387/ Когда слаги постоянно меняются, а SEO не приоритет
%category% Слаг рубрики /wordpress/chpu/ Крупные тематические блоги с чёткой рубрикацией
%year% / %monthnum% Год и номер месяца /2026/09/ Новостные сайты, где важна дата
%author% Логин автора /admin/kak-nastroit/ Блоги с несколькими авторами (осторожно)
%postname%.html Слаг с расширением /kak-nastroit-chpu.html Если переносите старый статический сайт

После выбора обязательно нажмите кнопку «Сохранить изменения». Это действие не только записывает настройку, но и сбрасывает кэш правил перезаписи — WordPress заново их пересобирает. Если этого не сделать, новые адреса могут не работать, пока правила не обновятся.

Пара практических советов для структуры:

  • Делайте слаги короткими: 2–4 слова, латиница, через дефис. Этот слаг вы задаёте в отдельном поле под заголовком записи.
  • Не включайте в структуру даты, если контент не привязан ко времени: для «вечнозелёных» статей это лишний шум.
  • Не используйте кириллицу в адресах, даже если WordPress её технически поддерживает: транслитерация надёжнее для ссылок и аналитики.
  • Не меняйте структуру «ради красоты» на работающем сайте без редиректов — об этом отдельный раздел ниже.

.htaccess и mod_rewrite: что делает Apache

На классическом хостинге веб-сервером чаще всего работает Apache. Файл .htaccess лежит в корне сайта, начинается с точки и выполняет роль локального конфигуратора: в нём хранятся правила перезаписи адресов. WordPress при сохранении «Постоянных ссылок» сам записывает туда нужный блок — но только если файл доступен для записи.

Базовый блок, который WordPress добавляет в .htaccess, выглядит так:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Разберём по строкам, что здесь происходит:

  • RewriteEngine On — включает движок перезаписи.
  • RewriteBase / — говорит, что сайт живёт в корне домена. Если WordPress установлен в подпапку, тут будет /папка/.
  • RewriteCond %{REQUEST_FILENAME} !-f — условие «если запрошенный файл не существует физически».
  • RewriteCond %{REQUEST_FILENAME} !-d — условие «и если это не существующая директория».
  • RewriteRule . /index.php [L] — тогда отправляем всё в index.php и прекращаем обработку ([L]).

Логика проста: реальные файлы (картинки, CSS, JS из темы) отдаются как есть, а всё остальное — «красивый» адрес — уходит в ядро WordPress на разбор. Именно поэтому прямые ссылки на изображения работают, а ссылки на статьи обрабатывает PHP.

Две частые проблемы, с которыми сталкиваются новички:

  • Нет прав на запись. Если файл .htaccess защищён от записи, WordPress покажет подсказку «нужно вставить правила вручную». Можно скопировать блок выше и добавить его самостоятельно через файловый менеджер хостинга.
  • Модуль mod_rewrite выключен. Тогда ЧПУ вообще не работают, и никакие настройки в админке не помогут — нужно включить модуль или обратиться в поддержку хостинга.

Важный совет по безопасности: никогда не редактируйте .htaccess вслепую. Сначала сохраните копию файла, потом правьте. Сломанный .htaccess отдаёт «500 Internal Server Error» на весь сайт. Основы закрепления сайта от таких сбоев разобраны в статье про безопасное обновление WordPress.

Nginx вместо .htaccess: правила rewrite

Многие современные хостинги и высоконагруженные проекты работают на Nginx. У этого сервера другая логика конфигурации: он не читает файл .htaccess вообще, а все правила задаются в основном конфиге сайта (например, в панели хостинга или файле вида /etc/nginx/sites-available/site.ru). Если перенести сайт с Apache на Nginx и ничего не настроить, ЧПУ перестанут работать — будут 404.

Эквивалент правила из WordPress для Nginx выглядит так:

location / {
    try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Ключевая строка — try_files $uri $uri/ /index.php?$args;. Она читается так: «попробуй отдать реальный файл, потом директорию, а если ничего нет — передай запрос в index.php вместе с параметрами». Это и есть аналог правил .htaccess для Nginx.

Часто к этому добавляют правило для REST API и админки, чтобы запросы не ломались:

location ~ ^/(wp-admin|wp-json|wp-login\.php) {
    try_files $uri $uri/ /index.php?$args;
}

Что важно помнить про Nginx:

  • Правила правятся не в файле сайта, а в конфиге сервера — обычно через панель хостинга или тикет в поддержку, не через FTP.
  • После изменений конфиг нужно проверить командой nginx -t и только потом перезагрузить сервер systemctl reload nginx. Иначе рискуете уронить все сайты на сервере.
  • Если вы на shared-хостинге, у вас, скорее всего, всё равно Apache «под капотом», и .htaccess работает — уточните это в поддержке, прежде чем что-то менять.

Как связать Nginx с Кэшем и статикой для скорости, разобрано в материале про кэширование WordPress для новичков.

Свои правила переписывания: add_rewrite_rule и query vars

Иногда стандартных адресов мало. Например, вы хотите, чтобы страница поиска по каталогу была не /?s=товар, а /search/товар/, или чтобы ссылка на профиль автора была /master/ivan/. Для этого WordPress даёт функции add_rewrite_rule(), add_rewrite_tag() и механизм query vars.

Базовый пример: добавим красивый адрес /faq/, который отдаёт определённую страницу. Код добавляем в functions.php дочерней темы:

<?php
add_action( 'init', function () {
    add_rewrite_rule(
        '^faq/?$',
        'index.php?page_id=128',
        'top'
    );
} );

Здесь ^faq/?$ — регулярное выражение, которое ловит адрес /faq/. Параметр 'top' означает, что правило ставится выше стандартных, чтобы не конфликтовать с другими адресами.

Более сложный вариант — свой шаблон ссылки с переменной. Зарегистрируем «паспорт» запроса через query var и поймаем адрес /master/ivan/:

<?php
add_filter( 'query_vars', function ( $vars ) {
    $vars[] = 'master';
    return $vars;
} );

add_action( 'init', function () {
    add_rewrite_rule(
        '^master/([^/]+)/?$',
        'index.php?master=$matches[1]',
        'top'
    );
} );

А теперь важный момент, на котором спотыкаются почти все новички. После добавления нового правила его нужно один раз «сбросить», иначе оно не заработает. Правила перезаписи хранятся в базе, и без пересборки движок о них не знает. Сделать это можно двумя способами.

Способ первый — правильный, через хук активации темы (сброс выполняется один раз, а не на каждом запросе):

<?php
register_activation_hook( __FILE__, function () {
    flush_rewrite_rules();
} );

add_action( 'after_switch_theme', function () {
    flush_rewrite_rules();
} );

Способ второй — руками: зайти в «Настройки → Постоянные ссылки» и просто нажать «Сохранить изменения». Кнопка «Сохранить» на этой странице всегда пересобирает правила, даже если вы ничего не меняли. Это самый простой способ «починить» ЧПУ после правок кода.

⚠️ Никогда не вызывайте flush_rewrite_rules() на каждом запросе (например, прямо в теле функции без хука init). Это тяжёлая операция: она пишет в базу и пересчитывает все правила. На каждом запросе это заметно замедлит сайт. Сбрасывайте правила один раз — при активации темы или по кнопке в админке.

Кстати, если вам нужно вывести ссылку на такую страницу в шаблоне, используйте home_url() и функцию построения адреса — про них ниже. А как подключать код вообще, если вы правите тему, разобрано в гайде про дочернюю тему WordPress и в статье про хуки WordPress: actions и filters.

Смена структуры на живом сайте: редиректы 301

Это самый ответственный раздел. Пока сайт новый, менять структуру можно сколько угодно — поисковик ещё ничего не запомнил. Но если статьи уже проиндексированы и на них ведут ссылки, смена адресов без редиректов означает потерю трафика: старые ссылки начнут отдавать 404, а поисковик выкинет их из индекса.

Правило одно: каждой старой ссылке — постоянный (301) редирект на новую. Код 301 говорит поисковику «страница переехала навсегда, весь её вес передай на новый адрес». Сравните коды:

Старый адрес Новый адрес Правило и код
/?p=1387 /kak-nastroit-chpu/ 301, WordPress делает сам при смене структуры
/2026/09/chpu/ /chpu-wordpress/ 301, вручную в .htaccess или плагином
/staryj-sait-wordpress/ /zakazat-sayt-na-wordpress/ 301 через Redirect 301 в .htaccess
/page2/ /blog/page/2/ 301, правило для пагинации

Способов настроить редиректы несколько. Самый быстрый — плагин вроде Redirection: он ведёт журнал 404 и позволяет сопоставлять старые адреса с новыми. Для тех, кто предпочитает код, подойдёт правило в .htaccess:

Redirect 301 /staryj-sait-wordpress/ /zakazat-sayt-na-wordpress/

А если правило нужно гибкое — например, перенести целую группу адресов — используйте RewriteRule:

RewriteRule ^2026/09/(.*)$ /$1 [R=301,L]

Или сделайте редирект на уровне PHP, прямо в шаблоне или через functions.php:

<?php
add_action( 'template_redirect', function () {
    if ( is_page( 'contacts-old' ) ) {
        wp_redirect( home_url( '/#contact' ), 301 );
        exit;
    }
} );

Три правила, которые уберегут от потери трафика:

  • Сначала зафиксируйте список старых адресов (его можно выгрузить из sitemap или из отчёта Яндекса). Без списка вы обязательно что-то забудете.
  • После смены структуры сразу отправьте новый XML-карта сайта (sitemap) для Яндекса и Google и проверьте индексацию.
  • Не удаляйте старые адреса «наглухо»: 404 и 410 отдают сигнал «страницы нет», а 301 — «переехала». Для SEO это принципиально разные вещи.

Типичные ошибки: почему ЧПУ не работают и как чинить 404

Если после настройки ссылки отдают 404, а страницы не открываются, причина почти всегда в одном из пунктов ниже. Разберём по частоте.

  1. Правила перезаписи не сброшены. Самая частая причина. Откройте «Настройки → Постоянные ссылки» и нажмите «Сохранить изменения» — это пересоберёт правила.
  2. .htaccess недоступен для записи. WordPress не смог записать правила. Проверьте права файла или добавьте блок вручную.
  3. Не включён mod_rewrite на Apache. Тогда ЧПУ не заработают в принципе — нужна поддержка хостинга.
  4. Переезд с Apache на Nginx без правил. Nginx не читает .htaccess; нужен try_files в конфиге.
  5. Конфликт плагина. Плагин безопасности, кэша или мультиязычности может перехватывать запросы. Проверяется отключением плагинов по одному.
  6. Слаг занят. Если у записи и рубрики совпадает адрес, WordPress добавит -2 или отдаст 404. Проверяйте уникальность слагов.
  7. Кэш страницы устарел. Плагин кэширования отдаёт старую версию. Сбросьте кэш после смены структуры.
  8. Неправильный RewriteBase. Если сайт в подпапке, а RewriteBase / — ссылки сломаются. Должно быть RewriteBase /ваша-папка/.

Быстрый чек-лист диагностики: сначала посмотрите .htaccess (есть ли блок WordPress), затем проверьте, включён ли mod_rewrite, затем нажмите «Сохранить» в «Постоянных ссылках», и только после этого ищите проблему в плагинах. А чтобы смена структуры не совпала с другой проблемой, полезно вести чистый список статей — экспорт и перенос данных разобраны в руководстве про импорт и экспорт в WordPress.

Полезные сниппеты для работы со ссылками

Небольшая шпаргалка функций и приёмов, которые пригодятся в каждом проекте. Это те мелочи, которые позволяют выводить ссылки правильно и не ломать адреса.

1. Правильный вывод ссылки на запись и на главную. Никогда не вписывайте домен руками — используйте функции, чтобы адрес оставался рабочим после переезда:

<?php
$link = get_permalink( get_the_ID() ); // без учёта параметров
the_permalink();                        // сразу вывести в шаблоне
echo esc_url( home_url( '/' ) );        // главная страница
echo esc_url( home_url( '/blog/' ) );   // конкретный раздел
echo esc_url( get_category_link( 148 ) ); // ссылка на рубрику по ID

2. Добавление GET-параметра к ссылке. Функция add_query_arg() сама следит за разделителями — не нужно клеить строки вручную:

<?php
$url = add_query_arg( 'utm_source', 'vk', get_permalink() );
echo esc_url( $url );

3. Проверка текущего адреса в шаблоне. Часто нужно подсветить активный пункт меню или вывести разные баннеры на разных страницах:

<?php
if ( is_singular( 'post' ) && has_category( 148 ) ) {
    // это статья в категории «Разработка WordPress»
    echo 'Материал для разработчиков';
}

4. Ссылка на архив автора и на страницу поиска. В отличие от ID, эти функции сами формируют корректный ЧПУ:

<?php
echo esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) );
echo esc_url( get_search_link( 'wordpress' ) );

5. JavaScript: читаем адрес и работаем с ним без перезагрузки. Полезно для фильтров каталога, которые строят ссылку на лету:

const url = new URL( window.location.href );
url.searchParams.set( 'sort', 'price' );
console.log( url.toString() ); // аккуратный адрес с параметром

6. AJAX-ссылка с правильным адресом. Если подгружаете данные без перезагрузки, обратите внимание на адрес REST API и на передачу параметров:

fetch( '/wp-json/wp/v2/posts?categories=148&per_page=5' )
  .then( res => res.json() )
  .then( posts => console.log( posts.map( p => p.link ) ) );

Подробнее про такие запросы — в статье про AJAX в WordPress, а про манипуляции с URL через консоль — в гайде по REST API WordPress.

7. WP-CLI: сброс правил и структуры из терминала. На серверах с SSH это быстрее, чем ходить в админку:

wp rewrite flush --hard
wp option update permalink_structure '/%postname%/'

Команда wp rewrite flush --hard не только пересобирает правила, но и перезаписывает .htaccess. После любого изменения структуры полезно выполнить её и проверить пару адресов вручную.

И последнее: если у вас сеть сайтов, где структура ссылок одна на всех, настройки и правила затрагивают всю инсталляцию — детали в материале про WordPress Multisite.

TimeWeb

Частые вопросы о ЧПУ и ссылках WordPress

Что такое ЧПУ в WordPress и зачем они нужны?

ЧПУ — человекопонятный URL, собранный из слов вместо цифр и знаков вопроса: /kak-nastroit-chpu/ вместо /?p=123. Они нужны, чтобы адрес был понятен человеку и поисковику, содержал ключевое слово, легко копировался и читался в аналитике. В WordPress структура ссылок задаётся в разделе «Настройки → Постоянные ссылки».

Какую структуру постоянных ссылок выбрать для блога и магазина?

Для большинства сайтов оптимальна структура /%postname%/ («Название записи»): короткая, стабильная и с ключевым словом. Для крупных блогов иногда добавляют рубрику через %category%, но новичку лучше не усложнять. Главное — выбрать один вариант, сохранить его и не менять без 301-редиректов, иначе можно потерять позиции в поиске.

Почему после смены ЧПУ появляется 404 и как это исправить?

Чаще всего не сброшены правила перезаписи: откройте «Настройки → Постоянные ссылки» и нажмите «Сохранить изменения» — WordPress пересоберёт правила. Другие причины: .htaccess недоступен для записи, выключен mod_rewrite, конфликт плагина или устаревший кэш страницы. Проверяйте по порядку: .htaccess → mod_rewrite → сохранение настроек → плагины.

Нужно ли настраивать .htaccess вручную, если WordPress сделал это сам?

Обычно нет: при сохранении «Постоянных ссылок» WordPress сам записывает нужный блок в .htaccess, если файл доступен для записи. Вручную правила добавляют, когда файл защищён от записи или когда нужны свои редиректы. Перед правкой всегда делайте копию — сломанный .htaccess отдаёт ошибку 500 на весь сайт.

Как сделать 301-редиректы со старых ссылок на новые?

Самый быстрый способ — плагин вроде Redirection с журналом 404. Через код подойдёт правило Redirect 301 в .htaccess, правило RewriteRule для группы адресов или функция wp_redirect( home_url( ‘/new/’ ), 301 ) на хуке template_redirect. Всегда ведите список старых адресов и после переезда отправляйте новый sitemap в Яндекс и Google.

Заменяет ли ЧПУ SEO-плагин и нужен ли он вообще?

Нет, это разные вещи. ЧПУ — это структура адресов в ядре WordPress, а SEO-плагин (Rank Math или Yoast) управляет мета-тегами, sitemap, robots и микроразметкой. Они работают вместе: сначала настраивают постоянные ссылки, потом метаданные и карту сайта. Подробнее — в статье про настройку SEO-плагина для WordPress.

Вывод

ЧПУ — это фундамент, на котором держится вся навигация сайта. Правильные адреса понятны людям, дают поисковику дополнительный сигнал и упрощают аналитику. Настроить их несложно: выбрать структуру в «Постоянных ссылках», сохранить её, убедиться, что .htaccess или Nginx-правила на месте. Сложнее — менять ссылки на живом проекте: здесь без 301-редиректов и обновлённого sitemap не обойтись.

Запомните три главных правила. Первое: однажды выбрав структуру, старайтесь её не менять — стабильные адреса это актив. Второе: перед любой правкой .htaccess делайте копию, а после смены настроек жмите «Сохранить» в «Постоянных ссылках». Третье: свои правила переписывания сбрасывайте один раз через активацию темы, а не на каждом запросе.

Если вы только начинаете, не усложняйте: /%postname%/, корректный SEO-плагин Rank Math или Yoast и понятные слаги закроют 95% задач. А дальше — развитие: настройка меню и навигации, кастомные шаблоны страниц и контактные формы — всё это опирается на те же ссылки.

Мы в Делай Сайт разрабатываем сайты на WordPress под ключ: настраиваем структуру, ЧПУ, редиректы и техническое SEO так, чтобы сайт был удобен и людям, и поисковикам. Посмотрите услуги разработки и поддержки WordPress, изучите портфолио выполненных проектов и почитайте блог о разработке и продвижении. Обсудить проект и заказать сайт на WordPress под ключ можно через форму контактов — подскажем, как выстроить структуру ссылок правильно с самого старта.

Clearfy

Поделиться:
Telegram ВКонтакте