Диагностика задачи: когда нужна синхронизация статей без плагинов
Часто разработчики и владельцы сайтов сталкиваются с необходимостью поддерживать идентичный контент на нескольких независимых сайтах 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 экспорт |