Как убрать #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
, пропуская это условие, передавая другой контекст в качестве аргумента.
