Вопрос или проблема
Мы переносим сайт на WordPress с другой платформы. возникла проблема с URL-адресами — некоторые заглавные, некоторые строчные. Я разрешил заглавные буквы, используя это решение: Как сделать постоянные ссылки с заглавными буквами?
Однако я столкнулся с некоторыми проблемами, как указано ниже:
-
Некоторые родительские страницы должны быть заглавными, в то время как некоторые — строчными: site.com/page/other-page против site.com/Page/another-page
-
WordPress не позволяет дублировать слаги страниц, даже если они заглавные или строчные (так как WP предполагает, что все слаги и URL-адреса будут строчными). Разумеется, браузеры и Google, в отличие от WordPress, рассматривают их как отдельные URL-адреса, что приводит к ошибкам 404, если вы ошибаетесь в написании заглавных букв в URL или нажимаете на ссылку с другим написанием.
-
Возможным решением было бы сделать некоторые страницы записями и использовать категорию в качестве “родительской страницы”. Это оказалось непрактичным, так как постоянные ссылки записей должны быть category/%page_id%-%postname%, чтобы соответствовать требованиям Google News и соответствовать старому сайту. Следовательно, все слаги записей должны быть category/%page_id%-%postname%, что не соответствует старому сайту на тех страницах, где требуется сценарий с заглавными и строчными буквами — они просто должны быть /parent-page/%postname%
-
Я предпочел бы не делать 301 редиректы для каждой страницы — это слишком много. Я также предпочел бы, чтобы URL оставались максимально схожими со старым сайтом. Создание целого пользовательского типа записи только для этой ситуации кажется ненужным. Возможно ли переопределить добавление WordPress «-2» к дублирующимся слагам, или же сделать 301 редирект на строчную версию слага родительской страницы только на тех страницах, которые мне нужны? Я не могу использовать плагин Redirection, так как он конфликтует с другими плагинами, которые мы должны использовать на сайте. Есть ли какие-нибудь другие предложения?
Вы можете попробовать это. Вставьте следующий код в файл functions.php вашей темы. Это работает для меня.
// Удалить существующий фильтр
remove_filter( 'sanitize_title', 'sanitize_title_with_dashes' );
// Функция для сохранения заглавных букв в слагах
function maintain_capitalization_slug($title, $raw_title, $context) {
// Применять только при сохранении слагов
if ($context === 'save') {
// Сохранять заглавные буквы и заменять специальные символы на дефисы
$title = preg_replace('/[^a-zA-Z0-9]+/', '-', $raw_title); // Заменить неалфавитные символы на дефисы
$title = trim($title, '-'); // Удалить ведущие/замыкающие дефисы
}
return $title;
}
// Применить пользовательскую функцию к 'sanitize_title'
add_filter('sanitize_title', 'maintain_capitalization_slug', 10, 3);
Ответ или решение
Конечно! Ниже приведен полный ответ на ваш вопрос о верхнем и нижнем регистре в URL-адресах (слуг):
Когда вы мигрируете сайт на WordPress и сталкиваетесь с проблемами, связанными с URL-адресами, это может быть довольно сложно, особенно когда на старом сайте используются как заглавные, так и строчные буквы в слугах. Давайте рассмотрим, как можно решить ваши проблемы:
- Обработка заглавных и строчных букв в слугах: Как вы уже заметили, WordPress по умолчанию преобразует все слуги в строчный регистр. В вашей ситуации, когда некоторые страницы должны быть заглавными, а некоторые – строчными, будет разумно использовать кастомную функцию для сохранения регистра. Вы можете вставить следующий код в файл
functions.php
вашей темы:
// Удаляем существующий фильтр
remove_filter('sanitize_title', 'sanitize_title_with_dashes');
// Функция для сохранения регистра слуга
function maintain_capitalization_slug($title, $raw_title, $context) {
// Применяем только при сохранении слуг
if ($context === 'save') {
// Сохраняем регистр и заменяем специальные символы дефисами
$title = preg_replace('/[^a-zA-Z0-9]+/', '-', $raw_title); // Заменяем неалфавитные символы на дефисы
$title = trim($title, '-'); // Убираем ведущие и конечные дефисы
}
return $title;
}
// Применяем кастомную функцию к 'sanitize_title'
add_filter('sanitize_title', 'maintain_capitalization_slug', 10, 3);
Этот код позволит вам сохранять регистр в слугах, что решит вашу первую проблему.
- Проблема с дубликатами слуг: Вы правы в том, что WordPress не позволяет создавать дубликаты слуг, даже если они различаются по регистру. Для решения этой проблемы вы можете рассмотреть возможность использования плагина для управления перенаправлениями, хотя вы упомянули, что плагин Redirection конфликтует с другими плагинами на вашем сайте.
Можно попробовать использовать код для создания 301 перенаправлений непосредственно в файле functions.php
. Например:
add_action('template_redirect', function() {
if (is_page('Page') && !is_user_logged_in()) {
wp_redirect(home_url('/page/other-page'), 301);
exit;
}
});
Замените 'Page'
и URL на нужные вам значения. Это перенаправит запросы, где если заглавные буквы были ошибкой, он будет корректно перенаправлять на строчные буквы.
-
Использование пользовательского типа постов или категорий: Если возможно, иногда выгодно использовать пользовательские типы постов для тех страниц, где нужно сохранить формат URL. Однако учитывая ваши ограничения, предлагаю оставить ваш текущий подход и внести необходимые изменения через редиректы.
-
Поддержка существующих URL: Если вы хотите сохранить старые URL как можно ближе к старым именам, и не хотите 301 редирект для каждой страницы, настройка фильтров, как показано выше, может помочь вам сохранить логику без создания лишних редиректов.
Поскольку вы мигрируете с другой платформы, важно также учитывать, что обеспечение плавного перехода для пользователей и SEO должно быть в приоритете, в то время как технические аспекты настройки вашего сайта являются существенными.
Если у вас остались вопросы или вам нужно больше помощи, не стесняйтесь задать их. Удачи в миграции сайта!
Я надеюсь, этот ответ поможет вам решить все ваши проблемы с URL-адресами при переносе сайта на WordPress.