Не числовое значение обнаружено в /wp-includes/functions.php на строке 68.

Вопрос или проблема

Мы недавно обновили наш общий хостинг до использования PHP 7.3 (проблема также существовала в PHP 7.2) – сайт выдает ошибку, указанную в заголовке.

Проблемная функция:

function current_time( $type, $gmt = 0 ) {
switch ( $type ) {
    case 'mysql':
        return ( $gmt ) ? gmdate( 'Y-m-d H:i:s' ) : gmdate( 'Y-m-d H:i:s', ( time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) ) );
    case 'timestamp':
        return ( $gmt ) ? time() : time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );
    default:
        return ( $gmt ) ? gmdate( $type ) : gmdate( $type, time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) );
}}

Строка 68 выглядит так:

return ( $gmt ) ? gmdate( 'Y-m-d H:i:s' ) : gmdate( 'Y-m-d H:i:s', ( time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) ) );

Файл функций не был изменен – есть идеи, что может быть причиной этого?

Существует другой вопрос, касающийся немного более сложной проблемы, чем ваша, но он содержит урок.

В общем, что я узнал, это то, что вам следует обрабатывать ваше уравнение в два или более этапа, чтобы учесть, что gmt_offset возвращается как строка:

$offset  = get_option( 'gmt_offset' );
$hours   = (int) $offset;

return ( $gmt ) ? gmdate( 'Y-m-d H:i:s' ) : gmdate( 'Y-m-d H:i:s', ( time() + ( $hours * HOUR_IN_SECONDS ) ) );

Это должно избежать ошибки, которую вы видите.

Удачи!

Ответ или решение

Ошибка "A non-numeric value encountered" в строке 68 файла functions.php обычно возникает из-за попытки выполнить математическую операцию с переменной, значение которой не является числом. В данном случае, речь идет о функции current_time, которая использует функцию get_option( 'gmt_offset' ) для определения временного смещения.

Анализ проблемы

Основная строка, вызывающая ошибку:

return ( $gmt ) ? gmdate( 'Y-m-d H:i:s' ) : gmdate( 'Y-m-d H:i:s', ( time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) ) );

Здесь get_option( 'gmt_offset' ) может вернуть значение в виде строки. Если это значение не может быть приведено к числу, произойдет ошибка. Примером может служить случай, когда база данных возвращает результат в формате, отличном от числового (например, ‘0.0’ или ‘0’, возвращаемые в качестве строки).

Решение

Для избежания данной ошибки, рекомендую преобразовать возвращаемое значение в целое число перед использованием в вычислениях. Таким образом, модифицируем код следующим образом:

$offset  = get_option( 'gmt_offset' );
$hours   = (int) $offset; // Приводим значение к целому числу

return ( $gmt ) ? gmdate( 'Y-m-d H:i:s' ) : gmdate( 'Y-m-d H:i:s', ( time() + ( $hours * HOUR_IN_SECONDS ) ) );

Описание изменений:

  1. Создание переменной для смещения: Мы сохраняем значение get_option( 'gmt_offset' ) в переменной $offset, что облегчает отладку и понимание кода.
  2. Явное преобразование типа: Приведение значения к целому числу гарантирует, что любые нежелательные символы или форматы (например, строки) не вызовут ошибку при выполнении арифметических операций.
  3. Поддержка кода: Структура кода становится более читаемой и позволяет легко видеть, какие операции выполняются.

Заключение

Эти изменения помогут избежать ошибок при выполнении математических операций с переменной, которая может содержать нечисловые значения. Следуйте этому примеру не только в данной функции, но и везде, где работаете с возвратом данных из базы данных, особенно когда ожидается, что данные могут приходить в различных форматах.

Убедитесь, что вы хорошо протестировали все изменения, чтобы гарантировать, что они не вызовут дополнительных проблем. Если ошибка продолжает возникать, рекомендуется вручную проверить значение gmt_offset в базе данных и убедиться в его корректности.

Оцените материал
Добавить комментарий

Капча загружается...