В WordPress по умолчанию происходит автоматическое изменение URL, особенно при создании новых записей, страниц или категорий. Иногда это поведение вызывает проблемы — например, когда вам нужно сохранить точные URL без добавления дефисов, цифр или исправления регистра. В этой статье подробно разберём, как отключить автоматическую нормализацию URL в WordPress, чтобы иметь полный контроль над адресами страниц.
Почему WordPress автоматически меняет URL и какие проблемы это создаёт
Когда вы создаёте новую запись или таксономию, WordPress формирует чпу (slug) на основе заголовка. Это делается для удобства SEO и пользователя — URL становится читаемым и понятным. Однако иногда WordPress может изменить URL в нежелательном для вас формате:
- заменять пробелы на дефисы;
- удалять заглавные буквы и заменять их на строчные;
- добавлять к URL цифры, если такой slug уже есть;
- удалять специальные символы или заменять их на дефисы.
Это бывает неудобно, если, например, вы хотите сохранить регистрационную чувствительность или использовать нестандартные символы в URL. Также автоматическая нумерация может запутать структуру сайта и SEO.
Как отключить автоматическое изменение URL с помощью фильтров WordPress
Чтобы контролировать формирование URL, можно использовать фильтры WordPress, которые позволяют вмешаться в процесс генерации slug.
Фильтр sanitize_title — основа изменения slug
Функция sanitize_title отвечает за очистку и форматирование заголовка для использования в URL. Мы можем переопределить её поведение, добавив свой фильтр, чтобы сохранить точный текст.
Пример функции для отключения нормализации (с сохранением регистра и специальных символов):
function wptour_preserve_slug($title, $raw_title, $context) {
// Возвращаем исходный заголовок без изменений
return $raw_title;
}
add_filter('sanitize_title', 'wptour_preserve_slug', 10, 3);Добавьте этот код в файл functions.php вашей темы или в плагин для кастомных функций. Теперь WordPress будет использовать исходный заголовок как slug без изменений.
Обработка конфликтов slug — отключаем добавление цифр
По умолчанию, если slug уже существует, WordPress добавляет к нему число. Чтобы отключить это поведение, нужно переопределить функцию, которая отвечает за проверку уникальности slug — wp_unique_post_slug.
Пример решения с помощью фильтра:
function wptour_disable_slug_increment($slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug) {
global $wpdb;
// Проверяем, существует ли slug в базе
$exists = $wpdb->get_var($wpdb->prepare(
"SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND ID != %d LIMIT 1",
$slug, $post_ID
));
if ($exists) {
// Возвращаем оригинальный slug без добавления цифр
return $original_slug;
}
return $slug;
}
add_filter('wp_unique_post_slug', 'wptour_disable_slug_increment', 10, 6);Этот фильтр проверяет, существует ли slug, и при обнаружении конфликта не добавляет суффикс с цифрой, а возвращает исходный slug. Будьте осторожны — это может привести к конфликтам URL, если не контролировать уникальность вручную.
Использование плагинов для управления URL и slug
Если вы не хотите самостоятельно править код, можно использовать плагины, которые дают расширенный контроль над URL:
- WP Permalink Manager — позволяет редактировать и отключать автоматическую генерацию URL для записей и таксономий.
- Permalink Editor — расширяет возможности редактирования slug прямо в админке.
- Clearfy Pro — содержит опции для оптимизации URL и отключения некоторых автоматических функций WordPress, включая нормализацию slug.
Эти плагины можно найти и установить через официальный каталог WordPress или скачать с wpshop.ru.
Практические рекомендации по работе с URL в WordPress
1. Планируйте структуру URL заранее
Чтобы избежать конфликтов и необходимости ручной корректировки slug, составьте структуру URL и придерживайтесь её. Используйте в заголовках страницы и записей слова, подходящие для URL.
2. Контролируйте уникальность slug
При отключении автоматического добавления суффиксов нужно обязательно следить за уникальностью URL. В противном случае возможны ошибки и конфликтные страницы.
3. Используйте фильтры только при необходимости
Отключать автоматическую нормализацию стоит лишь если у вас есть чёткое понимание, зачем это нужно. В большинстве случаев стандартное поведение WordPress оптимально.
Пример комплексного решения в functions.php для wptour.ru
function wptour_sanitize_title_preserve($title, $raw_title, $context) {
// Оставляем slug как есть, без преобразований
return $raw_title;
}
add_filter('sanitize_title', 'wptour_sanitize_title_preserve', 10, 3);
function wptour_disable_slug_numbering($slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug) {
global $wpdb;
$exists = $wpdb->get_var($wpdb->prepare(
"SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND ID != %d LIMIT 1",
$slug, $post_ID
));
if ($exists) {
return $original_slug; // Возвращаем исходный slug без цифр
}
return $slug;
}
add_filter('wp_unique_post_slug', 'wptour_disable_slug_numbering', 10, 6);Добавьте этот код в тему, чтобы отключить автоматическую правку и нумерацию URL. Это позволит создавать более точные и предсказуемые адреса страниц.