Что может вызвать возврат JSON и HTML при POST-запросе к wp-admin/async-upload.php?
При загрузке корректного изображения во вкладке медиафайлов отображается "HTTP error".
При перезагрузке вкладки медиафайлов видно, что изображение загрузилось и изменило размер.
Инструменты отладки браузера показывают, что при загрузке браузер делает POST-запрос к wp-admin/async-upload.php. Сервер отвечает ошибкой 500. Однако тело ответа вызывает подозрения. Первая часть представляет собой JSON-структуру. Сразу за JSON-структурой следует HTML-документ с заголовком "WordPress Error", но с пустым телом.
В лог ошибок веб-сервера (apache) ничего не записывается, а режим отладки WordPress и повышенная детализация ошибок/предупреждений PHP не помогли. Отключение всех плагинов не повлияло на ошибку. Также пробовал переключаться между GD и ImageMagick без успеха.
Используемые версии программного обеспечения:
- WordPress 4.2.2
- PHP 5.5.12-2ubuntu4.4
- Ubuntu Utopic
Есть ли идеи, что может заставить async-upload.php возвращать одновременно JSON и HTML-документ с ошибкой, и/или как можно дальше отлаживать эту проблему?

У меня была такая же проблема, и в отладочном выводе я не нашел никакой информации.
Оказалось, что DOING_AJAX
не был определен (не знаю, почему).
Изменение начала файла async-upload.php
с
if ( isset( $_REQUEST['action'] ) && 'upload-attachment' === $_REQUEST['action'] ) {
define( 'DOING_AJAX', true );
}
на
define( 'DOING_AJAX', true );
сработало для меня. Возможно, я позже разберусь глубже и найду настоящую причину проблемы.

Скорее всего, это не проблема самого WordPress, а связано с настройками сервера. Ошибки 500 довольно общие и могут иметь различные причины, поэтому трудно дать одно универсальное решение. Кстати, возврат JSON и HTML в таких случаях — распространённое явление, хотя не совсем ясно, где именно происходит смешивание, возможно, здесь. Я почти уверен, что это связано с проблемами памяти.
Хотя проблема, вероятно, связана с памятью, я не могу быть на 100% уверен, так как недостаточно информации для точного определения. Поэтому вот небольшой, не исчерпывающий, список действий для проверки:
- Лимит памяти — возможно, вашему PHP не хватает памяти, увеличьте его; добавьте
define( 'WP_MEMORY_LIMIT', '128MB' );
в файлwp-config.php
- .htaccess — повреждение/ошибка; проверьте его; возможно, сделайте резервную копию и пересоздайте
- PHP5 — у некоторых хостингов были проблемы с этим, хотя я давно не сталкивался; попробуйте добавить
AddType x-mapp-php5 .php
в ваш.htaccess
- Права доступа к файлам — убедитесь, что они установлены правильно; если не уверены, сбросьте их на корректные; статья в Codex: изменение прав доступа к файлам
- Права доступа к папкам —
- WordPress — проверьте и при необходимости исправьте; статья в Codex: изменение прав доступа к файлам
- Сервер — иногда возникают проблемы, например, с правами временной папки для загрузок
- Перезагрузка основных файлов WordPress — хотя это не должно быть необходимо, если предыдущие шаги выполнены правильно, но иногда встречаются другие повреждения, так что это может быть дополнительным шагом
- Настройка Apache — убедитесь, что Apache настроен корректно под ваши требования; частой причиной может быть модуль
mod_security
- Проверьте кастомный код WordPress — то, что вы написали или установили через плагины; стандартная процедура: тестируйте, отключая плагины и/или переключаясь на стандартную тему
Все пункты списка хорошо известны и задокументированы, поэтому при необходимости вы найдёте дополнительную информацию.
И последнее, но не менее важное — удачи!

В файле wp-config.php (в корневой папке WordPress) необходимо включить режим отладки.
Нужно установить параметр wp_debug в значение true.
Измените строку define('WP_DEBUG', false); на define('WP_DEBUG', true);
Сохраните файл и обновите страницу в браузере (рекомендую использовать комбинацию ctrl+f5).
После этого вы увидите все ошибки.

Я рекомендую проверить журнал ошибок веб-сервера, прежде чем копаться наугад.
В моем случае я обнаружил следующее сообщение об ошибке:
2020/01/16 15:30:24 [error] 24844#24844: *206729 client intended to send too large body: 33962282 bytes, client: xxx.xxxx.xxx.xxx, server: example.com, request: "POST /wp-admin/async-upload.php HTTP/2.0", host: "example.com", referrer: "https://example.com/"
Это просто означает, что значение client_max_body_size
в nginx было слишком маленьким. WordPress проверяет только параметр upload_max_filesize
в конфигурации PHP, поэтому WordPress позволяет загружать файлы большего размера, чем client_max_body_size
, если это значение меньше, чем upload_max_filesize
.

Я решил эту проблему, увеличив post_max_size с 8 МБ до 16 МБ
