Почему в WP не работает preg_replace или str_replace?

Ссылка скопирована
1 ответ

Стокнулся с такой проблемой. Есть поле цена, в которой значение например "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')); ?>

Ничего не помогает. Кто знает в чем проблема?

Дополнительно:

Почему в WP не работает preg_replace или str_replace?

подозреваю, что the_sub_field само делает echo и ничего не возвращает
найдите функцию, которая возвращает значение, а не выводит его

  • Именно!
    В WP вообще принято называть the_* функции, которые выводят (echo) и get_* - которые возвращают.
    Думаю, что нужна get_sub_field(). И хорошо бы не забыть вывести полученный результат.

Почему в WP не работает preg_replace или str_replace?

Проблема в том, что вы с результатом вычисления ничего не делаете.
Нужно, например, так:

<?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')); ?>

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Стас DB Ответ

В 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);

$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);

$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, '.', ' ')) . ' руб.';

$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() не работает, хотя на самом деле ему просто нечего обрабатывать.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно