Язык PHP широко распространен во многих веб-приложениях, например, в WordPress. При всей своей мощности у PHP есть некоторые недостатки, но одна из моих любимых особенностей PHP – это то, что он отображает ошибки прямо на странице. Новая панель инструментов, которая появилась в WordPress 3.3, конфликтует этим функционалом. У этой панели – абсолютное позиционирование, при котором первые несколько строк ошибок PHP закрываются.
Варианты отображения ошибок
С новой панелью инструментов, закрывающей ошибки PHP, нам нужно использовать другие возможности для отладки наших тем и плагинов. К счастью, у нас есть несколько вариантов для выбора.
Плагины
После появления новой панели инструментов разработчики плагинов представили несколько вариантов, которые могут помочь нам с этим вопросом. Вот несколько плагинов, которые можно использовать, чтобы отключить панель инструментов.
- Old Skool Admin Head
- Hide Toolbar Plugin
- Clean Admin Bar Removal
- WordPress Admin Bar Improved
У всех этих плагинов – разные возможности, но все они позволяют отключить панель инструментов. Это позволит нам видеть все ошибки PHP, которые возникнут. Что хорошо в этих плагинах – их можно включить и выключить, когда нам необходимо.
Журнал ошибок
Решение для ошибок PHP, предложенное разработчиками WordPress – использование журнала ошибок. Если вы занимаетесь разработкой на WordPress, вы уже знаете о константе WP_DEBUG, которая определена в файле wp-config.php. Вы также можете определить константу WP_DEBUG_LOG. Вот пример, который предоставляет WordPress Codex для включения журналирования при отладке.
define('WP_DEBUG', true); // false if (WP_DEBUG) { define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false); @ini_set('display_errors',0); }
Этот код будет выводить ошибки PHP в файл под названием debug.log в папке wp-content. Такое записывание ошибок имеет свои плюсы и минусы. При работе над коммерческим плагином в команде журналирование ошибок необходимо.
Это лучшее решение для отслеживания своих ошибок, но при разработке плагина или темы меньшего масштаба, это просто непрактично. Когда вам нужно лишь проверить окончательно мелочи, может быть немного неудобно постоянно открывать, закрывать и снова открывать файл ошибок каждый раз при внесении изменений.
Отображение ошибок как уведомлений администратора
Метод, который я выбрал для себя - это выводить ошибки PHP как уведомления администратора. Мне кажется, в данный момент это лучшее решение. Не требует плагинов, удобнее, чем журнал ошибок, и это можно сделать без ущерба для структуры и дизайна Консоли или вашей темы WordPress.
Используемый для этого код — прост, и я все не могу понять, почему он не был встроен как часть ядра WordPress. Приведенный ниже код нужно вставить в ваш файл functions.php или в ваш функциональный плагин.
function admin_alert_errors($errno, $errstr, $errfile, $errline){ $errorType = array ( E_ERROR => 'ERROR', E_CORE_ERROR => 'CORE ERROR', E_COMPILE_ERROR => 'COMPILE ERROR', E_USER_ERROR => 'USER ERROR', E_RECOVERABLE_ERROR => 'RECOVERABLE ERROR', E_WARNING => 'WARNING', E_CORE_WARNING => 'CORE WARNING', E_COMPILE_WARNING => 'COMPILE WARNING', E_USER_WARNING => 'USER WARNING', E_NOTICE => 'NOTICE', E_USER_NOTICE => 'USER NOTICE', E_DEPRECATED => 'DEPRECATED', E_USER_DEPRECATED => 'USER_DEPRECATED', E_PARSE => 'PARSING ERROR' ); if (array_key_exists($errno, $errorType)) { $errname = $errorType[$errno]; } else { $errname = 'UNKNOWN ERROR'; } ob_start();?> <div class="error"> <p> <strong><?php echo $errname; ?> Error: [<?php echo $errno; ?>] </strong><?php echo $errstr; ?><strong> <?php echo $errfile; ?></strong> on line <strong><?php echo $errline; ?></strong> <p/> </div> <?php echo ob_get_clean(); } set_error_handler("admin_alert_errors", E_ERROR ^ E_CORE_ERROR ^ E_COMPILE_ERROR ^ E_USER_ERROR ^ E_RECOVERABLE_ERROR ^ E_WARNING ^ E_CORE_WARNING ^ E_COMPILE_WARNING ^ E_USER_WARNING ^ E_NOTICE ^ E_USER_NOTICE ^ E_DEPRECATED ^ E_USER_DEPRECATED ^ E_PARSE );
В функцию admin_alert_errors() передаются четыре аргумента:
- $errno: выдает уровень, которого достигла ошибка. Каждому типу ошибки соответствует число. $errno показывает это число;
- $errstr : выдает сообщение об ошибке;
- $errfile : выдает имя файла, в котором содержится ошибка;
- $errline : выдает строку, в которой содержится ошибка.
Массив $errorType определяет название, которое используется для каждого типа ошибки.
Например:
WARNING Error: [2] include(wuzup) [function.include]:
Это название может быть каким угодно, на ваше усмотрение. Вы можете сказать “Эй, ты что-то напутал”.
Например:
WARNING Эй, ты что-то напутал: [2] include(wuzup) [function.include]:
Я не рекомендую использовать это для чего-то, что вы делаете для клиентов. Разве что у них действительно хорошее чувство юмора. Но вы поняли, к чему я.
Условие IF проверяет, совпадает ли тип ошибки с какой-то из констант, определенных вами в массиве $errorType. Если нет, название ошибки будет показано как "UNKNOWN ERROR".
Последняя часть функции — то, что мы выводим. Класс error – стандартный класс, встроенный в WordPress, который используется как стиль для сообщений администратору об ошибках.
Чтобы инициализировать функцию admin_alert_errors(), вы будете использовать функцию set_error_handler(). Первый параметр – функция, которая использовалась для вывода ошибок. В данном случае, это функция admin_alert_errors(). Следующий набор параметров – это стандартные ошибки PHP, которые вы хотите показывать.
Если у вас есть опыт работы с ошибками, вы заметите, что E_STRICT в этом списке нет. Это из-за того, что есть некоторые ошибки, которые выдаются самим ядром WordPress. Я не знаю, это какое-то упущение разработчиков ядра WordPress, или так было нужно, но в любом случае, видеть эти ошибки не обязательно. Также, использование E_ALL вместо списка всех стандартных ошибок, похоже, не работает. Если вы будете использовать E_ALL, не все ошибки будут отображаться как уведомления администратору.
Обратите внимание: это не влияет на то, как ошибки будут отображаться в клиентской части вашего сайта. Только на страницах администратора.
Также обратите внимание: когда у меня была установлена тестовая версия WordPress, я получил DEPRECATED ошибку для файла class-simplepie.php.
Я надеюсь, это руководство поможет вам с этими досадными ошибками PHP. Если у кого-то есть другие решения, будем рады увидеть их в комментариях.
Комментарии к записи: 0