Как заменить длинное тире с помощью str_replace?
Есть в WP заголовок записи, к примеру такой:
"Мы - самая лучшая компания"
В качестве тире при редактировании поста набран дефис кнопкой -
Во фронте WP выводит длинное тире, такое: —
Я хочу заменить на тег переноса - br
Делаю так:
<?php echo str_replace(' - ', '<br>', get_the_title()); ?> |
<?php echo str_replace(' - ', '<br>', get_the_title()); ?>
И не работает. Пробовал в str_replace указывать дефис, длинное тире, копировать тире с фронта - не работает.
P.S. Я в курсе, что можно в редактировании записи в админке вместо тире указать br, но это не подходит, т.к. заголовок используется дли alt изображений, соответственно, придется br на -
Дополнительно:
& #8211;
Уберите пробел между & #
- спасибо, помогло. Только & #8212; был код символа.
Ответы:
Вам выше уже подсказали в чем дело, но замечу, что у str_replace есть крутой аналог это preg_replace - позволяет сделать замену по регулярному выражению. Очень удобная вещь, рекомендую попробовать использовать его, если в каких-то местах пробелы могут как быть, так и не быть, в регулярке все это можно предусмотреть.
- пробовал.
Регулярки
/s+-s+/u
/s+—s+/u
/s+Ws+/u
не срабатывали. Очень странно, что последняя не работала, т.к., по идее, она должна искать не букву, окруженную пробелами.
При этом, если, например, тут тестировать регулярки, то все было ок. - denism300, иногда проблема бывает у хостера. Сделайте тестовый php файл и напишите в тех. поддержку, типа вот здесь работает, а у вас на хостинге не работает. Мол, почему?
P. S. https://phpize.online это сайт для запуска своего php кода онлайн. Бывает удобно, когда надо что-нибудь проверить.
- zkrvndm, на моем хостинге так же, если вставить строку текстом, то работали и регулярки и
<?php echo str_replace(' - ', '<br>', get_the_title()); ?>
<?php echo str_replace(' - ', '<br>', get_the_title()); ?>
а если ее выводить функцией WP
get_the_title()
то не работали. - denism300, посимввольно сравни вывод от get_the_title(), возможно юникод коды другие.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
WordPress может типографически заменять дефис на длинное тире через фильтры форматирования, например
wptexturize. Поэтому в базе и в админке у вас один символ, а на фронте выводится уже другой. Если вы делаетеstr_replace(' - ', ... get_the_title())до применения типографики или после неё не тем символом, замена не сработает.Самый надёжный вариант — обработать несколько возможных вариантов:
$title = get_the_title(); $title = str_replace([' - ', ' – ', ' — ', '–', '—'], '<br>', $title); echo wp_kses($title, ['br' => []]);
Если WordPress уже превратил символ в HTML-сущность, можно сначала декодировать:
$title = html_entity_decode(get_the_title(), ENT_QUOTES, 'UTF-8'); $title = str_replace([' - ', ' – ', ' — '], '<br>', $title);
Но для alt изображений действительно нельзя использовать
<br>. Поэтому лучше сделать две функции: одна для визуального заголовка, другая для plain text. Например:$visual_title = str_replace([' - ', ' — '], '<br>', get_the_title()); $alt_title = wp_strip_all_tags(get_the_title());
Не вставляйте
brпрямо в заголовок записи в админке, если этот заголовок используется в SEO, хлебных крошках, alt и меню. Правильнее менять только вывод в конкретном шаблоне.Если замена должна применяться только к конкретному заголовку на странице, не вешайте её глобально на фильтр
the_titleбез условий. Такой фильтр затронет меню, хлебные крошки, title в админке и SEO-плагины. Безопаснее сделать отдельный вывод в нужном шаблоне или короткую helper-функцию, которую вы вызываете только в hero/карточке.