Отображение ошибок PHP из admin-ajax.php в Wordpress 4.9+
У нас есть настроенные конечные точки, которые выполняют различные действия, к которым мы получаем доступ через /wp/wp-admin/admin-ajax.php?action=some_action
Однако всякий раз, когда в процессе разработки возникает ошибка, такая как синтаксис, логика, фатальная ошибка и т. Д., Мы просто получаем "500 Internal Server Error" при просмотре страницы в браузере.
Каждая другая страница на сайте, когда есть ошибка, дает нам ошибку PHP, чтобы помочь нам отладить.
Однако, когда ошибка исходит от admin-ajax.php
область, мы должны затем открыть наш файл журнала PHP, чтобы увидеть ошибку вместо этого - что больше боли при активной разработке
Есть ли что-то в WordPress, что отключает отображение ошибок в этом пространстве имен URL? и если да, то как мы можем предотвратить это, чтобы сделать возможным отображение ошибок в браузере?
5 ответов
Если вы хотите увидеть ошибки PHP при использовании ajax, откройте файл wp-includes/load.php и в строке 336 измените эту строку:
if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) || wp_doing_ajax() ) {
@ini_set( 'display_errors', 0 );
}
в
if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) || wp_doing_ajax() ) {
@ini_set( 'display_errors', 1 );
}
Теперь вы сможете увидеть ошибки ajax в консоли браузера. Не забудьте отменить это, когда закончите отладку!
Лучшее решение
Включите вывод ошибок PHP до появления ошибки
Добавьте это, чтобы включить вывод ошибок PHP
@ini_set( 'display_errors', 1 );
Например: в этом случае в начале функции обратного вызова ajax
Кончик:
Вы можете использовать вкладку Preview рядом с вкладкой Response в Dev Tools Network, чтобы отобразить HTML в выходных данных Error. Чтобы вы могли увидеть ошибку без HTML
Объяснение
Я не знаю, почему WordPress не позволяет включить этот вывод ошибок, но я не думаю, что редактирование файла ядра WordPress и их отмена после отладки не является хорошей идеей, как указано здесь.
Из этого ответа я обнаружил, что нам просто нужно установить для параметра PHP init значение
Так почему бы нам просто не установить это там, где мы хотим, чтобы это работало, чтобы это
Нет проблем, если вы не отменили это, в отличие от другого ответа
Редактировать
wp-includes/class-wp-fatal-error-handler.php
и измените это в
display_default_error_template( $error, $handled )
:
$message = sprintf(
'<p>%s</p><p><a href="%s">%s</a></p>',
$message,
/* translators: Documentation explaining debugging in WordPress. */
__( 'https://wordpress.org/support/article/debugging-in-wordpress/' ),
__( 'Learn more about debugging in WordPress.' )
);
к
$message = sprintf(
'<p>%s</p><p><a href="%s">%s</a></p>',
$message . ' ' . json_encode($error),
/* translators: Documentation explaining debugging in WordPress. */
__( 'https://wordpress.org/support/article/debugging-in-wordpress/' ),
__( 'Learn more about debugging in WordPress.' )
);
Затем просмотрите HTML-ответ на
admin-ajax.php
с помощью Dev Tools.
https://codex.wordpress.org/Debugging_in_WordPress
// Enable WP_DEBUG mode
define( 'WP_DEBUG', true );
// Enable Debug logging to the /wp-content/debug.log file
define( 'WP_DEBUG_LOG', true );
// Disable display of errors and warnings
define( 'WP_DEBUG_DISPLAY', false );
Определите следующие константы как таковые. Вы сможете увидеть debug.log
под wp-content
, Я обычно тоже отключаю отображение отладки, потому что это вызывает проблему с уже отправленными заголовками.
РЕДАКТИРОВАТЬ:
Таким образом, по-видимому, отчеты об ошибках отключены для запросов AJAX в последней строке метода wp_debug_mode()
в wp-includes/load.php
if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) || wp_doing_ajax() ) {
@ini_set( 'display_errors', 0 );
}
Чтобы включить режим отладки также для вызовов ajax, вы можете отредактировать, добавив следующие строки перед строкой/* That's all, stop editing! Happy publishing. */
:
$GLOBALS['wp_filter'] = array(
'enable_wp_debug_mode_checks' => array(
10 => array(
array(
'accepted_args' => 0,
'function' => function() {
return false;
},
),
),
),
);
Это не позволит WordPress вмешиваться в отчеты об ошибках. (См. комментарии к функцииwp_debug_mode
вwp-includes/load.php
.) Документы
Теперь у вас есть настройки PHP по умолчанию для режима отладки. Чтобы самостоятельно управлять настройками, добавьте следующие строки в свойwp-config.php
файл:
error_reporting( E_ALL );
ini_set( 'display_errors', 1 );
ini_set( 'log_errors', 1 );
ini_set( 'error_log', ABSPATH . "wp-content/debug.log" );
Поздравляю! Вы успешно обошли WordPress и теперь полностью контролируете это сами.