Как увеличить максимальный размер загружаемого файла в WordPress
Лимит загрузки в WordPress задают три настройки, и все они должны быть согласованы. Фактический лимит — это наименьшее из upload_max_filesize, post_max_size
Опубликовано
Лимит загрузки в WordPress задают три настройки, и все они должны быть согласованы между собой. Фактический потолок — это наименьшее из значений upload_max_filesize, post_max_size и лимита запроса вашего веб-сервера. Поднимете одно, а два других оставите низкими — и ничего не изменится. Именно поэтому большинство приходит к выводу, что их правка «не сработала». Сначала проверьте свои текущие значения с помощью инструмента для проверки максимального размера загрузки в WordPress: он считывает те же значения, что показывает сам WordPress, и подсказывает, какое из них вас ограничивает.
Зачем нужен этот лимит и где он задаётся
WordPress не задаёт лимит загрузки. Он только показывает его. Когда вы видите сообщение «The uploaded file exceeds the upload_max_filesize directive in php.ini», оно приходит напрямую из PHP.
Загрузку ограничивают три отдельных значения, и реальный потолок — это то из них, которое ниже всех:
upload_max_filesize(PHP) — самый большой отдельный файл, который примет PHP.post_max_size(PHP) — самый большой суммарный объём тела POST-запроса. Ваш файл едет внутри POST-запроса вместе с другими полями формы, поэтому это значение должно быть больше, чемupload_max_filesize.- Лимит тела запроса на веб-сервере —
client_max_body_sizeв Nginx илиLimitRequestBodyв Apache. Он живёт полностью вне PHP, поэтому правки только в PHP молча ничего не дают за Nginx.
Четвёртое значение, max_execution_time, не ограничивает размер, но оборвёт медленную загрузку большого файла на полпути при плохом соединении. Это отдельный симптом, а не часть потолка по размеру.
Ловушка: вы ставите upload_max_filesize = 256M, перезагружаете — и всё равно не можете загрузить файл на 100 МБ, потому что post_max_size до сих пор равен 8M. PHP отклоняет запрос по общему объёму тела ещё до того, как вообще посмотрит на файл. Лимит вас не проигнорировал — просто другой лимит поймал запрос первым.
Как это исправить, по порядку
Идите от того, что почти наверняка сработает, к крайним мерам.
1. Отредактируйте php.ini (правильное место). Найдите тот файл, который реально загружает ваш сайт: запустите страницу с <?php phpinfo(); и посмотрите строку «Loaded Configuration File», либо спросите у хостинга. Задайте оба значения PHP и держите post_max_size больше, чем upload_max_filesize:
upload_max_filesize = 256M
post_max_size = 260M
max_execution_time = 300
Перезапустите PHP-FPM (sudo systemctl restart php8.2-fpm) или Apache. Изменения ничего не дадут, пока процесс PHP не перезапустится.
2. Нет доступа к php.ini? Используйте .htaccess (только Apache + mod_php). Добавьте в .htaccess в корне WordPress:
php_value upload_max_filesize 256M
php_value post_max_size 260M
php_value max_execution_time 300
Это работает только тогда, когда PHP запущен как модуль Apache. При PHP-FPM, CGI или FastCGI php_value выдаст ошибку 500 — и этот сбой означает, что вы пошли не туда, а не что значение неправильное. Переходите на .user.ini:
upload_max_filesize = 256M
post_max_size = 260M
3. Поднимите лимит веб-сервера — шаг, о котором все забывают. В Nginx PHP вообще не видит слишком большой запрос: Nginx первым возвращает 413 Request Entity Too Large. В блоке server:
client_max_body_size 256M;
Перезагрузите конфигурацию: sudo nginx -t && sudo systemctl reload nginx. Если вы на Nginx и ваши правки в PHP «ничего не дали», почти всегда причина именно в этом.
После любого изменения снова проверьте показываемые значения. Инструмент для проверки максимального размера загрузки покажет новый фактический потолок и сгенерирует точный сниппет под вашу конфигурацию, чтобы вы не гадали, какое из трёх значений всё ещё занижено.
Чего делать не стоит
Не редактируйте wp-config.php в надежде поднять лимит. Широко копируемая строчка делает вовсе не то, что обещают в блогах:
@ini_set( 'upload_max_filesize' , '256M' );
upload_max_filesize имеет уровень PHP_INI_PERDIR. Его нельзя изменить из PHP во время выполнения через ini_set(). Он принимает новые значения только из php.ini, .htaccess или .user.ini — но никогда из кода приложения. Эта строка выполняется без ошибок и не делает ничего, что и делает её одним из самых уверенно повторяемых кусков неправильного совета в мире WordPress.
Не вставляйте и @ini_set('post_max_size', ...) — то же ограничение, тот же молчаливый холостой ход.
Не задавайте WP_MEMORY_LIMIT, думая, что это лимит загрузки. Он управляет потолком памяти PHP для выполнения кода. К тому, файл какого размера принимает сервер, он отношения не имеет.
Не останавливайтесь на одном файле. Самая частая ошибка — изменить только upload_max_filesize и объявить, что исправление не работает. Меняйте все три значения и держите post_max_size выше, чем upload_max_filesize.
Не задавайте лимиты «с запасом» абсурдно большими. Лимит в 2 ГБ создаёт проблемы с исчерпанием ресурсов и не помогает: если вам действительно нужны файлы в несколько гигабайт, загружайте их вне браузера (по SFTP или через плагин с чанковой загрузкой), а не проталкивайте одним POST-запросом PHP.
Всё ещё не выходит?
Если все три значения подняты, а вы всё равно упираетесь в стену, значит запрос режется где-то выше вашего сервера: CDN или прокси (панель Cloudflare сама по себе ограничивает размер тела загрузки), платформенный лимит управляемого хостинга, который игнорирует ваш php.ini, либо .user.ini, который ещё не обновился — он учитывает user_ini.cache_ttl из настроек PHP, поэтому может отставать на несколько минут после сохранения. Убедитесь, что именно сообщает сервер, а не что вы написали в файле, и правьте тот слой, который всё ещё занижен. Когда показываемое число наконец совпадёт с вашей целью, загрузка заработает.
FAQ
Вопросы
Почему WordPress пишет, что загруженный файл превышает директиву upload_max_filesize в php.ini?
Это сообщение приходит прямо из PHP, а не из WordPress — WordPress не задаёт лимит загрузки, он лишь показывает его. Загрузку ограничивают три значения, и побеждает наименьшее: upload_max_filesize, post_max_size и лимит тела запроса вашего веб-сервера, то есть client_max_body_size на Nginx или LimitRequestBody на Apache.
Увеличивает ли строка ini_set upload_max_filesize в wp-config.php лимит загрузки?
Нет. upload_max_filesize имеет уровень PHP_INI_PERDIR, поэтому изменить его из кода приложения во время выполнения через ini_set() нельзя. Строка отрабатывает без ошибок и не делает ничего. Новые значения принимаются только из php.ini, .htaccess или .user.ini. То же ограничение и та же тихая пустышка касаются post_max_size.
Почему при загрузке в WordPress всё ещё возникает ошибка 413 Request Entity Too Large?
Nginx отклоняет запрос ещё до того, как его увидит PHP. Поднимите client_max_body_size в блоке server, затем перезагрузите конфигурацию командами sudo nginx -t и sudo systemctl reload nginx. Если у вас Nginx и правки PHP словно ничего не дали, причина почти всегда именно в этом.
Должен ли post_max_size быть больше upload_max_filesize?
Да. Ваш файл едет внутри POST-запроса вместе с остальными полями формы, поэтому post_max_size должен быть больше upload_max_filesize. Поставить upload_max_filesize в 256M, оставив post_max_size на 8M, — значит не изменить ничего: PHP отклонит запрос по общему размеру тела ещё до того, как посмотрит на сам файл.
Почему php_value в .htaccess вызывает ошибку 500?
php_value работает только тогда, когда PHP запущен как модуль Apache. Под PHP-FPM, CGI или FastCGI он выдаёт ошибку 500, то есть неверен способ, а не число. Перейдите на файл .user.ini и задайте upload_max_filesize и post_max_size там.