Одной из частых задач при работе с несколькими сайтами на WordPress является необходимость синхронизации медиафайлов, особенно изображений. Если тексты и настройки можно переносить через базы данных или специальные плагины, то медиафайлы требуют отдельного подхода, так как они хранятся в файловой системе и связаны с базой через метаданные.
Почему важна синхронизация изображений между сайтами WordPress
При переносе или клонировании контента между сайтами без синхронизации изображений ссылки на медиафайлы могут ломаться, поскольку файлы физически отсутствуют на новом сайте. Это приводит к отображению пустых блоков или ошибок загрузки.
Автоматическая синхронизация позволяет:
- Обеспечить целостность контента без ручного копирования файлов;
- Сократить время обновления нескольких ресурсов;
- Обеспечить единообразие визуальной части сайтов.
Рассмотрим, как это реализовать на практике.
Обзор методов синхронизации медиафайлов WordPress
Плагины для синхронизации медиафайлов
Среди популярных решений можно выделить:
- Media Sync — импорт и экспорт медиафайлов между сайтами, но требует ручного запуска;
- WP Offload Media — переносит загрузки в облачные хранилища, облегчая общий доступ;
- WP Media Folder — улучшенное управление медиафайлами с возможностью синхронизации.
Однако для автоматической двусторонней синхронизации потребуется либо платный функционал, либо собственные скрипты и API.
Синхронизация с помощью REST API и WP-CLI
Если у вас есть несколько сайтов, вы можете использовать REST API WordPress для передачи данных об изображениях и WP-CLI — для загрузки файлов через командную строку.
Основная идея: скрипт на сайте-источнике собирает список новых или изменённых изображений, передаёт их метаданные и файлы целевому сайту, где происходит импорт.
Практическая реализация автоматической синхронизации изображений
1. Создание функции для получения списка новых изображений
Добавим в functions.php или плагин на исходном сайте функцию wpsync_get_new_images(), которая возвращает массив новых изображений с момента последней синхронизации.
function wpsync_get_new_images($last_sync_time) {
$args = [
'post_type' => 'attachment',
'post_mime_type' => 'image',
'posts_per_page' => -1,
'date_query' => [
[
'after' => $last_sync_time
]
]
];
$query = new WP_Query($args);
$images = [];
foreach ($query->posts as $image) {
$images[] = [
'ID' => $image->ID,
'url' => wp_get_attachment_url($image->ID),
'title' => $image->post_title,
'alt' => get_post_meta($image->ID, '_wp_attachment_image_alt', true)
];
}
return $images;
}2. Отправка изображений на целевой сайт через REST API
Для передачи изображений используем POST-запрос к REST API целевого сайта. Там создадим эндпоинт, который примет файлы и создаст вложения.
Пример регистрации REST маршрута на целевом сайте:
add_action('rest_api_init', function () {
register_rest_route('wpsync/v1', '/upload-image', [
'methods' => 'POST',
'callback' => 'wpsync_handle_image_upload',
'permission_callback' => function () {
return current_user_can('upload_files');
},
]);
});
function wpsync_handle_image_upload(WP_REST_Request $request) {
$file = $request->get_file_params()['file'] ?? null;
if (!$file) {
return new WP_Error('no_file', 'Файл не загружен', ['status' => 400]);
}
require_once(ABSPATH . 'wp-admin/includes/file.php');
$overrides = ['test_form' => false];
$movefile = wp_handle_upload($file, $overrides);
if ($movefile && !isset($movefile['error'])) {
$attachment = [
'post_mime_type' => $movefile['type'],
'post_title' => sanitize_file_name($file['name']),
'post_content' => '',
'post_status' => 'inherit'
];
$attach_id = wp_insert_attachment($attachment, $movefile['file']);
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attach_data = wp_generate_attachment_metadata($attach_id, $movefile['file']);
wp_update_attachment_metadata($attach_id, $attach_data);
return ['attachment_id' => $attach_id];
} else {
return new WP_Error('upload_error', $movefile['error'], ['status' => 500]);
}
}3. Скрипт для отправки изображений с исходного сайта
На исходном сайте пишем функцию, которая передает каждое новое изображение на целевой сайт:
function wpsync_send_images_to_site($images, $target_url, $auth_token) {
foreach ($images as $image) {
$file_path = get_attached_file($image['ID']);
$file = curl_file_create($file_path);
$data = ['file' => $file];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target_url . '/wp-json/wpsync/v1/upload-image');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $auth_token
]);
$response = curl_exec($ch);
curl_close($ch);
// Обработать ответ - сохранить ID вложения и т.д.
}
}Рекомендации по безопасности и производительности
При реализации автоматической синхронизации важно обеспечить:
- Безопасность передачи данных — используйте HTTPS и авторизацию через токены;
- Обработка ошибок и повторные попытки на случай сбоев сети;
- Ограничение количества файлов в одном запросе для предотвращения таймаутов;
- Логирование действий для диагностики.
Для крупных проектов можно настроить синхронизацию по расписанию через WP-Cron или системный cron, чтобы обмен происходил регулярно и автоматически.
Заключение
Автоматическая синхронизация изображений между сайтами WordPress — задача, требующая продуманного подхода к передаче файлов и метаданных. Использование REST API дает гибкость и масштабируемость решения. С помощью приведенного кода можно построить надежный механизм обмена медиафайлами между вашими ресурсами.
Для удобства и расширения функционала стоит рассмотреть профессиональные плагины или интеграции с облачными хранилищами, например, WP Media Folder с поддержкой синхронизации и управления файлами.