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 cliente y el dominio es cliente.com.mx. Aparecieron archivos como:arduinoCopy/home/cliente/conf/web/cliente.com.mx.apache2.conf /home/cliente/conf/web/cliente.com.mx.apache2.ssl.conf
    • Dentro de esos archivos se encontró una línea como:iniCopyphp_admin_value open_basedir /home/cliente/web/cliente.com.mx/public_html:/home/cliente/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/cliente/web/cliente.com.mx/public_html:/home/cliente/tmp para que quede así:iniCopyphp_admin_value open_basedir /home/cliente/web/cliente.com.mx/public_html:/home/cliente/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, cliente). 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/cliente/web/cliente.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, cliente), 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!