При работе с внешними REST API для импорта данных в WordPress часто возникают задачи, связанные с обработкой больших объемов информации, необходимостью пагинации, а также обработкой различных ошибок, чтобы импорт был надежным и удобным для пользователя. В этой статье мы подробно разберем, как создать автоматический импорт из внешнего REST API в WordPress с учетом этих особенностей.
Почему важна пагинация и обработка ошибок при импорте из REST API
Большинство REST API возвращают данные постранично, чтобы не перегружать сервер и клиента. Если не реализовать пагинацию, вы рискуете получить только часть данных или перегрузить сайт запросами.
Обработка ошибок важна для устойчивости процесса: сеть может быть нестабильной, API может временно не отвечать, или возвращать ошибки. Без проверки таких ситуаций импорт может прерваться или записать некорректные данные.
Рассмотрим на примере, как реализовать импорт с поддержкой пагинации и обработкой ошибок в WordPress.
Создание функции импорта с пагинацией
Для начала создадим функцию wpcoding_import_from_api(), которая будет запрашивать данные по страницам, пока не получит все записи.
function wpcoding_import_from_api($base_url) {
$page = 1;
$per_page = 50; // Количество записей на страницу
$all_data = [];
while (true) {
$url = add_query_arg([
'page' => $page,
'per_page' => $per_page
], $base_url);
$response = wp_remote_get($url, [
'timeout' => 10
]);
// Проверка ошибок HTTP
if (is_wp_error($response)) {
error_log('WPCoding Import Error: ' . $response->get_error_message());
break; // Прекращаем импорт при ошибке
}
$code = wp_remote_retrieve_response_code($response);
if ($code !== 200) {
error_log('WPCoding Import HTTP Error: ' . $code);
break;
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if (empty($data)) {
// Нет данных, прекращаем цикл
break;
}
$all_data = array_merge($all_data, $data);
// Если количество полученных данных меньше per_page, значит достигли конца
if (count($data) < $per_page) {
break;
}
$page++;
}
return $all_data;
}
В этой функции мы последовательно запрашиваем страницы с данными, пока не получим все записи. При возникновении ошибки или отсутствии данных цикл прерывается.
Пример вызова функции
Предположим, API возвращает список товаров по адресу https://example.com/api/products. Используем нашу функцию:
$products = wpcoding_import_from_api('https://example.com/api/products');
if (!empty($products)) {
foreach ($products as $product) {
// Обработка каждого продукта
}
}
Обработка и сохранение импортированных данных в WordPress
Полученные данные нужно сохранить в базе WordPress. Обычно для таких задач создают Custom Post Type или используют метаданные. Рассмотрим пример сохранения в посты типа product.
function wpcoding_save_products($products) {
foreach ($products as $item) {
// Проверяем, есть ли уже такой продукт по уникальному ID
$existing = get_posts([
'post_type' => 'product',
'meta_key' => 'wpcoding_product_external_id',
'meta_value' => $item['id'],
'posts_per_page' => 1
]);
if ($existing) {
$post_id = $existing[0]->ID;
// Обновляем пост
wp_update_post([
'ID' => $post_id,
'post_title' => sanitize_text_field($item['name']),
'post_content' => sanitize_textarea_field($item['description'])
]);
} else {
// Создаем новый пост
$post_id = wp_insert_post([
'post_type' => 'product',
'post_title' => sanitize_text_field($item['name']),
'post_content' => sanitize_textarea_field($item['description']),
'post_status' => 'publish'
]);
if (is_wp_error($post_id)) {
error_log('WPCoding Insert Post Error: ' . $post_id->get_error_message());
continue;
}
}
// Обновляем метаданные
update_post_meta($post_id, 'wpcoding_product_external_id', $item['id']);
update_post_meta($post_id, 'wpcoding_product_price', floatval($item['price']));
}
}
Такой подход позволяет поддерживать синхронизацию и избегать дублирования.
Автоматизация импорта через WP-Cron
Чтобы импорт выполнялся автоматически, можно использовать WP-Cron и настроить периодический запуск нашей функции.
function wpcoding_schedule_import() {
if (!wp_next_scheduled('wpcoding_import_event')) {
wp_schedule_event(time(), 'hourly', 'wpcoding_import_event');
}
}
add_action('wp', 'wpcoding_schedule_import');
add_action('wpcoding_import_event', function() {
$products = wpcoding_import_from_api('https://example.com/api/products');
if (!empty($products)) {
wpcoding_save_products($products);
}
});
Этот код запускает импорт каждый час. При необходимости интервал можно изменить или добавить собственный.
Полезные плагины для работы с REST API и импортом
Для расширения возможностей и удобства можно использовать плагины:
- Clearfy Pro — оптимизация и расширение функционала WordPress, полезна для контроля запросов и кеширования.
- WPRemark — полезен для создания отзывов и комментариев, которые можно импортировать и из API.
Советы по безопасности и производительности
При импорте важно учитывать нагрузку на сервер и безопасность:
- Ограничивайте количество запросов и используйте кеширование.
- Обрабатывайте ошибки и логируйте их, чтобы быстро выявлять проблемы.
- Проверяйте и фильтруйте полученные данные, чтобы избежать уязвимостей.
- Если импорт большой, разбивайте процессы на части и используйте транзакции, если необходимо.
Соблюдение этих рекомендаций обеспечит стабильную работу вашего сайта и корректный импорт данных.