A continuación, encontrarás un tutorial paso a paso para solucionar el error “Falta un directorio temporal” en WordPress y el inconveniente de no poder subir imágenes o archivos. Este caso puntual se presentó en un servidor con VestaCP, pero los pasos son similares en cualquier hosting con configuraciones de open_basedir
y permisos de carpetas.
1. Descripción del problema
Al intentar subir una imagen en WordPress (en Medios → Añadir nuevo), aparece el error:
“Falta un directorio temporal”
(o en algunas versiones, “El archivo subido no se ha podido mover a…”)
Además, en los registros de error (logs) del servidor, se observan mensajes como:
sqlCopyPHP Warning: Unknown: open_basedir restriction in effect. File(/tmp) is not within the allowed path(s)...
File upload error - unable to create a temporary file in Unknown on line 0
También puede que al final, cuando se corrige open_basedir
, se muestre un nuevo error:
“El archivo subido no se ha podido mover a wp-content/uploads/…”
Lo que indica un problema de permisos en la carpeta de subidas.
2. Causas principales
- Restricción de
open_basedir
: PHP está intentando usar/tmp
(o alguna carpeta temporal), pero no está incluida en la lista de directorios permitidos poropen_basedir
. - Permisos en la carpeta
uploads
: El usuario con el que corre PHP/Apache (por ejemplo,www-data
) no tiene permisos de escritura enwp-content/uploads
.
3. Solución en dos partes
3.1. Añadir :/tmp
a la directiva open_basedir
En muchos servidores con VestaCP, la directiva open_basedir
no se define directamente en /etc/php/7.x/apache2/php.ini
, sino en archivos de configuración específicos del dominio. Para hallarlos:
- Buscar dónde se define la directiva
open_basedir
- Conéctate por SSH y revisa la carpeta de configuración del dominio:bashCopy
cd /home/USUARIO/conf/web grep -Ri open_basedir .
- En nuestro ejemplo, el usuario es
geasa
y el dominio esgeasa.com.mx
. Aparecieron archivos como:arduinoCopy/home/geasa/conf/web/geasa.com.mx.apache2.conf /home/geasa/conf/web/geasa.com.mx.apache2.ssl.conf
- Dentro de esos archivos se encontró una línea como:iniCopy
php_admin_value open_basedir /home/geasa/web/geasa.com.mx/public_html:/home/geasa/tmp
- Conéctate por SSH y revisa la carpeta de configuración del dominio:bashCopy
- Editar para incluir
:/tmp
- Abre cada archivo con un editor (por ejemplo,
nano
) y modifica la línea:iniCopyphp_admin_value open_basedir /home/geasa/web/geasa.com.mx/public_html:/home/geasa/tmp
para que quede así:iniCopyphp_admin_value open_basedir /home/geasa/web/geasa.com.mx/public_html:/home/geasa/tmp:/tmp
- Guarda los cambios.
- Abre cada archivo con un editor (por ejemplo,
- Reinicia el servicio
- Si usas Apache con mod_php:bashCopy
systemctl restart apache2
- Si usas PHP-FPM:bashCopy
systemctl restart php7.2-fpm
- Ajusta la versión
7.2
según corresponda.
- Si usas Apache con mod_php:bashCopy
- Verifica con
phpinfo()
- Crea o revisa
info.php
(dentro de tu sitio) con:phpCopy<?php phpinfo();
- Accede a
https://tudominio.com/info.php
y localiza “open_basedir” en la sección “PHP Core”. - Asegúrate de que Local Value incluya
:/tmp
.
- Crea o revisa
Con esto, desaparecerá el error de “open_basedir restriction in effect” y la advertencia de “Falta un directorio temporal”. PHP podrá usar /tmp
sin restricciones.
3.2. Ajustar permisos en la carpeta uploads
Después de arreglar la parte de open_basedir
, es posible que sigas viendo un error como:
“El archivo subido no se ha podido mover a wp-content/uploads/2025/01.”
Esto indica que el usuario con el que corre PHP/Apache (por ejemplo, www-data
) no tiene permisos de escritura en wp-content/uploads
(y subdirectorios).
- Identifica el usuario de Apache/PHP
- En Ubuntu/Debian, normalmente es
www-data
. En CentOS suele serapache
. - Si usas VestaCP con PHP-FPM, a veces corre con el mismo usuario de la cuenta (por ejemplo,
geasa
). Pero en este caso, se encontró que Apache/PHP se ejecuta comowww-data
.
- En Ubuntu/Debian, normalmente es
- Asigna la propiedad y permisos correctos
- Desde la raíz de tu WordPress:bashCopy
cd /home/geasa/web/geasa.com.mx/public_html/wp-content
- Cambia la propiedad de la carpeta
uploads
:bashCopychown -R www-data:www-data uploads
(Sustituyewww-data:www-data
por el usuario/grupo reales que corran PHP, si son distintos.) - Ajusta los permisos recomendados:bashCopy
find uploads -type d -exec chmod 755 {} \; find uploads -type f -exec chmod 644 {} \;
- Desde la raíz de tu WordPress:bashCopy
- Prueba subir un archivo
- Ve a WordPress → Medios → Añadir nuevo y sube la imagen o PDF.
- Si los permisos son correctos, WordPress podrá mover el archivo desde la carpeta temporal hasta
wp-content/uploads/AAAA/MM
.
4. Notas finales
- En algunos servidores con VestaCP, si cada dominio utiliza PHP-FPM con su propio usuario (por ejemplo,
geasa
), puede que no sea necesario asignar permisos awww-data
. - Asegúrate de que la configuración de PHP-FPM para tu dominio esté asociada al mismo usuario que posee los archivos, para que no haya conflicto de permisos.
- Si prefieres no usar
/tmp
como carpeta temporal, podrías definirupload_tmp_dir
oWP_TEMP_DIR
enwp-config.php
y permitir esa ruta enopen_basedir
. Pero en la mayoría de los casos, habilitar/tmp
y dar los permisos adecuados auploads
funciona sin problemas.
5. Conclusión
Para resolver el error “Falta un directorio temporal” o “El archivo subido no se ha podido mover…” en WordPress:
- Incluye
/tmp
enopen_basedir
si PHP lo necesita (edita los archivos de configuración del dominio y reinicia PHP/Apache). - Asegúrate de que la carpeta
uploads
(y subcarpetas) tenga permisos de escritura para el usuario con el que corre PHP (propietario y permisos adecuados).
De este modo, podrás subir imágenes, PDFs y otros archivos a WordPress sin volver a ver esos errores de directorio temporal o permisos. ¡Listo!
A continuación, encontrarás un tutorial paso a paso para solucionar el error “Falta un directorio temporal” en WordPress y el inconveniente de no poder subir imágenes o archivos. Este caso puntual se presentó en un servidor con VestaCP, pero los pasos son similares en cualquier hosting con configuraciones de open_basedir
y permisos de carpetas.
1. Descripción del problema
Al intentar subir una imagen en WordPress (en Medios → Añadir nuevo), aparece el error:
“Falta un directorio temporal”
(o en algunas versiones, “El archivo subido no se ha podido mover a…”)
Además, en los registros de error (logs) del servidor, se observan mensajes como:
sqlCopyPHP Warning: Unknown: open_basedir restriction in effect. File(/tmp) is not within the allowed path(s)...
File upload error - unable to create a temporary file in Unknown on line 0
También puede que al final, cuando se corrige open_basedir
, se muestre un nuevo error:
“El archivo subido no se ha podido mover a wp-content/uploads/…”
Lo que indica un problema de permisos en la carpeta de subidas (wp-content/uploads
).
2. ¿Por qué en algunos sitios de VestaCP no existe este error y en otros sí?
En VestaCP, cada dominio o sitio puede configurarse con:
- PHP-FPM corriendo como el usuario de la cuenta (por ejemplo,
geasa
). - mod_php (o PHP-FPM global) corriendo como
www-data
(oapache
).
En el primer caso, si el propietario de los archivos coincide con el usuario de PHP-FPM, no hay conflicto de permisos y no suele mostrarse el error “Falta un directorio temporal”.
En cambio, si tu sitio usa un modo de ejecución diferente (por ejemplo, mod_php o un pool de PHP-FPM que corre con www-data
), pero los archivos en wp-content/uploads
pertenecen a otro usuario, se generan errores de permisos. Además, si open_basedir
no incluye /tmp
, se bloquea la creación de archivos temporales y surge el mensaje “Falta un directorio temporal”.
Por eso puede ocurrir que en otros WordPress en el mismo servidor no tengas problema (porque están configurados con PHP-FPM y el mismo usuario de la cuenta), pero en este dominio en particular sí se presenta el error.
3. Solución en dos partes
3.1. Añadir :/tmp
a la directiva open_basedir
En muchos servidores con VestaCP, la directiva open_basedir
no se define directamente en /etc/php/7.x/apache2/php.ini
, sino en archivos de configuración específicos del dominio. Para hallarlos:
- Buscar dónde se define la directiva
open_basedir
- Conéctate por SSH y revisa la carpeta de configuración del dominio:bashCopy
cd /home/USUARIO/conf/web grep -Ri open_basedir .
- En nuestro ejemplo, el usuario es
geasa
y el dominio esgeasa.com.mx
. Aparecieron archivos como:arduinoCopy/home/geasa/conf/web/geasa.com.mx.apache2.conf /home/geasa/conf/web/geasa.com.mx.apache2.ssl.conf
- Dentro de esos archivos se encontró una línea como:iniCopy
php_admin_value open_basedir /home/geasa/web/geasa.com.mx/public_html:/home/geasa/tmp
- Conéctate por SSH y revisa la carpeta de configuración del dominio:bashCopy
- Editar para incluir
:/tmp
- Abre cada archivo con un editor (por ejemplo,
nano
) y modifica la línea:iniCopyphp_admin_value open_basedir /home/geasa/web/geasa.com.mx/public_html:/home/geasa/tmp
para que quede así:iniCopyphp_admin_value open_basedir /home/geasa/web/geasa.com.mx/public_html:/home/geasa/tmp:/tmp
- Guarda los cambios.
- Abre cada archivo con un editor (por ejemplo,
- Reinicia el servicio
- Si usas Apache con mod_php:bashCopy
systemctl restart apache2
- Si usas PHP-FPM:bashCopy
systemctl restart php7.2-fpm
- Ajusta la versión
7.2
según corresponda.
- Si usas Apache con mod_php:bashCopy
- Verifica con
phpinfo()
- Crea o revisa
info.php
(dentro de tu sitio) con:phpCopy<?php phpinfo();
- Accede a
https://tudominio.com/info.php
y localiza “open_basedir” en la sección “PHP Core”. - Asegúrate de que Local Value incluya
:/tmp
.
- Crea o revisa
Con esto, desaparecerá el error de “open_basedir restriction in effect” y la advertencia de “Falta un directorio temporal”. PHP podrá usar /tmp
sin restricciones.
3.2. Ajustar permisos en la carpeta uploads
Después de arreglar la parte de open_basedir
, es posible que sigas viendo un error como:
“El archivo subido no se ha podido mover a wp-content/uploads/2025/01.”
Esto indica que el usuario con el que corre PHP/Apache (por ejemplo, www-data
) no tiene permisos de escritura en wp-content/uploads
(y subdirectorios).
- Identifica el usuario de Apache/PHP
- En Ubuntu/Debian, normalmente es
www-data
. En CentOS suele serapache
. - Si usas VestaCP con PHP-FPM y está configurado para usar el mismo usuario que el dueño de la cuenta (p. ej.
geasa
), no haría falta cambiar permisos awww-data
. Pero si el proceso se ejecuta comowww-data
, entonces WordPress necesita quewww-data
tenga permisos.
- En Ubuntu/Debian, normalmente es
- Asigna la propiedad y permisos correctos
- Desde la raíz de tu WordPress:bashCopy
cd /home/geasa/web/geasa.com.mx/public_html/wp-content
- Cambia la propiedad de la carpeta
uploads
:bashCopychown -R www-data:www-data uploads
(Sustituyewww-data:www-data
por el usuario/grupo reales que corran PHP, si son distintos.) - Ajusta los permisos recomendados:bashCopy
find uploads -type d -exec chmod 755 {} \; find uploads -type f -exec chmod 644 {} \;
- Desde la raíz de tu WordPress:bashCopy
- Prueba subir un archivo
- Ve a WordPress → Medios → Añadir nuevo y sube la imagen o PDF.
- Si los permisos son correctos, WordPress podrá mover el archivo desde la carpeta temporal hasta
wp-content/uploads/AAAA/MM
.
4. Conclusión
Para resolver el error “Falta un directorio temporal” o “El archivo subido no se ha podido mover…” en WordPress, revisa estos dos aspectos:
- Include
/tmp
enopen_basedir
: edita los archivos de configuración de tu dominio para queopen_basedir
admita:/tmp
, y reinicia PHP/Apache. - Permisos en
uploads
: asegúrate de que la carpetawp-content/uploads
(y subcarpetas) pertenezca al usuario con el que corre PHP y tenga permisos de escritura (directorios 755, archivos 644).
De este modo, tu WordPress podrá:
- Crear archivos temporales sin restricciones de
open_basedir
. - Mover los archivos subidos a la carpeta
uploads
sin errores de permisos.
¡Y listo! Con ello, ya no verás el mensaje de “Falta un directorio temporal” ni “El archivo subido no se ha podido mover…” y podrás subir archivos con normalidad en WordPress.