Вопрос или проблема
Мы недавно обновили наш общий хостинг до использования 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 ) ) );
Описание изменений:
- Создание переменной для смещения: Мы сохраняем значение
get_option( 'gmt_offset' )
в переменной$offset
, что облегчает отладку и понимание кода. - Явное преобразование типа: Приведение значения к целому числу гарантирует, что любые нежелательные символы или форматы (например, строки) не вызовут ошибку при выполнении арифметических операций.
- Поддержка кода: Структура кода становится более читаемой и позволяет легко видеть, какие операции выполняются.
Заключение
Эти изменения помогут избежать ошибок при выполнении математических операций с переменной, которая может содержать нечисловые значения. Следуйте этому примеру не только в данной функции, но и везде, где работаете с возвратом данных из базы данных, особенно когда ожидается, что данные могут приходить в различных форматах.
Убедитесь, что вы хорошо протестировали все изменения, чтобы гарантировать, что они не вызовут дополнительных проблем. Если ошибка продолжает возникать, рекомендуется вручную проверить значение gmt_offset
в базе данных и убедиться в его корректности.