Почему в WP не работает preg_replace или str_replace?
Стокнулся с такой проблемой. Есть поле цена, в которой значение например "1 000". Мне нужно чтобы вывело без пробелов (1000).
Пробовал:
<?php preg_replace('/s+/', '', the_sub_field('price')); ?> <?php preg_replace('/[^0-9]+/', '', the_sub_field('price')); ?> <?php str_replace(' ', '', the_sub_field('price')); ?> |
<?php preg_replace('/s+/', '', the_sub_field('price')); ?> <?php preg_replace('/[^0-9]+/', '', the_sub_field('price')); ?> <?php str_replace(' ', '', the_sub_field('price')); ?>
Ничего не помогает. Кто знает в чем проблема?
Дополнительно:
подозреваю, что the_sub_field само делает echo и ничего не возвращает
найдите функцию, которая возвращает значение, а не выводит его
- Именно!
В WP вообще принято называть the_* функции, которые выводят (echo) и get_* - которые возвращают.
Думаю, что нужна get_sub_field(). И хорошо бы не забыть вывести полученный результат.
Проблема в том, что вы с результатом вычисления ничего не делаете.
Нужно, например, так:
<?php echo preg_replace('/s+/', '', the_sub_field('price')); ?> |
<?php echo preg_replace('/s+/', '', the_sub_field('price')); ?>
- не, это в WP. Там цикл в котором выводятся значения. Ну, echo тут не нужен (перепроверил лишний раз)
- Что-то должно делаться всё равно. Функция возвращает значение, вы с этим значением должны что-то сделать - вывести на экран, сохранить в переменную и т.п. Сейчас вы его просто игнорируете, поэтому вам и кажется, что "не работает preg_replace".
- Алексей Уколов, только что попробовал - без изменений
- Пробуйте что-то другое, значит.
Иного ответа вы не получите - результат выполнения функции вам нужно использовать, а не выполнять её вхолостую.
Ну или код покажите весь, мы вам подскажем, как сделать правильно. - Там просто в HTML шаблоне цикл WHILE и внутри него:
<div><?php echo preg_replace('/s+/', '', the_sub_field('price')); ?></div>
<div><?php echo preg_replace('/s+/', '', the_sub_field('price')); ?></div>
- Значение то выводит но без форматирования
- IvanU7n совершенно прав:
<?php echo preg_replace('/s+/', '', get_sub_field('price')); ?>
<?php echo preg_replace('/s+/', '', get_sub_field('price')); ?>
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос


В WordPress функции с префиксом
the_обычно сразу выводят значение черезechoи ничего полезного не возвращают. Поэтому выражениеstr_replace(' ', '', the_sub_field('price'))не работает:the_sub_field()уже вывела цену на экран, а вstr_replace()попало не то значение.Нужно брать значение через
get_sub_field(), обработать его и потом вывести:$price = get_sub_field('price'); $price_clean = preg_replace('/[^0-9]/', '', (string) $price); echo esc_html($price_clean);
Если в цене может быть не обычный пробел, а неразрывный
или unicode-пробел, регулярка выше надёжнее, потому что она оставит только цифры. Для десятичных значений можно разрешить точку и запятую:$value = preg_replace('/[^0-9,.]/', '', (string) get_sub_field('price')); $value = str_replace(',', '.', $value);
Если нужно использовать цену в расчётах, храните в ACF поле типа Number без пробелов и валюты. А форматирование «1 000 руб.» делайте только при выводе:
$price = (float) get_sub_field('price'); echo esc_html(number_format($price, 0, '.', ' ')) . ' руб.';
Так вы не будете каждый раз чистить строку и избежите ошибок, когда редактор случайно вставит пробел, символ рубля или HTML-сущность.
Отдельно проверьте, где именно находится поле: обычное ACF-поле, repeater или flexible content. Внутри repeater используется
get_sub_field(), а вне repeater —get_field(). Если перепутать функции, можно получить пустую строку и думать, чтоpreg_replace()не работает, хотя на самом деле ему просто нечего обрабатывать.