Автоматическая синхронизация изображений WordPress между сайтами

Одной из частых задач при работе с несколькими сайтами на 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 с поддержкой синхронизации и управления файлами.

Как удалить неиспользуемые плагины в WordPress без риска для сайта
26.11.2025
Как удалить заблокированные аккаунты WordPress: практическое руководство
10.04.2026
Эффективная синхронизация WP-Cron задач между сайтами WordPress
31.03.2026
Как отключить автоматические обновления WordPress и плагинов
28.03.2026
Как синхронизировать записи пользователей и метаданные в WordPress между сайтами
11.12.2025