Как исправить ошибку при незаполненном цифровом поле ACF?

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

Всем привет!
Подскажите пожалуйста, как исправить ошибку при незаполненном цифровом поле 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; ?>

  • boul, хорошо, а где выполняется код number_format ? Наверное ВНЕ этого условия?
  • Для начала нужно проверять поле прежде чем его форматировать
    Как-то так

    $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 } ?>

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

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

    Заказать помощь
    Лучший ответ
    1
    Редакция по БД Ответ

    Ошибка 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, '.', ' ');
    }

    $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, '.', ' ') . ' ₽';
    }

    $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, '.', ' '));
    }

    $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, '.', ' ');
    }

    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'), 'По запросу'));

    echo esc_html(theme_format_number_field(get_field('price'), 'По запросу'));

    Итог: проблема не в ACF, а в отсутствии проверки перед number_format(). Всегда учитывайте пустое значение, ноль и текстовый мусор, особенно если поле редактируется вручную.

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

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

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

    комментарий

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

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