wpcoding.ru wordpress WP Coding

Как создать автоматический импорт из внешнего REST API в WordPress с поддержкой пагинации и обработкой ошибок

При работе с внешними 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.

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

При импорте важно учитывать нагрузку на сервер и безопасность:

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

Соблюдение этих рекомендаций обеспечит стабильную работу вашего сайта и корректный импорт данных.

×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше