Автоматический импорт данных из внешних источников — частая задача при разработке сайтов на WordPress, будь то импорт товаров, новостей, постов или любых других данных. При этом важно не только правильно получить и сохранить данные, но и грамотно обработать возможные ошибки, чтобы избежать потери информации и сбоев в работе сайта.
Почему важна обработка ошибок при импорте данных
При работе с внешними API или файлами могут возникать самые разные ошибки: от проблем с сетью до некорректных данных или ограничений со стороны сервера. Если не предусмотреть обработку ошибок, импорт может прерваться, а это приведёт к неполным данным на сайте и негативному опыту пользователей.
Обработка ошибок позволяет:
- Автоматически повторять попытки импорта при временных сбоях
- Логировать ошибки для последующего анализа и исправления
- Избежать дублирования записей и потери данных
- Информировать администратора сайта о проблемах
Рассмотрим, как можно реализовать автоматический импорт с обработкой ошибок на примере импорта постов из JSON API.
Создание функции автоматического импорта с обработкой ошибок
Начнём с базовой функции, которая будет запрашивать данные из внешнего API, проверять их и создавать новые записи в WordPress. В коде мы добавим обработку ошибок и логирование.
function wpkit_import_posts_from_api() {
$api_url = 'https://example.com/api/posts';
$response = wp_remote_get($api_url, array('timeout' => 15));
if (is_wp_error($response)) {
error_log('WPKit Import Error: ' . $response->get_error_message());
return false; // Ошибка запроса
}
$code = wp_remote_retrieve_response_code($response);
if ($code != 200) {
error_log('WPKit Import Error: HTTP response code ' . $code);
return false; // Ошибка HTTP
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log('WPKit Import Error: JSON decode error: ' . json_last_error_msg());
return false; // Ошибка парсинга JSON
}
if (empty($data) || !is_array($data)) {
error_log('WPKit Import Error: Empty or invalid data');
return false;
}
foreach ($data as $item) {
if (empty($item['title']) || empty($item['content'])) {
error_log('WPKit Import Warning: Missing title or content in item');
continue; // Пропускаем некорректные записи
}
// Проверяем, не импортирован ли уже этот пост (по уникальному ID)
$existing = get_posts(array(
'meta_key' => 'wpkit_external_id',
'meta_value' => $item['id'],
'post_type' => 'post',
'post_status' => 'any',
'numberposts' => 1
));
if ($existing) {
continue; // Уже импортировано
}
// Создаём новый пост
$post_id = wp_insert_post(array(
'post_title' => sanitize_text_field($item['title']),
'post_content' => wp_kses_post($item['content']),
'post_status' => 'publish',
'post_type' => 'post'
));
if (is_wp_error($post_id)) {
error_log('WPKit Import Error: Failed to insert post for ID ' . $item['id']);
continue;
}
// Сохраняем внешний ID для проверки дубликатов
update_post_meta($post_id, 'wpkit_external_id', sanitize_text_field($item['id']));
}
return true;
}Разбор кода
В функции wpkit_import_posts_from_api происходит:
- Запрос к API с таймаутом 15 секунд
- Проверка ошибок HTTP и JSON
- Обработка каждого элемента массива с проверкой обязательных полей
- Проверка на дубликаты через метаполе
wpkit_external_id - Создание постов и сохранение внешнего ID для будущих проверок
- Логирование всех ошибок и предупреждений в системный лог PHP
Автоматизация запуска импорта через WP-Cron
Чтобы импорт выполнялся автоматически, добавим задачу в планировщик WordPress. Запускать импорт, например, можно ежедневно в полночь.
function wpkit_schedule_import() {
if (!wp_next_scheduled('wpkit_daily_import_event')) {
wp_schedule_event(strtotime('00:00:00'), 'daily', 'wpkit_daily_import_event');
}
}
add_action('wp', 'wpkit_schedule_import');
add_action('wpkit_daily_import_event', 'wpkit_import_posts_from_api');Этот код регистрирует ежедневное событие wpkit_daily_import_event, которое вызывает функцию импорта.
Уведомления об ошибках через email
Для оперативного реагирования полезно получать уведомления на почту администратора в случае ошибок. Для этого можно расширить функцию импорта:
function wpkit_import_posts_from_api_with_email() {
$result = wpkit_import_posts_from_api();
if (!$result) {
$admin_email = get_option('admin_email');
wp_mail($admin_email, 'Ошибка импорта WPKit', 'При импорте данных произошла ошибка. Проверьте логи сервера.');
}
}
add_action('wpkit_daily_import_event', 'wpkit_import_posts_from_api_with_email');Использование плагинов для расширенной функциональности
Хотя самостоятельная реализация даёт полный контроль, для сложных сценариев стоит рассмотреть готовые решения. Например:
- WPRemark — плагин с поддержкой автоматического импорта и расширенного логирования
- Expert Review — для импорта и обработки отзывов с внешних источников
- My Popup — для уведомления администраторов и пользователей о статусе импорта
Интеграция с этими плагинами может значительно упростить работу с импортом и расширить возможности по обработке данных и уведомлениям.
Рекомендации по безопасности и производительности
При работе с импортом стоит учитывать:
- Ограничения по времени выполнения скриптов — используйте WP-Cron и разбивайте импорт на партии, если данных много
- Валидацию и санитизацию данных, чтобы избежать XSS и SQL-инъекций
- Логирование ошибок с возможностью очистки старых записей
- Использование transient API для кеширования ответов внешних API при повторных запросах
Эти меры помогут сделать импорт стабильным и безопасным.
Выводы
Автоматический импорт данных с обработкой ошибок — важная и востребованная задача в разработке на WordPress. Реализуя его самостоятельно, вы получаете гибкость и контроль, а плагиновые решения помогут сэкономить время и расширить функционал. Важно уделять внимание логированию, уведомлениям и безопасности при работе с внешними данными.