Как исправить ошибку при незаполненном цифровом поле ACF?
Всем привет!
Подскажите пожалуйста, как исправить ошибку при незаполненном цифровом поле ACF?
Проблема вот в чем:
Если созданное поле не заполнено, то вылазит ошибка:
Warning
: number_format() expects parameter 1 to be float, string given in
.../wp-content/themes/theme/single-cards.php
on line
26
Если поле заполнено, то проблемы не наблюдаются.
Подробнее:
в ACF создал поле цифровое, и вывожу следующим образом:
$ch = get_field('vsego_ch'); //строка 25 $formatted_ch= number_format($ch, 0, '', ' '); //строка 26 |
$ch = get_field('vsego_ch'); //строка 25 $formatted_ch= number_format($ch, 0, '', ' '); //строка 26
Вывожу при условии:
"Если поле заполнено, то выводим" для этого использую такую конструкцию:
<?php if ($formatted_uchastnikov) : ?> <li class="класс блока"> <div class="класс__img"> <div class="класс-icon"> <i class="fa fa-users" aria-hidden="true"></i> </div> </div> <h2 class="класс__title">Такое то кол-во</h2> <p class="класс__subtitle"></p> <p class="класс для числового значения"> <?php echo $formatted_ch; ?> </p> </li> <?php endif; ?> |
<?php if ($formatted_uchastnikov) : ?> <li class="класс блока"> <div class="класс__img"> <div class="класс-icon"> <i class="fa fa-users" aria-hidden="true"></i> </div> </div> <h2 class="класс__title">Такое то кол-во</h2> <p class="класс__subtitle"></p> <p class="класс для числового значения"> <?php echo $formatted_ch; ?> </p> </li> <?php endif; ?>
На сколько я понял, php не хочет воспринимать пустое значение как норму.
По задумке, какое то время после создания карточки (в которой выводится это числовое значение), действительно должно быть скрытым и пустым.
Числовое значение будет вноситься спустя какое то время.
Подскажите пожалуйста, как вылечить такую ошибку?
Спасибо.
Дополнительно:
Вывожу при условии:
"Если поле заполнено, то выводим"
Покажите мне это условие, где вы проверяете заполненность поля ch?
<?php if ($ch) : ?> <li class="класс блока"> <div class="класс__img"> <div class="класс-icon"> <i class="fa fa-users" aria-hidden="true"></i> </div> </div> <h2 class="класс__title">Такое то кол-во</h2> <p class="класс__subtitle"></p> <p class="класс для числового значения"> <?php echo $formatted_ch; ?> </p> </li> <?php endif; ?> |
<?php if ($ch) : ?> <li class="класс блока"> <div class="класс__img"> <div class="класс-icon"> <i class="fa fa-users" aria-hidden="true"></i> </div> </div> <h2 class="класс__title">Такое то кол-во</h2> <p class="класс__subtitle"></p> <p class="класс для числового значения"> <?php echo $formatted_ch; ?> </p> </li> <?php endif; ?>
Для начала нужно проверять поле прежде чем его форматировать
Как-то так
$ch = get_field('vsego_ch'); if (!empty($ch)) { $formatted_ch= number_format($ch, 0, '', ' '); } else{ $formatted_ch=0; } |
$ch = get_field('vsego_ch'); if (!empty($ch)) { $formatted_ch= number_format($ch, 0, '', ' '); } else{ $formatted_ch=0; }
Далее вместо непонятно откуда взявшейся $formatted_uchastniko нужно проверять $formatted_ch
- Вы не упустили восклицательный знак?
- maksam07, спасибо за замечание, исправил.
- Спасибо!!!
- Refguser, чтобы не плодить многокод в шаблоне лучше задать default value в настройках поля если оно предусмотрено
- pLavrenov, вместо того, чтобы боятся 2х "лишних" строк кода лучше подумать над целесообразностью запросов к базе.
А данный код ещё больше нужно "расплодить" и сделать проверку на содержимое (цифры). - Refguser, ты предлагаешь автору делать тройную и беспонтовую работу на пустом месте. Хотя я назвал бы это - "плодить говнокод в шаблоне"
1) Для того чтобы поле было исключительно числовым указывается его тип "Число", все првреки сделаны за нас и давно до нас.
2) Если читкануть как acf (или вообще WP) получает и кэширует данные тогда станет понятно что никакое дефолтное значение не добавит дополнительных запросов в базу, как и то что на момент формирования view все данные уже получены и кэшированы. - pLavrenov, ты можешь ничего не проверять и боятся "лишнего" кода. С опытом это проходит.
Но меня в этом убеждать не стоит.
Ответы:
<?php if ($_ = get_field('vsego_ch')) { ?> <div><?php echo number_format($ch, 0, '', ' ') ?></div> <?php } ?> |
<?php if ($_ = get_field('vsego_ch')) { ?> <div><?php echo number_format($ch, 0, '', ' ') ?></div> <?php } ?>
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Ошибка
number_format() expects parameter 1 to be float, string givenозначает, что вnumber_format()попадает не число, а пустая строка или другое текстовое значение из ACF. Для числового поля это типичная ситуация: поле не заполнено, ACF возвращает'', а PHP ждёт число.Нужно проверять значение перед форматированием:
$price = get_field('price'); if ($price !== '' && $price !== null) { echo number_format((float) $price, 0, '.', ' '); }
Если значение может быть
0, нельзя проверять простоif ($price), потому что ноль будет считаться пустым. Лучше использовать строгую проверку на пустую строку иnull.Если поле необязательное и при отсутствии нужно выводить “по запросу”:
$price = get_field('price'); if ($price === '' || $price === null) { echo 'По запросу'; } else { echo number_format((float) $price, 0, '.', ' ') . ' ₽'; }
Если нужно просто ничего не выводить:
$value = get_field('number_field'); if (is_numeric($value)) { echo esc_html(number_format((float) $value, 0, '.', ' ')); }
Также проверьте настройки ACF: тип поля должен быть “Number”, а не “Text”. Но даже поле Number при пустом значении может вернуть пустую строку, поэтому проверка в шаблоне всё равно нужна.
Если таких полей много, сделайте helper-функцию:
function theme_format_number_field($value, $fallback = '') { if ($value === '' || $value === null || !is_numeric($value)) { return $fallback; } return number_format((float) $value, 0, '.', ' '); }
И используйте:
echo esc_html(theme_format_number_field(get_field('price'), 'По запросу'));
Итог: проблема не в ACF, а в отсутствии проверки перед
number_format(). Всегда учитывайте пустое значение, ноль и текстовый мусор, особенно если поле редактируется вручную.