Как сделать permalinks с заглавными буквами (верхний регистр)?
Как можно создать ссылку такого вида?
http://www.lifecellskin.us/Dev/About
Часть "Using_Permalinks" содержит заглавные буквы. Но WordPress автоматически преобразует их в строчные.
Я пытаюсь перенести старый сайт, сделанный на чистом HTML, на платформу WordPress. Некоторые ссылки на сайт выглядят так:
http://www.lifecellskin.us/About
Сайт уже проиндексирован поисковыми системами, и я не хочу потерять текущие позиции в SEO.
Спасибо за внимание к моему вопросу, надеюсь, кто-то сможет помочь с решением...

URL-адреса страниц определяются по слагам (slug), и по умолчанию они форматируются и приводятся к нижнему регистру с помощью функции sanitize_title_with_dashes()
. Однако эта функция вызывается через фильтр, и вы можете отключить этот фильтр, чтобы она не выполнялась:
remove_filter( 'sanitize_title', 'sanitize_title_with_dashes' );
Просто сделать это, вероятно, не лучшая идея, так как это не удалит пробелы и другие странные символы в слаге. Я предлагаю вам скопировать существующую функцию, удалить часть, которая приводит к нижнему регистру, и снова подключить её:
add_filter( 'sanitize_title', 'wpse5029_sanitize_title_with_dashes' );
function wpse5029_sanitize_title_with_dashes($title) {
$title = strip_tags($title);
// Сохраняем экранированные октеты.
$title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title);
// Удаляем знаки процента, которые не являются частью октета.
$title = str_replace('%', '', $title);
// Восстанавливаем октеты.
$title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title);
$title = remove_accents($title);
if (seems_utf8($title)) {
//if (function_exists('mb_strtolower')) {
// $title = mb_strtolower($title, 'UTF-8');
//}
$title = utf8_uri_encode($title, 200);
}
//$title = strtolower($title);
$title = preg_replace('/&.+?;/', '', $title); // удаляем HTML-сущности
$title = str_replace('.', '-', $title);
// Оставляем символы в верхнем регистре!
$title = preg_replace('/[^%a-zA-Z0-9 _-]/', '', $title);
$title = preg_replace('/\s+/', '-', $title);
$title = preg_replace('|-+|', '-', $title);
$title = trim($title, '-');
return $title;
}

Просто глупый вопрос: почему вы добавляете префикс wpse{любоечисло} к своим функциям?

@Horttcore: wpse5029 — это как WP Stack Exchange вопрос №5029?

@Horttcore: Именно так, я добавляю номер вопроса в качестве префикса ко всем именам функций. Чтобы тестировать их как отдельные плагины, и на случай если кто-то скопирует их в свой код без изменений: wpseNNNN
скорее всего будет уникальным.

Спасибо за информацию. Я пытаюсь заставить Wordpress учитывать регистр букв в имени пользователя, но у меня не получается.

Я настоятельно рекомендую придерживаться строчных URL-адресов, которые использует WordPress (я считаю, что строчные URL — это лучшая практика в любом случае), но при этом настроить 301 редиректы для всех URL, где у вас возникает эта проблема. Обычно попытки заставить платформу работать вопреки её архитектуре приводят к сложностям, а структура URL глубоко встроена в архитектуру WordPress.
Я написал другой ответ, который очень похож на вашу ситуацию, и в этом примере показано, как использовать хук 'template_redirect'
для настройки редиректов проблемных URL:
Если вам нужно больше пояснений, пожалуйста, спрашивайте.

Насколько мне известно, поисковые системы не учитывают регистр символов, хотя URL-адреса чувствительны к регистру. Я бы рекомендовал отказаться от использования заглавных букв в формате файлов, так как пользователям это сложно запомнить.
Если вы действительно хотите сохранить предыдущую структуру, вам придется работать с регулярными выражениями (regexp) в файле .htaccess.

Февраль 2020
С момента ответа Яна Фабри, функция WordPress немного изменилась, поэтому правильный сниппет для версии 5.6 выглядит так:
add_filter( 'sanitize_title', 'wpse5029_sanitize_title_with_dashes', 10, 3 );
function wpse5029_sanitize_title_with_dashes($title, $raw_title, $context = 'display') {
$title = strip_tags( $raw_title );
// Сохраняем экранированные октеты.
$title = preg_replace( '|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title );
// Удаляем знаки процента, не являющиеся частью октета.
$title = str_replace( '%', '', $title );
// Восстанавливаем октеты.
$title = preg_replace( '|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title );
if ( seems_utf8( $title ) ) {
$title = utf8_uri_encode( utf8_encode($title), 200 );
}
if ( 'save' === $context ) {
// Преобразуем  , &ndash и &mdash в дефисы.
$title = str_replace( array( '%c2%a0', '%e2%80%93', '%e2%80%94' ), '-', $title );
// Преобразуем HTML-сущности  , &ndash и &mdash в дефисы.
$title = str_replace( array( ' ', ' ', '–', '–', '—', '—' ), '-', $title );
// Преобразуем слеш в дефис.
$title = str_replace( '/', '-', $title );
// Полностью удаляем следующие символы.
$title = str_replace(
array(
// Мягкие переносы.
'%c2%ad',
// ¡ и ¿.
'%c2%a1',
'%c2%bf',
// Угловые кавычки.
'%c2%ab',
'%c2%bb',
'%e2%80%b9',
'%e2%80%ba',
// Фигурные кавычки.
'%e2%80%98',
'%e2%80%99',
'%e2%80%9c',
'%e2%80%9d',
'%e2%80%9a',
'%e2%80%9b',
'%e2%80%9e',
'%e2%80%9f',
// Маркер списка.
'%e2%80%a2',
// ©, ®, °, &hellip и &trade.
'%c2%a9',
'%c2%ae',
'%c2%b0',
'%e2%80%a6',
'%e2%84%a2',
// Острое ударение.
'%c2%b4',
'%cb%8a',
'%cc%81',
'%cd%81',
// Гравис, макрон, гачек.
'%cc%80',
'%cc%84',
'%cc%8c',
),
'',
$title
);
// Преобразуем × в 'x'.
$title = str_replace( '%c3%97', 'x', $title );
}
// Удаляем HTML-сущности.
$title = preg_replace( '/&.+?;/', '', $title );
$title = str_replace( '.', '-', $title );
$title = preg_replace( '/[^%a-zA-Z0-9 _-]/', '', $title );
$title = preg_replace( '/\s+/', '-', $title );
$title = preg_replace( '|-+|', '-', $title );
$title = trim( $title, '-' );
return $title;
}
Редактор будет по-прежнему показывать URL в нижнем регистре, но сохранит его именно так, как вы отправили, без изменения регистра.
Примечание: возможно, не стоит использовать такую функцию, поскольку стандартный нижний регистр более удобен.

Вы можете попробовать это. Вставьте приведенный ниже код в файл function.php вашей темы. У меня это работает.
// Удаляем существующий фильтр
remove_filter( 'sanitize_title', 'sanitize_title_with_dashes' );
// Функция для сохранения заглавных букв в ЧПУ (человеко-понятных URL)
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);
