Отображение ошибок PHP из admin-ajax.php

26 мар. 2018 г., 13:19:55
Просмотры: 23.2K
Голосов: 7

У нас настроены собственные конечные точки, которые выполняют различные действия и доступны через /wp/wp-admin/admin-ajax.php?action=some_action

Однако всякий раз, когда возникает ошибка во время разработки, будь то синтаксическая, логическая, фатальная и т.д., мы просто получаем "500 Internal Server Error"

На всех остальных страницах сайта при возникновении ошибки отображается PHP ошибка.

Нам приходится открывать файл PHP Log, чтобы увидеть ошибку.

Есть ли что-то в WordPress, что отключает отображение ошибок на этих URL? И если да, как можно это предотвратить, чтобы разрешить отображение ошибок в браузере?

5
Комментарии

Если посмотреть ответ во вкладке "Network" инструментов разработчика браузера, вы увидите ошибку.

Jacob Peattie Jacob Peattie
26 мар. 2018 г. 13:46:48

В этом и вся проблема - мы просто получаем ответ "500 internal server error" - независимо от того, как мы к этому пришли, даже если загрузить URL напрямую в браузере

owenmelbz owenmelbz
26 мар. 2018 г. 15:09:35

Пожалуйста, прочитайте это https://wordpress.stackexchange.com/questions/96554/does-the-functions-php-file-ever-get-called-during-an-ajax-call-debug-ajax

bueltge bueltge
26 мар. 2018 г. 16:30:39

@bueltge Извините, я прочитал, но не понимаю, что здесь актуально? Я нигде не вижу обсуждения, почему сообщения об ошибках не отображаются?

owenmelbz owenmelbz
26 мар. 2018 г. 17:21:26

Ошибки из ajax-запросов никогда не отображаются в браузере напрямую. Если включено сообщение об ошибках, вы можете увидеть их в консоли сети. Ссылка Bueltge помогает отладить таким образом.

Luckyfella Luckyfella
15 дек. 2018 г. 01:50:03
Все ответы на вопрос 3
5

WordPress по умолчанию скрывает ошибки для AJAX-запросов. Это можно подтвердить из исходного файла wp-includes/load.php#L352, здесь:

if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) || wp_doing_ajax() ) {
    @ini_set( 'display_errors', 0 );
}

Видно, что функция wp_doing_ajax() используется в условном выражении, поэтому display_errors отключается.

Чтобы обойти это, необходимо вручную включить отчет об ошибках в начале вашего AJAX-вызова функции, как предложил @Friss.

4 июл. 2018 г. 16:46:31
Комментарии

СПАСИБО!!! Я понимаю, что изменять ядро — это плохо, но в локальной среде, только для целей отладки, когда AJAX вызывается плагином, в который вы не хотите вникать или у вас нет времени разбираться — временное комментирование указанной выше строки в /wp-includes/load.php позволит выводить более конкретные сообщения об ошибках и поможет определить источник проблемы.

squarecandy squarecandy
25 сент. 2019 г. 22:58:07

В начале файла load.php есть фильтр, который позволяет обойти это: add_filter( 'enable_wp_debug_mode_checks', '__return_false' );

CragMonkey CragMonkey
25 апр. 2020 г. 21:48:13

@Cragmonkey Пожалуйста, объясните, как можно использовать этот хук в своем AJAX-запросе.

Rahil Wazir Rahil Wazir
10 мая 2020 г. 04:58:56

@Rahil Wazir ... Вы можете временно создать этот хук в другом месте вашего плагина во время отладки.

CragMonkey CragMonkey
12 мая 2020 г. 01:36:32

Для wp v6.5 это строка 617

Fabrice Fabiyi Fabrice Fabiyi
5 февр. 2025 г. 11:57:06
2

Вы можете попробовать добавить эти две строки в самое начало вашего файла скрипта

error_reporting(E_ALL); 
ini_set("display_errors", 1);

Это указывает PHP сообщать обо всех видах ошибок и переопределяет настройки по умолчанию для их отображения.

27 мар. 2018 г. 00:38:14
Комментарии

Привет, это действительно включает отчет об ошибках - однако мы пытаемся выяснить, ПОЧЕМУ он отключается для admin-ajax.php, так как если мы устанавливаем его внизу wp-config, например, он где-то перезаписывается для ajax-запросов

owenmelbz owenmelbz
27 мар. 2018 г. 11:47:21

сработало, спасибо, друг

Sharifur Robin Sharifur Robin
2 апр. 2024 г. 20:29:01
2
-1

Вы можете попробовать использовать WP_Ajax_Response

$response = array(
   'what'=>'stuff',
   'action'=>'delete_something',
   'id'=>new WP_Error('oops','Упс, произошла ошибка.'),
   'data'=>'Ой, возникла проблема!'
);
$xmlResponse = new WP_Ajax_Response($response);
$xmlResponse->send();

Подробнее https://codex.wordpress.org/Function_Reference/WP_Ajax_Response

26 мар. 2018 г. 13:29:41
Комментарии

Извините, но это не то, о чем мы просим - наша проблема в том, что ошибки php не отображаются, когда нам это необходимо

owenmelbz owenmelbz
26 мар. 2018 г. 15:10:31

что если будут sql или любые другие ошибки?

amilaishere amilaishere
3 февр. 2021 г. 13:05:39