wpcoding.ru wordpress WP Coding

Как создать автоматический импорт продуктов из REST API в WordPress

В этой статье мы подробно разберем, как реализовать автоматический импорт продуктов из внешнего REST API в WordPress. Это позволит вам интегрировать каталоги товаров из сторонних сервисов или собственных систем в ваш сайт без ручного обновления. Мы рассмотрим создание кастомного типа записей, настройку WP Cron для регулярного запуска импорта и пример кода для обработки данных API.

Почему автоматический импорт продуктов важен для WordPress сайтов

Автоматизация импорта продуктов избавляет вас от необходимости вручную добавлять или обновлять каталоги товаров, что экономит время и снижает вероятность ошибок. Особенно это актуально для интернет-магазинов и каталогов с большим объемом товаров, где данные постоянно меняются. Использование REST API позволяет получать актуальную информацию с внешних сервисов и интегрировать ее в WordPress.

Кроме того, автоматический импорт упрощает поддержание актуальности цен, описаний и наличия товаров, что положительно влияет на пользовательский опыт и конверсию.

Создаем кастомный тип записи для продуктов

Первый шаг — создать в WordPress специальный тип записей для продуктов, если вы не используете WooCommerce или хотите иметь отдельные записи с уникальной структурой.

function wpcoding_register_product_post_type() {
    $labels = array(
        'name' => 'Продукты',
        'singular_name' => 'Продукт',
        'add_new' => 'Добавить продукт',
        'add_new_item' => 'Добавить новый продукт',
        'edit_item' => 'Редактировать продукт',
        'new_item' => 'Новый продукт',
        'view_item' => 'Просмотреть продукт',
        'search_items' => 'Поиск продуктов',
        'not_found' => 'Продукты не найдены',
        'not_found_in_trash' => 'В корзине продукты не найдены',
    );
    $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
        'supports' => array('title', 'editor', 'thumbnail'),
        'show_in_rest' => true,
        'rewrite' => array('slug' => 'products')
    );
    register_post_type('wpcoding_product', $args);
}
add_action('init', 'wpcoding_register_product_post_type');

Этот код регистрирует тип записей wpcoding_product, который мы будем использовать для сохранения импортируемых товаров.

Настройка регулярного запуска импорта через WP Cron

Для автоматического обновления данных нужно настроить периодический запуск функции импорта. Используем встроенный WP Cron.

function wpcoding_schedule_product_import() {
    if (!wp_next_scheduled('wpcoding_import_products_event')) {
        wp_schedule_event(time(), 'hourly', 'wpcoding_import_products_event');
    }
}
add_action('wp', 'wpcoding_schedule_product_import');

add_action('wpcoding_import_products_event', 'wpcoding_import_products_from_api');

Этот код запускает событие wpcoding_import_products_event каждый час, которое вызывает функцию wpcoding_import_products_from_api для импорта.

Основная функция импорта из REST API

Теперь реализуем функцию, которая делает запрос к API, обрабатывает ответ и сохраняет или обновляет записи в WordPress.

function wpcoding_import_products_from_api() {
    $api_url = 'https://example.com/api/products'; // замените на ваш API
    $response = wp_remote_get($api_url);

    if (is_wp_error($response)) {
        error_log('WPCoding Import API error: ' . $response->get_error_message());
        return;
    }

    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);

    if (empty($data) || !is_array($data)) {
        error_log('WPCoding Import API: неверный формат данных');
        return;
    }

    foreach ($data as $product) {
        // Проверяем обязательные поля
        if (empty($product['id']) || empty($product['name'])) {
            continue;
        }

        // Ищем продукт по внешнему ID
        $existing = new WP_Query(array(
            'post_type' => 'wpcoding_product',
            'meta_key' => 'wpcoding_external_id',
            'meta_value' => $product['id'],
            'posts_per_page' => 1
        ));

        $post_data = array(
            'post_title' => sanitize_text_field($product['name']),
            'post_content' => sanitize_textarea_field($product['description'] ?? ''),
            'post_status' => 'publish',
            'post_type' => 'wpcoding_product'
        );

        if ($existing->have_posts()) {
            $post_id = $existing->posts[0]->ID;
            $post_data['ID'] = $post_id;
            wp_update_post($post_data);
        } else {
            $post_id = wp_insert_post($post_data);
            if (!is_wp_error($post_id)) {
                update_post_meta($post_id, 'wpcoding_external_id', $product['id']);
            }
        }

        // Обновляем дополнительные метаполя, например цену
        if (isset($product['price'])) {
            update_post_meta($post_id, 'wpcoding_price', floatval($product['price']));
        }

        // Можно добавить загрузку и установку изображения продукта
        if (!empty($product['image_url'])) {
            wpcoding_set_product_thumbnail($post_id, $product['image_url']);
        }
    }
}

function wpcoding_set_product_thumbnail($post_id, $image_url) {
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/media.php');

    $media = media_sideload_image($image_url, $post_id, null, 'id');

    if (!is_wp_error($media)) {
        set_post_thumbnail($post_id, $media);
    }
}

Функция wpcoding_import_products_from_api проходит по массиву продуктов, полученных из API, и добавляет или обновляет записи. В метаполе wpcoding_external_id сохраняется уникальный идентификатор продукта из внешней системы, что позволяет избежать дублирования.

Также реализована функция wpcoding_set_product_thumbnail для загрузки и установки изображения как миниатюры записи.

Дополнительные советы по работе с импортом

Обработка ошибок и логирование

Для надежности важно отслеживать ошибки при получении данных и записи в базу. В примере используется error_log, но для продвинутого решения можно настроить запись в отдельный файл или отправлять уведомления администратору.

Оптимизация производительности

Если API возвращает большой объем данных, лучше реализовать постраничный импорт — запрашивать и обрабатывать данные частями. Это снизит нагрузку на сервер и уменьшит вероятность таймаутов.

Использование WP CLI для ручного запуска импорта

Для удобства можно добавить команду WP CLI, чтобы запускать импорт вручную из консоли:

if (defined('WP_CLI') && WP_CLI) {
    WP_CLI::add_command('wpcoding_import_products', function() {
        wpcoding_import_products_from_api();
        WP_CLI::success('Импорт продуктов завершен');
    });
}

После этого в терминале можно выполнить wp wpcoding_import_products для запуска импорта.

Заключение

Автоматический импорт продуктов из REST API — мощный инструмент для интеграции внешних каталогов с WordPress. Используя кастомные типы записей, WP Cron и правильную обработку данных, вы сможете создать гибкое и надежное решение под ваши задачи.

Для расширения функционала можно интегрировать плагины для кэширования, добавить поддержку пользовательских таксономий или реализовать синхронизацию с WooCommerce.

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

×

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

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

пишет статьи

готовит SEO

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

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