Как синхронизировать статьи между сайтами WordPress без плагинов

Диагностика задачи: когда нужна синхронизация статей без плагинов

Часто разработчики и владельцы сайтов сталкиваются с необходимостью поддерживать идентичный контент на нескольких независимых сайтах WordPress. Например, корпоративный сайт и его региональные версии, или несколько партнерских ресурсов. Использование плагинов для синхронизации не всегда приемлемо из-за ограничений по производительности, безопасности или уникальных требований к структуре данных.

В таких случаях разумно реализовать кастомный механизм синхронизации через API и WP REST API, что позволит передавать статьи (посты) напрямую между сайтами.

Пошаговое решение: синхронизация постов через WP REST API

1. Подготовка REST API на приемной стороне

Добавьте в functions.php темы или в кастомный плагин код для создания REST endpoint, который будет принимать данные и создавать/обновлять посты.

add_action('rest_api_init', function () {
    register_rest_route('custom-sync/v1', '/post', [
        'methods'  => 'POST',
        'callback' => 'custom_sync_create_update_post',
        'permission_callback' => function () {
            return current_user_can('edit_posts');
        },
    ]);
});

function custom_sync_create_update_post(WP_REST_Request $request) {
    $data = $request->get_json_params();
    if (empty($data['post_title']) || empty($data['post_content'])) {
        return new WP_Error('invalid_data', 'Title or content missing', ['status' => 400]);
    }

    $post_id = 0;
    if (!empty($data['post_id'])) {
        $post_id = intval($data['post_id']);
    }

    $post_data = [
        'post_title'   => sanitize_text_field($data['post_title']),
        'post_content' => wp_kses_post($data['post_content']),
        'post_status'  => 'publish',
        'post_type'    => 'post',
    ];

    if ($post_id && get_post($post_id)) {
        $post_data['ID'] = $post_id;
        $new_post_id = wp_update_post($post_data, true);
    } else {
        $new_post_id = wp_insert_post($post_data, true);
    }

    if (is_wp_error($new_post_id)) {
        return $new_post_id;
    }

    return ['post_id' => $new_post_id, 'message' => 'Post synced successfully'];
}

2. Отправка данных с исходного сайта

Соберите необходимые данные поста и отправьте их на REST endpoint приемного сайта с помощью PHP и функции wp_remote_post().

$post_data = [
    'post_title'   => get_the_title($post_id),
    'post_content' => apply_filters('the_content', get_post_field('post_content', $post_id)),
    'post_id'      => $post_id, // если хотите обновлять существующий
];

$response = wp_remote_post('https://target-site.com/wp-json/custom-sync/v1/post', [
    'headers' => [
        'Authorization' => 'Basic ' . base64_encode('user:password'), // Используйте базовую авторизацию или OAuth
        'Content-Type'  => 'application/json',
    ],
    'body'    => json_encode($post_data),
]);

if (is_wp_error($response)) {
    error_log('Sync error: ' . $response->get_error_message());
} else {
    $code = wp_remote_retrieve_response_code($response);
    $body = wp_remote_retrieve_body($response);
    if ($code === 200) {
        error_log('Sync success: ' . $body);
    } else {
        error_log('Sync failed: ' . $body);
    }
}

Проверка результата после внедрения

  • Отправьте тестовую статью с исходного сайта и проверьте, что она появилась или обновилась на приемном сайте.
  • Убедитесь, что заголовок, содержимое и статус поста совпадают.
  • Проверьте логи ошибок WordPress на обоих сайтах для выявления возможных проблем.

Частые ошибки и как исправить

  • Ошибка 401 Unauthorized: Неправильные или отсутствующие данные авторизации. Проверьте правильность логина/пароля или настройте OAuth.
  • Данные не принимаются: Неверный формат JSON или отсутствие обязательных полей. Используйте json_encode и валидируйте данные перед отправкой.
  • Права доступа: Функция permission_callback возвращает false. Убедитесь, что пользователь, от имени которого выполняется запрос, имеет права edit_posts.
  • Конфликты с кешем: Если на приемном сайте настроен кеш, обновления могут не отображаться сразу. Очистите кеш после синхронизации.

Практические советы по безопасности и производительности

  • Используйте HTTPS для защиты данных при передаче между сайтами.
  • Ограничьте доступ к REST endpoint по IP или используйте авторизацию с токенами.
  • Для синхронизации большого объема данных разбивайте отправку на чанки, чтобы избежать таймаутов.
  • Кэшируйте результаты запросов, если синхронизация не требует мгновенного обновления.
  • Регулярно проверяйте логи доступа и ошибок для своевременного обнаружения проблем.

Сравнение вариантов реализации синхронизации

МетодПлюсыМинусыПример
REST API (кастомный endpoint)Гибкость, безопасность, легко адаптируется под задачиТребует разработки и поддержкиКод из статьи
Плагины для синхронизацииПростота настройки, готовые решенияНагрузка, ограничения функционала, возможные конфликтыWP Migrate DB Pro, WP Sync DB
Экспорт/импорт XMLПростота, не требует постоянного соединенияРучная работа, риск потери данныхСтандартный WordPress XML экспорт
Как сделать автоматическую синхронизацию оповещений WordPress между сайтами
24.03.2026
Как синхронизировать WordPress между сайтами: пошаговое руководство
02.11.2025
Как синхронизировать поля ACF между сайтами WordPress
19.12.2025
Как синхронизировать пользовательские комментарии WordPress между сайтами
30.12.2025
Как запретить загрузку внешних iframe в WordPress для безопасности сайта
03.05.2026