Upload Dir high
Unable to create directory wp-content/uploads. Is its parent directory writable?
WordPress can't write into wp-content/uploads, usually a permissions or ownership problem, occasionally a full disk.
What you see
Unable to create directory wp-content/uploads/2026/06. Is its parent directory writable by the server?
What’s actually happening
Media Library uploads fail and you get this message, often after a host migration, a manual file restore, or a security "hardening" that reset permissions. Images won't attach to posts; the year/month subfolder never gets created. The web server process simply lacks write access to the path — or the path is full.
Common causes
- The uploads directory (or wp-content) is owned by a different user than the one PHP/the web server runs as, so writes are denied
- Directory permissions are too restrictive — 555 or 644 on a folder instead of 755 — so the server can't create the dated subfolder
- The disk or the account's inode/quota is full; the folder is writable but there's no room to create the file
- An incorrect custom path in Settings > Media (upload_path option) points somewhere that doesn't exist or isn't writable
- SELinux or an open_basedir / hardening rule blocks writes to that path even though Unix permissions look fine
How to fix it
- Set correct permissions: 755 on directories, 644 on filesOver SSH from the site root: `find wp-content/uploads -type d -exec chmod 755 {} \;` and `find wp-content/uploads -type f -exec chmod 644 {} \;`. Via FTP, right-click the uploads folder, set 755, and apply recursively to directories. Never use 777 — it's a security hole and rarely the actual fix.
- Fix ownership to match the web server userThe files must be owned by the user PHP runs as (often www-data, apache, or nginx; on cPanel it's your account user). Check with `ps aux | grep -E 'apache|php|nginx'`, then `chown -R youruser:www-data wp-content/uploads`. Ownership mismatches are the #1 cause after a migration or a restore done as root.
- Check for a full disk or quota`df -h` for disk space and `df -i` for inodes. On shared hosting, check the quota in cPanel. If you're at 100%, permissions are a red herring — clear space (old backups, logs, /tmp) and the upload will succeed.
- Verify the upload path in the databaseIn Settings > Media, or via `wp option get upload_path`, make sure there's no stale absolute path left over from another server. Blank it (`wp option update upload_path ''`) to let WordPress fall back to the default wp-content/uploads.
- Rule out SELinux / hardeningOn CentOS/RHEL with SELinux enforcing, run `chcon -R -t httpd_sys_rw_content_t wp-content/uploads`. Also check any open_basedir restriction in php.ini that might exclude the path.
Stop it recurring
After any migration or restore, immediately reset uploads to 755/644 and chown it to the web-server user, then test one upload.
Related errors