Как убрать #038; при замене строк в заголовке
Я пытаюсь добавить замену строк в функцию the_title():
function format_title($content) {
// Заменяем амперсанд на амперсанд с переносом строки
$content = str_replace('&','&<br>', $content);
// Заменяем восклицательный знак на восклицательный знак с переносом строки
$content = str_replace('!','!<br>', $content);
return $content;
}
add_filter('the_title','format_title',11);
При попытке заменить амперсанды появляется дополнительный "#038;" после замены (это ASCII-код амперсанда). Не понимаю, почему это происходит (может быть, причина в безопасности?) и как это обойти. Пробовал заменять "&" на "&" - безрезультатно.
Цель - добавить переносы строк в определённых местах заголовка для улучшения типографики. И база данных, и сайт используют кодировку UTF8.
& по сути является синонимом &. В фильтре the_title функция wptexturize() выполняется с приоритетом 1 (это важно!) и делает эту замену.
Таким образом, к моменту выполнения вашей функции format_title() с приоритетом 11 — вместо замены одиночного символа & вы заменяете (и ломаете) часть сущности &.
Вы можете:
- переместить вашу функцию на приоритет
0, и она выполнится до texturize - оставить приоритет
11, но заменять$#38;вместо просто&
Это также может быть вызвано функцией esc_url. В данном сценарии следует использовать esc_url_raw вместо неё.
Функция esc_url содержит следующий участок кода:
// Заменяем амперсанды и одинарные кавычки только при отображении.
if ( $_context === 'display' ) {
$url = wp_kses_normalize_entities( $url );
$url = str_replace( '&', '&', $url ); <!-- Обратите внимание на эту строку!
$url = str_replace( "'", ''', $url );
}
Функция esc_url_raw просто вызывает esc_url, пропуская это условие, передавая другой контекст в качестве аргумента.