Отображение ошибок PHP из admin-ajax.php
У нас настроены собственные конечные точки, которые выполняют различные действия и доступны через /wp/wp-admin/admin-ajax.php?action=some_action
Однако всякий раз, когда возникает ошибка во время разработки, будь то синтаксическая, логическая, фатальная и т.д., мы просто получаем "500 Internal Server Error"
На всех остальных страницах сайта при возникновении ошибки отображается PHP ошибка.
Нам приходится открывать файл PHP Log, чтобы увидеть ошибку.
Есть ли что-то в WordPress, что отключает отображение ошибок на этих URL? И если да, как можно это предотвратить, чтобы разрешить отображение ошибок в браузере?
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.

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

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

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

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

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

Вы можете попробовать использовать 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
