Вопрос или проблема
Мой сайт выдает несколько ошибок, связанных с уведомлениями и устареванием, которые я хотел бы исправить. Например:
Получена ошибка ‘PHP message: PHP Deprecated: add_option был вызван с аргументом, который устарел с версии 2.3.0 без доступной альтернативы. в /home/public_html/wp-includes/functions.php на строке 5067
Строка кода, на которую указывает ошибка, не является причиной ошибки, это код отладки WordPress, который перехватывает ошибку. Как мне найти действительную строку, вызывающую ошибку?
Причина, по которой сообщение об ошибке ссылается на строку в основном файле WordPress, а не на тему или плагин, заключается в том, что ошибка возникает внутри функции, а не в том месте, где вызывается add_option()
.
Если вы хотите проследить код, чтобы узнать исходный файл, вы можете использовать расширение, такое как xdebug, которое позволит вам сгенерировать трассировку стека, например эту:
Из этого мы можем увидеть, что проблемный плагин называется example.php
, и функция, вызывающая add_option
некорректно, называется some_buggy_function()
.
Что касается устранения самой ошибки, предыдущие версии WordPress использовали третий аргумент для add_option
, который теперь устарел. Удаление этого аргумента или установка его на пустую строку ''
удалит предупреждение.
Вы можете просто выполнить поиск с помощью RegEx в вашем редакторе для add_option\(.+,.+,.+\);
и проверить результаты вручную. Не должно быть слишком много. В качестве альтернативы вы можете запустить $ grep -r 'add_option\(.+,.+,.+\);' .
из вашей командной строки
Для справки в будущем и если кому-то интересно легкий способ сделать это:
Указанная строка в functions.php должна привести вас к этой функции:
function wp_trigger_error( $function_name, $message, $error_level = E_USER_NOTICE ) {
// Выйти, если WP_DEBUG не включен.
if ( ! WP_DEBUG ) {
return;
}
/**
* Запускается, когда данная функция вызывает пользовательское предупреждение/уведомление/сообщение об устаревании.
*
* Может быть использована для отладки.
*
* @since 6.4.0
*
* @param string $function_name Имя функции, которая была вызвана.
* @param string $message Сообщение, объясняющее, что было сделано неправильно.
* @param int $error_level Назначенный тип ошибки для этой ошибки.
*/
do_action( 'wp_trigger_error_run', $function_name, $message, $error_level );
if ( ! empty( $function_name ) ) {
$message = sprintf( '%s(): %s', $function_name, $message );
}
$message = wp_kses(
$message,
array(
'a' => array( 'href' => true ),
'br' => array(),
'code' => array(),
'em' => array(),
'strong' => array(),
),
array( 'http', 'https' )
);
if ( E_USER_ERROR === $error_level ) {
throw new WP_Exception( $message );
}
}
Добавьте эту строку
debug_backtrace();
прямо в конце функции, и она выведет трассировку сразу после сообщения об ошибке.
Если вы хотите, чтобы это было хотя бы немного “красивее”, не добавляйте debug_backtrace();
, вместо этого добавьте это:
//сохранение трассировки в строку
$backtrace = (new Exception)->getTraceAsString();
//чтобы сделать вывод немного более читаемым, я добавил некоторую форматирование и разрывы строк
echo '<p style="margin:5px; font-family: monospace; font-size: 12px; color:#777;">';
echo str_replace('#','</br>#',$backtrace);
echo '</p>';
(Не могу использовать буфер вывода, потому что мы уже находимся в буфере.)
Я надеюсь, что это кому-то поможет!
Хорошего дня и удачи в поисках.
.
Ответ или решение
Чтобы разобраться с проблемой “депрекейшен” уведомлений в WordPress и определить строку кода, вызывающую эти уведомления, необходимо следовать плану действий, который позволяет выявить исходную причину. Такой подход включает использование инструментов для отладки и анализа кода.
Теория
Депрекейшен уведомления в WordPress чаще всего возникают из-за использования функций или аргументов, которые устарели в текущей версии WordPress. Это может вызвать негативные последствия для функциональности вашего сайта, поскольку будущие версии WordPress могут полностью убрать такие возможности.
Когда вы видите сообщение об ошибке наподобие «PHP Deprecated», это указывает на использование функции, которая больше не рекомендуется. В упомянутом вами случае, сообщение указывает на add_option
, вызываемую с устаревшими аргументами. Важно определить, какая часть вашего кода или плагина вызывает это.
Пример
Предположим, вы получили сообщение об ошибке, которое указывает на /wp-includes/functions.php
на определенной строке. Это может указывать на некорректный вызов add_option()
в другом месте вашего кода, что и приводит к этому уведомлению.
Вы можете использовать расширение Xdebug для генерации стек-трейсов, что поможет визуализировать, откуда вызывается проблемный код. Стек-трейс позволит определить, из какого файла или функции был вызов add_option
, что поможет вам найди искомую строку.
Применение
-
Установка и настройка Xdebug:
- Установите Xdebug на ваш сервер или локальную среду разработки.
- Включите Xdebug в php.ini, добавив строку:
zend_extension="xdebug.so"
. - Перезапустите сервер, чтобы изменения вступили в силу.
-
Просмотр стек-трейса:
- Настройте Xdebug для записи стек-трейсов в лог.
- При возникновении ошибки используйте сгенерированный стек-трейс, чтобы проследить все функции и файлы, которые вызвают ошибку.
-
Использование RegEx или grep:
- Дополнительно, вы можете использовать поиск по коду, чтобы отслеживать устаревшие функции.
- Выполните регулярное выражение поиска в вашем редакторе для строки
add_option\(.+,.+,.+\);
и проверьте результаты.
-
Изменение wp_trigger_error:
- Откройте файл
functions.php
и найдите функциюwp_trigger_error
. - Добавьте дебаг функцию в конец
debug_backtrace()
, чтобы получать развернутый стек вызова, отображающий, откуда был вызван код.
- Откройте файл
-
Экономия и форматирование трэйсов:
- Чтобы трэйс выглядел более читабельно, используйте
getTraceAsString()
. - Пример: сохраните его в строку, добавив простое форматирование для улучшенного отображения.
- Чтобы трэйс выглядел более читабельно, используйте
-
Рефактринг кода:
- После того как вы нашли место, где вызывается устаревшая функция, внесите необходимые изменения. В случае
add_option
— удалите третий аргумент или установите его как пустую строку.
- После того как вы нашли место, где вызывается устаревшая функция, внесите необходимые изменения. В случае
Таким образом, стратегическое использование инструментов и методов отладки позволит вам диагностировать и исправить точную строку кода, вызывающую депрекейшен уведомления. Это способствует повышению стабильности и безопасности вашего WordPress сайта. Инвестиции в изучение и использование таких инструментов приведут к значительному снижению рисков, связанных с устаревшими функциями в будущем.