Предупреждения ftp_nlist() и ftp_pwd() в WordPress
Не уверен, когда именно начали появляться эти предупреждения. Мне передали существующий сайт для хостинга, и я применил следующие рекомендации:
- Обновил WordPress — с версии 5.3 до 5.4.0 (текущая версия WP)
- Обновил все плагины — список большой, поэтому не буду его приводить здесь
- Изменил права доступа и владельца файлов — всё принадлежит моему пользователю (не Apache), и только папка
wp-content
доступна для записи Apache (с некоторыми ограничениями внутри) → Руководство по усилению безопасности WordPress
Примечание: пользователь и группа Apache используются как Apache, так и PHP-FPM. Сервер (VM) используется только для этого сайта, поэтому мне не нужно решать проблемы безопасности, связанные с разделением процессов.
После этих изменений начали появляться следующие предупреждения PHP (да, я сделал всё одновременно! Извините за это):
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
Эти предупреждения появляются в лог-файле PHP-FPM при каждом вызове сервера. Если установить define( 'WP_DEBUG', true );
, их можно увидеть на каждой странице.
Шаги по решению
Я могу устранить эти предупреждения одним из следующих способов:
- Отключить плагины Swift Framework и Redux Framework.
- Установить владельца папки WordPress на Apache.
Ни один из этих вариантов не является желаемым решением. Первый ломает сайт, а второй создаёт проблему безопасности.
Ошибка WordPress?
Я также нашёл WordPress issue 48689, где описаны те же ошибки, но связанные с другими плагинами. Однако решение (if (!defined('FS_METHOD')) define('FS_METHOD', 'direct');
) в моём случае не работает. Остальные варианты, такие как скрытие предупреждений, не кажутся хорошей идеей.

Ведь это уже было в вопросе!
Контекст
Оба плагина связаны с темой моего сайта на WordPress (uplift). Я не могу понять, что именно он делает и где, но когда он обнаруживает, что владелец файлов — не его пользователь (apache), он меняет метод доступа на FTP.
Такое поведение кажется мне нелогичным, потому что даже если я сделаю 775 user:apache
(псевдокод), это не сработает (он проверяет владельца, а не права доступа). Я мог бы сделать 575 apache:user
, но в этом случае apache сможет выполнять CHMOD, так что это бессмысленно.
Кроме того, это происходит вне wp-content
. И это не задокументировано ни плагинами, ни темой, что, на мой взгляд, является проблемой безопасности. 0 результатов по запросам "owner" и "permission" в документации.
Решение
Просто добавьте define('FS_METHOD', 'direct');
.
Но с небольшой оговоркой! Это нужно добавить перед require_once( ABSPATH . 'wp-settings.php' );
. Почему? Опять же, понятия не имею. Однако это требование для многих конфигураций, как видно из документации по редактированию wp-config.php.
Предостережения
Как указано в этом ответе, использование FS_METHOD
может представлять угрозу безопасности на shared-хостинге. В моём случае это не актуально, поэтому моё исследование закончилось здесь.
Неясные моменты
Пожалуйста, не стесняйтесь ответить на следующие вопросы (в комментариях или отдельным ответом, я приму ответ или дополню свой соответствующим образом):
- Что делает тема uplift? Зачем ей проверять владельца файлов?
- Почему настройка
FS_METHOD
должна загружаться до страницыwp-settings.php
? - Какое решение подойдёт для shared-хостинга?

Огромное спасибо за эту статью! Я мучился целую неделю из-за ошибок, похожих на описанные вами, которые мешали обновлению и настройке плагина на моем сайте. Я много раз читал о добавлении "define('FS_METHOD', 'direct');" в конфигурационный файл WordPress для работы на сервере Synology (в моем случае хостинг), но еще не встречал информации о том, что эта строка должна быть перед "require_once( ABSPATH . 'wp-settings.php' );". В моем случае она стояла сразу после, и когда я переместил ее на строку выше - внезапно все заработало! Просто замечательно! Еще раз спасибо.
