if ( !empty( $_POST ) || ( !empty( $_GET['action'] ) && $_GET['action'] == 'edit' ) || ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) ) {
add_filter( ... );
}
(.?.+?)(?:/([0-9]+))?/?$ pagename=$matches[1]&page=$matches[2]
([^/]+)(?:/([0-9]+))?/?$ name=$matches[1]&page=$matches[2]
'%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_jQuery' == '%d0%9f%d1%80%d0%b8%d0%bc%d0%b5%d1%80%d1%8b_jQuery'
false
$page_path = rawurlencode(urldecode('%d0%9f%d1%80%d0%b8%d0%bc%d0%b5%d1%80%d1%8b_jQuery'));
%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_jQuery
/**
* Make sure rawurlencoded part of the path is always lowercase.
*
* @param string $title
* @param string $raw_title
* @param string $context
*
* @return string
*/
function lowercase_rawurlencode_path( $title, $raw_title, $context ) {
if ( $context == 'query' && preg_match( "@^[a-zA-Z0-9%+-_]*$@", $title ) ) { // контекст должен быть query, а строка результат rawurlencode
$title_decoded = rawurldecode( $title ); // декодируем строку обратно
$title_parts = preg_split( "/(_|-)/", $title_decoded, -1, PREG_SPLIT_DELIM_CAPTURE ); // разбиваем на части по '_' и '-', сохраняя эти самые разделители (чтобы потом собрать обратно)
foreach( $title_parts as $index => $part ) { // перебираем полученные части
$part_encoded = rawurlencode( $part ); // кодируем часть
if ( $part !== $part_encoded ) { // если она закодировалась
$title_parts[ $index ] = strtolower( $part_encoded ); // приводим в нижний регистр
}
}
return implode( '', $title_parts ); // собираем в строку и возвращаем
}
return $title; // в остальных случаях возвращаем без изменений
}
add_filter( 'sanitize_title', 'lowercase_rawurlencode_path', 10, 3 );
if ( !empty( $_POST ) || ( !empty( $_GET['action'] ) && $_GET['action'] == 'edit' ) || ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) ) {
add_filter( 'sanitize_title', 'f_processing_title', 9 );
}
1) При вставке этого сниппета, вообще не возможно создать страницу с заглавными URL;
2) Теперь не работает вывод всех записей из категории, допустим «http://site.ru/Рубрикатор/Кулинария»;
3) Не срабатывает автоназначение URL (с Заглавными Буквами) вот здесь:
/*
Разрешаем заглавные URL.
ВНИМАНИЕ! Этот кусок кода брать из актуальной версии WordPress (файл wp-includes\formatting.php).
Код из версии WordPress 4.9.1 */
function f_processing_title($title) {
remove_filter('sanitize_title', 'sanitize_title_with_dashes');
add_filter('sanitize_title', function($title) {
/*
В оригинальном коде, произвести следующие изменения:
1. Закомментировать эту часть кода:
if (function_exists('mb_strtolower')) {
$title = mb_strtolower($title, 'UTF-8');
}
2. ...и закомментировать эту строку:
$title = strtolower($title);
3. ...и в этой строке разрешить заглавные буквы:
$title = preg_replace('/[^%a-z0-9 _-]/', '', $title);
* должно получиться вот так:
$title = preg_replace('/[^%a-zA-Z0-9 _-/]/', '', $title);
4. ...а пробелы, автоматически заменять на нижнее подчёркивание, а не на тире:
$title = preg_replace('/\s+/', '_', $title); */
$title = strip_tags($title);
// Preserve escaped octets.
$title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title);
// Remove percent signs that are not part of an octet.
$title = str_replace('%', '', $title);
// Restore octets.
$title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $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);
if ( 'save' == $context ) {
// Convert nbsp, ndash and mdash to hyphens
$title = str_replace( array( '%c2%a0', '%e2%80%93', '%e2%80%94' ), '-', $title );
// Convert nbsp, ndash and mdash HTML entities to hyphens
$title = str_replace( array( ' ', ' ', '–', '–', '—', '—' ), '-', $title );
// Convert forward slash to hyphen
$title = str_replace( '/', '-', $title );
// Strip these characters entirely
$title = str_replace( array(
// iexcl and iquest
'%c2%a1', '%c2%bf',
// angle quotes
'%c2%ab', '%c2%bb', '%e2%80%b9', '%e2%80%ba',
// curly quotes
'%e2%80%98', '%e2%80%99', '%e2%80%9c', '%e2%80%9d',
'%e2%80%9a', '%e2%80%9b', '%e2%80%9e', '%e2%80%9f',
// copy, reg, deg, hellip and trade
'%c2%a9', '%c2%ae', '%c2%b0', '%e2%80%a6', '%e2%84%a2',
// acute accents
'%c2%b4', '%cb%8a', '%cc%81', '%cd%81',
// grave accent, macron, caron
'%cc%80', '%cc%84', '%cc%8c',
), '', $title );
// Convert times to x
$title = str_replace( '%c3%97', 'x', $title );
}
$title = preg_replace('/&.+?;/', '', $title); // kill entities
$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;
});
return $title;
}
add_filter('sanitize_title', 'f_processing_title', 9);
/*
Исправление ошибки в ядре WordPress при обработке URL страниц.
Автор: Игорь Воротнёв [@HeadOnFire] */
/**
* Make sure rawurlencoded part of the path is always lowercase.
*
* @param string $title
* @param string $raw_title
* @param string $context
*
* @return string
*/
function lowercase_rawurlencode_path($title, $raw_title, $context) {
if ($context == 'query' && preg_match("@^[a-zA-Z0-9%+-_]*$@", $title)) { // контекст должен быть query, а строка результат rawurlencode
$title_decoded = rawurldecode($title); // декодируем строку обратно
$title_parts = preg_split("/(_|-)/", $title_decoded, -1, PREG_SPLIT_DELIM_CAPTURE); // разбиваем на части по '_' и '-', сохраняя эти самые разделители (чтобы потом собрать обратно)
foreach($title_parts as $index => $part) { // перебираем полученные части
$part_encoded = rawurlencode($part); // кодируем часть
if ($part !== $part_encoded) { // если она закодировалась
$title_parts[$index] = strtolower($part_encoded); // приводим в нижний регистр
}
}
return implode('', $title_parts); // собираем в строку и возвращаем
}
return $title; // в остальных случаях возвращаем без изменений
}
add_filter('sanitize_title', 'lowercase_rawurlencode_path', 10, 3);