Вопрос или проблема
Я использую функцию put_contents() для загрузки изображений на сервер, на локальном компьютере все работает нормально, но на сервере группа пользователя, когда файлы загружаются на сервер, — это “nginx nobody”, и это вызывает ошибку 404 для изображений, которые не отображаются. Как я могу сделать так, чтобы файл загружался с владельцем/группой по умолчанию WordPress?
global $wp_filesystem;
// Инициализируем файловую систему WP.
if (empty($wp_filesystem)) {
require_once (ABSPATH . '/wp-admin/includes/file.php');
WP_Filesystem();
}
$wp_filesystem->put_contents($save_file_to, $file_to_save, 0644)
Я это исправил, используя эту функцию request_filesystem_credentials(), похоже, что она инициализирует все и получает правильные учетные данные.
Нашел это в примере в этой статье: Введение в API файловой системы WordPress.
Мой код:
# получить учетные данные
function connect_fs()
{
global $wp_filesystem;
if( false === ($credentials = request_filesystem_credentials('')) )
{
return false;
}
// проверьте, правильные ли учетные данные.
if(!WP_Filesystem($credentials))
{
request_filesystem_credentials('');
return false;
}
return true;
}
function donload_images($image_title, $image_url)
{
global $wp_filesystem;
# путь для сохранения
$files_path = ABSPATH . '/image';
$save_file_to = $files_path ."https://wordpress.stackexchange.com/". $image_title;
# проверьте, существует ли запрашиваемый файл на сервере
$file_exists = file_exists($save_file_to);
if(connect_fs()){
// Получаем файл
if(!$file_exists)
{
# Загрузка информации о файле
$file_to_save = file_get_contents($image_url);
// успех
if($wp_filesystem->put_contents($save_file_to, $file_to_save, FS_CHMOD_FILE)){
}
else // ошибка
{
}
return $file_to_save;
}
else // Файл существует
{
}
}
}
.
Ответ или решение
В ситуации, когда вы сталкиваетесь с проблемами прав доступа при использовании функции put_contents()
из API файловой системы WordPress, важно понимать, как правильно настроить права владельцев и групп для файлов, загружаемых на сервер.
Проблема
Как вы указали, использование функции put_contents()
на локальном сервере проходит успешно, однако при загрузке изображений на удаленном сервере файлы приобретают владельца и группу "nginx nobody". Это создает проблемы с доступом к изображениям, что в итоге приводит к ошибке 404 при их загрузке.
Решение
Вы правильно начали с инициализации файловой системы WordPress с помощью функции request_filesystem_credentials()
, которая эффективно обрабатывает учётные данные для файловой системы. Эта функция позволяет вашему коду получать необходимые разрешения для записи файлов с правильными владельцами и группами.
Ваш скорректированный код выглядит следующим образом:
function connect_fs()
{
global $wp_filesystem;
// Получаем учетные данные
if( false === ($credentials = request_filesystem_credentials('')) )
{
return false;
}
// Проверяем, корректны ли учетные данные
if(!WP_Filesystem($credentials))
{
request_filesystem_credentials('');
return false;
}
return true;
}
function download_images($image_title, $image_url)
{
global $wp_filesystem;
// Путь для сохранения
$files_path = ABSPATH . '/images';
$save_file_to = $files_path . '/' . basename($image_title);
// Проверяем, существует ли файл на сервере
$file_exists = file_exists($save_file_to);
if(connect_fs()){
// Получаем файл
if(!$file_exists)
{
// Загружаем содержимое файла
$file_to_save = file_get_contents($image_url);
// Успех
if($wp_filesystem->put_contents($save_file_to, $file_to_save, FS_CHMOD_FILE)){
// Файл успешно сохранен
}
else //Ошибка
{
// Обработка ошибки
}
return $file_to_save;
}
else // Файл существует
{
// Логика для обработки существующего файла
}
}
}
Важные моменты
-
Проверка прав доступа: Убедитесь, что PHP-скрипт выполняется с достаточными правами для записи в указанную директорию. Это можно проверить через файл конфигурации сервера или через
chmod
. -
Пути хранения: Проверьте, что путь для сохранения файлов (в данном случае
ABSPATH . '/images'
) корректен и существует. При необходимости создайте директорию заранее. -
Обработка ошибок: Включите дополнительные механизмы обработки ошибок, чтобы понимать, когда и почему загрузка файлов может завершаться неудачей.
-
Безопасность: Используйте механизм валидации для URL-адресов изображений, чтобы избежать потенциальных угроз безопасности (например, загрузка файлов с недостоверных источников).
Заключение
С помощью вашего обновленного кода вы обеспечиваете правильное присвоение владельца и группы для загружаемых файлов, что устраняет проблему с ошибками 404. Эффективная настройка разрешений и использование API файловой системы WordPress помогут вам избежать многих проблем в будущем. Настоятельно рекомендуется регулярно проверять права доступа и следить за обновлениями WordPress, чтобы поддерживать безопасность и работоспособность вашего сайта.