проблема с put_contents в wp_filesystem с владельцем/группой

Вопрос или проблема

Я использую функцию 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 // Файл существует
        {
            // Логика для обработки существующего файла
        }
    }
}

Важные моменты

  1. Проверка прав доступа: Убедитесь, что PHP-скрипт выполняется с достаточными правами для записи в указанную директорию. Это можно проверить через файл конфигурации сервера или через chmod.

  2. Пути хранения: Проверьте, что путь для сохранения файлов (в данном случае ABSPATH . '/images') корректен и существует. При необходимости создайте директорию заранее.

  3. Обработка ошибок: Включите дополнительные механизмы обработки ошибок, чтобы понимать, когда и почему загрузка файлов может завершаться неудачей.

  4. Безопасность: Используйте механизм валидации для URL-адресов изображений, чтобы избежать потенциальных угроз безопасности (например, загрузка файлов с недостоверных источников).

Заключение

С помощью вашего обновленного кода вы обеспечиваете правильное присвоение владельца и группы для загружаемых файлов, что устраняет проблему с ошибками 404. Эффективная настройка разрешений и использование API файловой системы WordPress помогут вам избежать многих проблем в будущем. Настоятельно рекомендуется регулярно проверять права доступа и следить за обновлениями WordPress, чтобы поддерживать безопасность и работоспособность вашего сайта.

Оцените материал
Добавить комментарий

Капча загружается...