Как убрать #038; при замене строк в заголовке

30 окт. 2011 г., 21:16:29
Просмотры: 13.8K
Голосов: 3

Я пытаюсь добавить замену строк в функцию 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-код амперсанда). Не понимаю, почему это происходит (может быть, причина в безопасности?) и как это обойти. Пробовал заменять "&" на "&amp;" - безрезультатно.

Цель - добавить переносы строк в определённых местах заголовка для улучшения типографики. И база данных, и сайт используют кодировку UTF8.

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

&#38; по сути является синонимом &amp;. В фильтре the_title функция wptexturize() выполняется с приоритетом 1 (это важно!) и делает эту замену.

Таким образом, к моменту выполнения вашей функции format_title() с приоритетом 11 — вместо замены одиночного символа & вы заменяете (и ломаете) часть сущности &#38;.

Вы можете:

  1. переместить вашу функцию на приоритет 0, и она выполнится до texturize
  2. оставить приоритет 11, но заменять $#38; вместо просто &
30 окт. 2011 г. 21:50:14
0

Это также может быть вызвано функцией esc_url. В данном сценарии следует использовать esc_url_raw вместо неё.

Функция esc_url содержит следующий участок кода:

// Заменяем амперсанды и одинарные кавычки только при отображении.
if ( $_context === 'display' ) {
    $url = wp_kses_normalize_entities( $url );
    $url = str_replace( '&amp;', '&#038;', $url ); <!-- Обратите внимание на эту строку!
    $url = str_replace( "'", '&#039;', $url );
}

Функция esc_url_raw просто вызывает esc_url, пропуская это условие, передавая другой контекст в качестве аргумента.

18 окт. 2022 г. 22:25:44
1
-2

Вот ещё одно решение:-

wp-includes\formatting.php >> esc_url ()  >> закомментируйте строку <br> $url = str_replace( '&amp;', '&#038;', $url ); 

Это сработало у меня.

8 окт. 2013 г. 13:07:56
Комментарии

Никогда не редактируйте ядро, даже если это работает! Ваши изменения могут не сохраниться при следующем обновлении!

Pothi Kalimuthu Pothi Kalimuthu
8 окт. 2013 г. 14:03:57