"Unable to Create Directory wp-content/uploads. Is Its Parent Directory Writable?"
WordPress tried to make this month's upload folder and the filesystem said no. Check free disk space first, then ownership — whether wp-content/uploads belongs to the user PHP runs as. Ownership is the answer far more often than permissions are.
The instinct is to chmod 777 and move on. It usually works, which is the problem: it hides a wrong owner behind an open door, and on shared hosting that door faces every other site on the machine.
Unlike most media library errors, this one has nothing to do with your image. The file could be a 4 KB icon and you'd get the same result, because WordPress never reached the point of caring what you uploaded. It failed at mkdir.
Reading the message properly
The path in the message is specific and worth reading: wp-content/uploads/2026/08. WordPress organises uploads into year and month folders and creates each one on demand, which is why a site can work perfectly for months and break on the first of a month. Nothing changed except the folder name WordPress now needs.
"Is its parent directory writable by the server" is the actual diagnostic question. Not is it writable in general — writable by the server, meaning by the system user PHP executes as: www-data, apache, nginx, or a per-account user on managed hosting. Your SFTP login is frequently a different user, which is exactly how a folder you can write to is one PHP can't.
The five causes, in checking order
1. The disk is full
Thirty seconds, and it eliminates the most embarrassing possibility:
df -h
At 100% on the partition holding your site, directory creation fails and WordPress reports it as a writability problem. Also check inodes with df -i — a site with a large cache or an over-enthusiastic backup plugin can exhaust the inode table while gigabytes of space remain free, which produces the same message and looks impossible until you check.
2. Wrong ownership
The most common real cause, and it usually arrives with a migration.
ls -la wp-content/
The uploads entry should be owned by the user PHP runs as. If you restored a backup over SSH, files often end up owned by root or by your login account, and PHP can no longer write into them. Permissions look fine. Ownership isn't.
chown -R www-data:www-data wp-content/uploads
Substitute the correct user for your stack. On managed hosting you don't have root, and this is a one-line support ticket: "uploads is owned by the wrong user after a restore, please reset ownership." They do it daily.
3. Permissions that are actually too tight
If ownership is right, check the mode. Directories need the execute bit to be traversable:
find wp-content/uploads -type d -exec chmod 755 {} \;
find wp-content/uploads -type f -exec chmod 644 {} \;
And check wp-content itself, not just uploads. The message says parent directory for a reason: if uploads doesn't exist yet, WordPress needs write access to wp-content to create it.
4. A stale upload path in the database
This is the cause that survives every permissions fix, because the folder you keep repairing isn't the one WordPress is trying to use.
Look at the upload_path row in wp_options. On a site that has moved hosts, it can still hold an absolute path from the old server — /home/olduser/public_html/wp-content/uploads — which doesn't exist here. Empty the value and WordPress falls back to the default.
Check wp-config.php for a UPLOADS constant too. Both override the default, and neither announces itself.
5. The filesystem itself won't allow writes
Modern deployments make this more common than it used to be:
- Containers — the image is read-only or ephemeral, and
uploadshas to be a mounted volume. Nochmodhelps. - SELinux — enforcing mode blocks writes regardless of Unix permissions.
ls -Zshows the context; the httpd write boolean is the usual missing piece. open_basedir— PHP is confined to a set of paths and the uploads directory sits outside it. Common when a site is served from a symlinked release directory.- Host security lockdowns — some managed hosts set
wp-contentread-only during a malware response and don't always say so.
Why 777 is the wrong fix
chmod -R 777 makes the error disappear, so plenty of forum threads end there. What it means in practice: every user account on that server can write to, replace, or add files inside your uploads directory. On shared hosting, that's every other customer on the machine — and the uploads folder is the one place a site is designed to serve files from.
It also removes your only clue. The real fault was an owner mismatch, which is now invisible and will resurface at the next migration.
755 for directories, 644 for files, correct owner. If that combination doesn't work, the cause is one of the other four above, and 777 would only be papering over it.
What this one isn't
Worth being straight about: unlike most upload errors, this isn't something a better workflow avoids. It's a server fault, and every route into your Media Library — the admin uploader, WP-CLI, the REST API, our own plugin — writes to the same directory and fails the same way. There's no tool-side trick, and anyone selling you one is selling you something else.
Fix the filesystem. Then, if uploading images is a regular part of your week, it's worth making the rest of that process shorter — but that's a separate conversation from this error.
FAQ
What permissions should wp-content/uploads have?
755 for directories, 644 for files, owned by the user the web server runs as.
Should I use 777?
No. It lets every account on the server write into your uploads folder, and it hides the real cause, which is usually ownership rather than mode.
Why did uploads break after migrating?
Files restored over SSH are often owned by root or your login user instead of the web server user, and the upload_path option may still point at the old server's directory.
Can a full disk cause this?
Yes — and so can running out of inodes, which shows the same message while df -h still reports free space. Check df -i as well.
Where is the uploads path stored?
Derived from WP_CONTENT_DIR by default, overridable by the upload_path option in wp_options or the UPLOADS constant in wp-config.php.
Does this mean I've been hacked?
Not on its own. Migrations, restores, host-side permission resets and full disks account for nearly all of it. Scan only if other unexplained changes appeared at the same time.
Once the server behaves again
If the reason you were uploading in the first place was a batch of images out of Figma, Fig2WP removes the export-and-drag half of that job: select layers, press Upload, and they land in the Media Library with titles and alt text already set.