Error ‘Falta un directorio temporal’ en WordPress: Causas y solución en servidores con VestaCP

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 MediosAñ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

  1. Restricción de open_basedir: PHP está intentando usar /tmp (o alguna carpeta temporal), pero no está incluida en la lista de directorios permitidos por open_basedir.
  2. Permisos en la carpeta uploads: El usuario con el que corre PHP/Apache (por ejemplo, www-data) no tiene permisos de escritura en wp-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:

  1. Buscar dónde se define la directiva open_basedir
    • Conéctate por SSH y revisa la carpeta de configuración del dominio:bashCopycd /home/USUARIO/conf/web grep -Ri open_basedir .
    • En nuestro ejemplo, el usuario es geasa y el dominio es geasa.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:iniCopyphp_admin_value open_basedir /home/geasa/web/geasa.com.mx/public_html:/home/geasa/tmp
  2. 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.
  3. Reinicia el servicio
    • Si usas Apache con mod_php:bashCopysystemctl restart apache2
    • Si usas PHP-FPM:bashCopysystemctl restart php7.2-fpm
    • Ajusta la versión 7.2 según corresponda.
  4. 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.

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).

  1. Identifica el usuario de Apache/PHP
    • En Ubuntu/Debian, normalmente es www-data. En CentOS suele ser apache.
    • 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 como www-data.
  2. Asigna la propiedad y permisos correctos
    • Desde la raíz de tu WordPress:bashCopycd /home/geasa/web/geasa.com.mx/public_html/wp-content
    • Cambia la propiedad de la carpeta uploads:bashCopychown -R www-data:www-data uploads (Sustituye www-data:www-data por el usuario/grupo reales que corran PHP, si son distintos.)
    • Ajusta los permisos recomendados:bashCopyfind uploads -type d -exec chmod 755 {} \; find uploads -type f -exec chmod 644 {} \;
  3. Prueba subir un archivo
    • Ve a WordPressMediosAñ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 a www-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 definir upload_tmp_dir o WP_TEMP_DIR en wp-config.php y permitir esa ruta en open_basedir. Pero en la mayoría de los casos, habilitar /tmp y dar los permisos adecuados a uploads 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:

  1. Incluye /tmp en open_basedir si PHP lo necesita (edita los archivos de configuración del dominio y reinicia PHP/Apache).
  2. 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 MediosAñ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 (o apache).

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:

  1. Buscar dónde se define la directiva open_basedir
    • Conéctate por SSH y revisa la carpeta de configuración del dominio:bashCopycd /home/USUARIO/conf/web grep -Ri open_basedir .
    • En nuestro ejemplo, el usuario es geasa y el dominio es geasa.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:iniCopyphp_admin_value open_basedir /home/geasa/web/geasa.com.mx/public_html:/home/geasa/tmp
  2. 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.
  3. Reinicia el servicio
    • Si usas Apache con mod_php:bashCopysystemctl restart apache2
    • Si usas PHP-FPM:bashCopysystemctl restart php7.2-fpm
    • Ajusta la versión 7.2 según corresponda.
  4. 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.

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).

  1. Identifica el usuario de Apache/PHP
    • En Ubuntu/Debian, normalmente es www-data. En CentOS suele ser apache.
    • 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 a www-data. Pero si el proceso se ejecuta como www-data, entonces WordPress necesita que www-data tenga permisos.
  2. Asigna la propiedad y permisos correctos
    • Desde la raíz de tu WordPress:bashCopycd /home/geasa/web/geasa.com.mx/public_html/wp-content
    • Cambia la propiedad de la carpeta uploads:bashCopychown -R www-data:www-data uploads (Sustituye www-data:www-data por el usuario/grupo reales que corran PHP, si son distintos.)
    • Ajusta los permisos recomendados:bashCopyfind uploads -type d -exec chmod 755 {} \; find uploads -type f -exec chmod 644 {} \;
  3. Prueba subir un archivo
    • Ve a WordPressMediosAñ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:

  1. Include /tmp en open_basedir: edita los archivos de configuración de tu dominio para que open_basedir admita :/tmp, y reinicia PHP/Apache.
  2. Permisos en uploads: asegúrate de que la carpeta wp-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.