Advertencias de ftp_nlist() y ftp_pwd() en WordPress
No estoy seguro de cuándo comenzó esta advertencia. Recibí un sitio existente para administrar su alojamiento y apliqué las siguientes buenas prácticas:
- Actualicé WordPress - de 5.3 a 5.4.0 (versión actual de WP)
- Actualicé todos los plugins - es una lista larga así que no la incluiré aquí
- Cambié los permisos y propietario de los archivos - todo pertenece a mi usuario (no a Apache) y solo la carpeta
wp-content
tiene permisos de escritura para Apache (con algunas restricciones internas) -> Guía de Fortalecimiento de WordPress
Como nota, el usuario y grupo de Apache son utilizados tanto por Apache como por PHP-FPM. Solo usamos el servidor (VM) para este sitio web, por lo que no tengo que abordar desafíos de seguridad relacionados con el uso compartido de procesos.
Con estos cambios, comencé a tener las siguientes advertencias de PHP (Sí, ¡hice todo al mismo tiempo! Lo siento por eso):
Warning: ftp_nlist() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 402
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 681
Warning: ftp_nlist() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 402
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 681
Warning: ftp_nlist() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 402
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_rmdir() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 381
Warning: ftp_nlist() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 402
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 681
Estas advertencias aparecen en el archivo de registro de PHP-FPM en cada llamada al servidor. Si configuro define( 'WP_DEBUG', true );
se pueden encontrar en cada página.
Pasos para resolver
Puedo detener estas advertencias haciendo una de las siguientes acciones:
- Desactivando los plugins Swift Framework y Redux Framework.
- Estableciendo el propietario de los archivos de la carpeta de WordPress como Apache.
Ninguno de estos cambios es la solución deseada. El primero rompe el sitio, y el segundo crea un problema de seguridad.
¿Error de WordPress?
También encontré el problema 48689 de WordPress que describe los mismos errores pero asociados con diferentes plugins. Sin embargo, la solución (if (!defined('FS_METHOD')) define('FS_METHOD', 'direct');
) no funciona en mi caso. Las opciones restantes de ocultar las advertencias no parecen ser una buena idea.

¡Después de todo, ya estaba en la pregunta!
Contexto
Ambos plugins están relacionados con el tema de mi sitio WordPress (uplift). No puedo entender qué está haciendo o dónde, pero cuando detecta que el propietario de los archivos no es el usuario que los ejecuta (apache), cambia el método de acceso a FTP.
Esta acción no me parece lógica, porque incluso si hago 775 usuario:apache
(pseudo-código), no funciona (está buscando al propietario, no si tiene permisos). Podría hacer 575 apache:usuario
, pero en ese caso, apache puede ejecutar CHMOD, lo que lo hace inútil.
Además, esto está sucediendo fuera de wp-content
. Y no está documentado por los plugins o el tema, lo que para mí parece un problema de seguridad. 0 resultados para "owner" y "permission" en la documentación.
Solución
Simplemente añade define('FS_METHOD', 'direct');
.
¡Con un poco de precaución! Esto debe añadirse antes de require_once( ABSPATH . 'wp-settings.php' );
. ¿Por qué? De nuevo, no tengo idea. Sin embargo, esto es un requisito para varias configuraciones, como puedes ver en la página de documentación sobre editar wp-config.php.
Precauciones
Como se menciona en esta respuesta, usar FS_METHOD
puede representar un riesgo de seguridad en alojamientos compartidos. No es mi caso, así que mi investigación terminó aquí.
Dudas pendientes
Siéntete libre de responder las siguientes dudas (en los comentarios o con una respuesta, aceptaré la respuesta o complementaré la mía según corresponda):
- ¿Qué está haciendo el tema uplift? ¿Por qué necesitan verificar el propietario?
- ¿Por qué la configuración
FS_METHOD
debe cargarse antes de la páginawp-settings.php
? - ¿Cuál sería la solución para un escenario de alojamiento compartido?

¡Muchas gracias por esta publicación! He estado luchando durante una semana debido a errores similares a los que describes, que impedían actualizaciones y la configuración de un plugin en mi sitio web. Había leído muchas veces sobre agregar "define('FS_METHOD', 'direct');" en el archivo de configuración de WordPress para que funcione en un servidor Synology (mi caso de hosting) Pero aún no había leído sobre la necesidad de tener esa línea antes de "require_once( ABSPATH . 'wp-settings.php' );". En mi caso estaba colocada justo después y cuando la moví una línea arriba, ¡de repente todo comenzó a funcionar! ¡Genial! Gracias de nuevo
