Если CyrtoLat уже используется на сайте, рано или поздно появляется типичная проблема: плагин слишком агрессивно приводит адреса к латинице, а вам нужно сохранить часть URL как есть — например, служебные сегменты, брендовые названия, уже проиндексированные адреса или вручную заданные слаги. В итоге новые записи получают не тот slug, который ожидался, а старые URL начинают конфликтовать с правилами автоподмены.
Ниже разберём рабочий сценарий: как отключить автоподмену слов внутри slug для отдельных случаев, как проверить, что настройка сработала, и какие ошибки чаще всего ломают результат.
Когда это действительно нужно
Такую настройку обычно ищут не из любопытства, а после конкретного сбоя. Например:
- в slug попадает транслитерация служебных слов, которые лучше оставить без изменений;
- нужно сохранить уже существующие URL после миграции, чтобы не плодить редиректы;
- часть адресов формируется вручную редакторами, и автоматическая подмена мешает;
- внутри slug есть бренд, аббревиатура или технический маркер, который не должен меняться;
- плагин меняет не только кириллицу, но и отдельные слова, которые вы хотите обрабатывать по своим правилам.
Если задача именно в том, чтобы отключить редиректы и автоподмену кириллицы в латиницу для отдельных URL, это уже отдельный сценарий. Здесь речь о более тонкой настройке: не трогать конкретные слова внутри slug, а не выключать весь механизм целиком.
Диагностика проблемы
Сначала нужно понять, где именно CyrtoLat вмешивается в адрес. Ошибка часто не в самом плагине, а в том, что WordPress пересоздаёт slug при сохранении записи, а пользователь видит только итоговый результат.
Что проверить в первую очередь
- как выглядит slug сразу после ручного редактирования записи;
- меняется ли он после повторного сохранения;
- есть ли у записи старый URL и настроен ли редирект;
- не конфликтует ли CyrtoLat с другим SEO-плагином или плагином для транслитерации;
- не включена ли в настройках плагина глобальная замена для всех типов контента.
Полезно сравнить исходный и итоговый slug прямо в админке. Если после сохранения WordPress возвращает не тот адрес, который вы ввели, значит проблема в фильтре формирования слага или в обработчике CyrtoLat.
Быстрая проверка в базе и в админке
Если есть доступ к базе, посмотрите значение post_name у нужной записи. Это поможет понять, плагин ли изменил slug или он уже был сохранён в таком виде.
SELECT ID, post_title, post_name, post_type, post_status
FROM wp_posts
WHERE ID = 123;Если в базе slug уже изменён, значит нужно править логику до сохранения. Если в базе всё правильно, а на фронте URL всё равно другой, тогда смотрите редиректы, каноникал и правила перезаписи.
Как отключить автоподмену слов внутри slug
У CyrtoLat логика может зависеть от версии и набора настроек, поэтому безопаснее идти от простого к точечному. Сначала проверьте, нет ли в интерфейсе плагина режима, где можно исключить отдельные слова или шаблоны из транслитерации. Если такой опции нет, используйте фильтр WordPress на этапе формирования slug.
Ниже пример, который позволяет сохранить отдельные слова в исходном виде. Он не выдумывает API CyrtoLat и работает на уровне стандартного фильтра WordPress.
add_filter('wp_unique_post_slug', function ($slug, $post_id, $post_status, $post_type, $post_parent, $original_slug) {
$preserve = array('api', 'seo', 'ru', 'vk', 'youtube');
foreach ($preserve as $word) {
if (strpos($original_slug, $word) !== false) {
return $original_slug;
}
}
return $slug;
}, 10, 6);Этот пример грубый, но показывает принцип: если в исходном slug есть слово из списка, вы возвращаете оригинальное значение и не даёте плагину или WordPress его переписать. На практике лучше проверять не подстроку, а конкретные токены, чтобы не получить ложные совпадения.
Более аккуратный вариант для отдельных типов записей
Если автоподмену нужно отключить только для страниц или только для одного custom post type, ограничьте фильтр по $post_type.
add_filter('wp_unique_post_slug', function ($slug, $post_id, $post_status, $post_type, $post_parent, $original_slug) {
if ($post_type !== 'page') {
return $slug;
}
$preserve_words = array('contacts', 'about', 'faq');
foreach ($preserve_words as $word) {
if (preg_match('~(^|-)'.preg_quote($word, '~').'(-|$)~', $original_slug)) {
return $original_slug;
}
}
return $slug;
}, 10, 6);Здесь мы не ломаем весь сайт, а работаем только с нужным типом контента. Это особенно важно, если CyrtoLat используется на проекте, где часть URL уже проиндексирована и менять их нельзя.
Если нужно сохранить старые URL, а не только новые
Отключение автоподмены для новых записей не решает проблему старых адресов. Если slug уже поменялся, нужно либо вернуть его вручную, либо поставить редирект со старого URL на новый. Иначе получите 404, потерю ссылочного веса и путаницу в индексации.
Для точечной правки старого адреса сначала проверьте, не создаёт ли CyrtoLat собственный редирект. Если да, отключайте его только для конкретных URL, а не глобально. Если редиректов нет, используйте стандартный механизм WordPress или серверные правила.
Пример ручного сохранения старого slug
Если нужно вернуть конкретной записи прежний адрес, проще всего сделать это через редактирование записи и сохранение нужного post_name. Для массовой правки можно использовать скрипт через wp shell или временный mu-plugin.
add_action('init', function () {
if (!is_admin()) {
return;
}
$post_id = 123;
$new_slug = 'brand-api-guide';
wp_update_post(array(
'ID' => $post_id,
'post_name' => $new_slug,
));
});Такой код нельзя держать постоянно. Его используют как разовую миграцию, после чего удаляют. Иначе на каждом запросе в админке вы будете перезаписывать slug заново.
Сравнение подходов
| Подход | Когда подходит | Минус |
|---|---|---|
| Настройка в интерфейсе CyrtoLat | Если плагин уже умеет исключать слова или шаблоны | Зависит от версии и набора опций |
Фильтр wp_unique_post_slug | Если нужно точечно управлять slug на уровне WordPress | Нужен код и тестирование |
| Ручная правка + редирект | Если меняется только несколько URL | Не решает массовую проблему |
На практике чаще всего выигрывает второй вариант: он предсказуемый, не зависит от скрытой логики плагина и позволяет ограничить изменение конкретными типами записей или шаблонами.
Как проверить, что решение сработало
Проверка должна быть не только визуальной. После внедрения сделайте три шага.
- Создайте тестовую запись с кириллицей и словом из списка исключений.
- Сохраните её дважды и убедитесь, что slug не меняется после повторного сохранения.
- Откройте URL в браузере и проверьте, нет ли 301/302 на другой адрес.
Если есть доступ к консоли, можно быстро проверить ответ сервера:
curl -I https://example.com/test-slug/В идеале вы должны видеть 200 OK для нужного адреса и отсутствие лишней цепочки редиректов. Если вместо этого идёт перенаправление на другой slug, значит где-то ещё осталась активная автоподмена или редирект.
Частые ошибки и как их исправить
Фильтр написан слишком широко
Если вы возвращаете оригинальный slug для всех записей без проверки типа контента, можно случайно отключить нужную транслитерацию на всём сайте. Исправление простое: ограничьте код по post_type и списку слов.
Путают slug и permalink
Slug — это часть адреса записи, а permalink — итоговый URL целиком. Иногда пользователь меняет slug, но получает другой URL из-за структуры постоянных ссылок. Проверьте Настройки → Постоянные ссылки и убедитесь, что проблема не там.
Редирект остаётся активным после правки
Даже если slug уже правильный, старый редирект может продолжать вести на новый адрес. В таком случае нужно найти источник редиректа: CyrtoLat, SEO-плагин, серверный конфиг или кэширующий слой.
Кэш показывает старую версию URL
После изменения slug очистите кэш страницы, объектный кэш и CDN, если он есть. Иначе вы будете проверять не реальный результат, а старую копию страницы.
Практические советы по безопасности и производительности
Если вы вносите код через functions.php, помните: при обновлении темы он может исчезнуть. Для точечных правок лучше использовать небольшой mu-plugin или отдельный мини-плагин. Это надёжнее и проще сопровождать.
Ещё один момент: не храните в коде огромные списки исключений, если их можно вынести в опцию или конфиг. Чем меньше логики на каждом запросе, тем ниже риск случайно замедлить админку при массовом сохранении записей.
Если на сайте уже используется набор плагинов для SEO и очистки дублей, полезно проверить, не создают ли они конфликтов. В некоторых проектах удобнее держать транслитерацию и чистку дублей в одном месте, например через Clearfy Pro, но только если это реально упрощает поддержку и не дублирует логику CyrtoLat. Ссылку на продукт имеет смысл смотреть только в контексте общей оптимизации: https://wpshop.ru/plugins/clearfy.
Короткий чек-лист перед выкладкой на прод
- проверили, какие именно слова нужно исключить из автоподмены;
- ограничили код нужным типом записей;
- сохранили тестовую запись дважды и сравнили slug;
- проверили ответ сервера на старый и новый URL;
- очистили кэш сайта и CDN;
- убрали временный код после миграции, если он был разовым.
Если задача сводится не к общему отключению, а к точечной настройке поведения CyrtoLat для отдельных URL, лучше сразу идти через фильтры WordPress и явные исключения. Это даёт предсказуемый результат и не ломает уже работающие адреса.