В некоторых проектах на WordPress возникает необходимость автоматически загружать файлы с удалённых серверов и сохранять их в медиабиблиотеку сайта. Это может быть полезно для синхронизации данных, интеграции с внешними сервисами или обновления контента без участия администратора.
Почему нужна автоматическая загрузка файлов с удалённого сервера
Ручное скачивание и загрузка файлов занимает время и подвержено ошибкам. Автоматизация снижает трудозатраты и позволяет поддерживать актуальность контента. Например, если вы получаете изображения или документы с API партнёра, автоматический скрипт поможет:
- регулярно обновлять файлы по расписанию (cron);
- сохранять файлы с уникальными именами для предотвращения перезаписи;
- интегрировать файлы в медиабиблиотеку, чтобы их можно было использовать в постах и страницах;
- обрабатывать ошибки и вести логирование загрузок.
Пример решения: загрузка изображения из URL в медиабиблиотеку WordPress
Ниже приведён пример функции wptricks_import_remote_file(), которая загружает файл по URL, сохраняет в папку загрузок WordPress, регистрирует в медиабиблиотеке и возвращает ID вложения.
function wptricks_import_remote_file($file_url, $post_id = 0) {
// Проверяем, доступен ли URL
$response = wp_remote_get($file_url);
if (is_wp_error($response)) {
return new WP_Error('download_error', 'Не удалось скачать файл');
}
$file_contents = wp_remote_retrieve_body($response);
if (empty($file_contents)) {
return new WP_Error('empty_file', 'Файл пустой');
}
// Определяем имя файла
$filename = basename(parse_url($file_url, PHP_URL_PATH));
// Получаем директорию загрузок
$upload_dir = wp_upload_dir();
$file_path = $upload_dir['path'] . '/' . $filename;
// Сохраняем файл на диск
file_put_contents($file_path, $file_contents);
// Проверяем тип файла
$wp_filetype = wp_check_filetype($filename, null);
// Создаём массив для вставки в медиабиблиотеку
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => sanitize_file_name($filename),
'post_content' => '',
'post_status' => 'inherit'
);
// Вставляем вложение в базу данных
$attach_id = wp_insert_attachment($attachment, $file_path, $post_id);
// Загружаем необходимые функции для генерации метаданных
require_once(ABSPATH . 'wp-admin/includes/image.php');
// Генерируем метаданные и сохраняем
$attach_data = wp_generate_attachment_metadata($attach_id, $file_path);
wp_update_attachment_metadata($attach_id, $attach_data);
return $attach_id;
}
Вы можете использовать эту функцию в своих скриптах или подключать к хукам. Например, чтобы автоматически загружать файл и прикреплять его к посту:
$file_url = 'https://example.com/image.jpg';
$post_id = 123;
$attachment_id = wptricks_import_remote_file($file_url, $post_id);
if (is_wp_error($attachment_id)) {
error_log('Ошибка загрузки: ' . $attachment_id->get_error_message());
} else {
set_post_thumbnail($post_id, $attachment_id); // Устанавливаем как миниатюру поста
}
Автоматизация с помощью WP-Cron: регулярная загрузка файлов
Чтобы регулярно обновлять файлы с удалённого сервера, стоит задействовать WP-Cron. Например, настроим задачу, которая будет запускаться раз в сутки и загружать актуальные файлы.
Регистрация события WP-Cron
Добавьте в functions.php или в свой плагин следующий код:
function wptricks_schedule_remote_file_import() {
if (!wp_next_scheduled('wptricks_import_files_event')) {
wp_schedule_event(time(), 'daily', 'wptricks_import_files_event');
}
}
add_action('wp', 'wptricks_schedule_remote_file_import');
function wptricks_import_files_callback() {
$files_to_import = [
'https://example.com/image1.jpg',
'https://example.com/document.pdf',
];
foreach ($files_to_import as $file_url) {
$result = wptricks_import_remote_file($file_url);
if (is_wp_error($result)) {
error_log('Ошибка загрузки файла ' . $file_url . ': ' . $result->get_error_message());
} else {
error_log('Файл успешно загружен: ' . $file_url);
}
}
}
add_action('wptricks_import_files_event', 'wptricks_import_files_callback');
Этот код создаёт событие, которое раз в сутки будет вызывать функцию загрузки файлов из массива. Вы можете расширить список и добавить логику обновления или удаления устаревших файлов.
Работа с большими файлами и обработка ошибок
Если вы загружаете большие файлы, стоит учитывать лимиты PHP и таймауты. Для этого можно:
- использовать потоковую загрузку с помощью
fopenиstream_copy_to_stream; - делить загрузку на части или использовать внешний скрипт (например, на Python или bash);
- обрабатывать ошибки CURL и повторять попытки загрузки;
- логировать все операции в отдельный файл для диагностики.
Пример потоковой загрузки
function wptricks_stream_download($url, $save_path) {
$read_handle = fopen($url, 'rb');
if (!$read_handle) return false;
$write_handle = fopen($save_path, 'wb');
if (!$write_handle) {
fclose($read_handle);
return false;
}
while (!feof($read_handle)) {
$buffer = fread($read_handle, 8192);
fwrite($write_handle, $buffer);
}
fclose($read_handle);
fclose($write_handle);
return true;
}
После сохранения файла вызовите функции WordPress для регистрации вложения в медиабиблиотеке, как в первом примере.
Полезные плагины для работы с удалёнными файлами в WordPress
Если вы не хотите писать код с нуля, обратите внимание на плагины, которые помогают с импортом и синхронизацией файлов:
- WP All Import — мощный инструмент для импорта данных и файлов из CSV/XML с возможностью автоматизации;
- Media from FTP — позволяет импортировать файлы, загруженные по FTP, в медиабиблиотеку;
- External Media — работает с внешними хранилищами и позволяет использовать удалённые файлы без копирования;
- WPGPT — плагин с расширенными возможностями автоматизации, который можно интегрировать для создания сложных сценариев загрузки и обработки контента.
Советы по безопасности при загрузке файлов из внешних источников
При автоматической загрузке файлов важно учитывать безопасность, чтобы не загрузить вредоносный файл или не допустить взлома:
- Всегда проверяйте MIME-тип файла и расширение;
- ограничивайте список допустимых доменов для загрузки файлов;
- используйте функции WordPress для проверки и фильтрации файлов;
- обновляйте WordPress и плагины для защиты от известных уязвимостей;
- делайте резервные копии сайта перед внедрением новых автоматизаций.
Автоматическая удалённая загрузка файлов в WordPress — мощный инструмент для повышения эффективности сайта и упрощения работы с контентом. Используйте приведённые примеры и рекомендации, чтобы внедрить эту функцию быстро и безопасно.