Как сделать permalinks с заглавными буквами (верхний регистр)?

8 дек. 2010 г., 08:27:09
Просмотры: 17.6K
Голосов: 8

Как можно создать ссылку такого вида?

http://www.lifecellskin.us/Dev/About

Часть "Using_Permalinks" содержит заглавные буквы. Но WordPress автоматически преобразует их в строчные.

Я пытаюсь перенести старый сайт, сделанный на чистом HTML, на платформу WordPress. Некоторые ссылки на сайт выглядят так:

http://www.lifecellskin.us/About

Сайт уже проиндексирован поисковыми системами, и я не хочу потерять текущие позиции в SEO.

Спасибо за внимание к моему вопросу, надеюсь, кто-то сможет помочь с решением...

0
Все ответы на вопрос 6
7

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;
}
8 дек. 2010 г. 10:01:44
Комментарии

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

Horttcore Horttcore
8 дек. 2010 г. 10:20:05

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

Denis de Bernardy Denis de Bernardy
8 дек. 2010 г. 11:23:19

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

Jan Fabry Jan Fabry
8 дек. 2010 г. 14:51:45

А, теперь мне понятно :-)

Horttcore Horttcore
8 дек. 2010 г. 16:12:58

Круто! +1 за умный префикс.

kaiser kaiser
28 мар. 2011 г. 17:06:50

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

Mario Torres Mario Torres
14 февр. 2021 г. 20:36:27

@MarioTorres не публикуйте ответы в качестве решений, я преобразовал это в комментарий, но не уверен, был ли это тот ответ, на который вы отвечали. Если у вас новый вопрос, вам следует использовать кнопку "Задать вопрос" вверху

Tom J Nowell Tom J Nowell
14 февр. 2021 г. 21:18:35
Показать остальные 2 комментариев
0

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

Я написал другой ответ, который очень похож на вашу ситуацию, и в этом примере показано, как использовать хук 'template_redirect' для настройки редиректов проблемных URL:

Если вам нужно больше пояснений, пожалуйста, спрашивайте.

8 дек. 2010 г. 10:54:10
0

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

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

8 дек. 2010 г. 09:15:14
0

Февраль 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 ) {
        // Преобразуем &nbsp, &ndash и &mdash в дефисы.
        $title = str_replace( array( '%c2%a0', '%e2%80%93', '%e2%80%94' ), '-', $title );
        // Преобразуем HTML-сущности &nbsp, &ndash и &mdash в дефисы.
        $title = str_replace( array( ' ', ' ', '–', '–', '—', '—' ), '-', $title );
        // Преобразуем слеш в дефис.
        $title = str_replace( '/', '-', $title );

        // Полностью удаляем следующие символы.
        $title = str_replace(
            array(
                // Мягкие переносы.
                '%c2%ad',
                // &iexcl и &iquest.
                '%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',
                // &copy, &reg, &deg, &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
        );

        // Преобразуем &times в '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 в нижнем регистре, но сохранит его именно так, как вы отправили, без изменения регистра.

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

2 февр. 2021 г. 18:04:58
0

Я делаю это напрямую в таблице MySQL, и это отлично работает: Вставка изображения

23 июл. 2020 г. 00:48:18
0

Вы можете попробовать это. Вставьте приведенный ниже код в файл 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);
30 апр. 2024 г. 04:08:34