Как создать автоматический импорт курсов в WordPress для образовательного сайта

Если вы ведёте сайт с бесплатными курсами на WordPress, например, wpfreecourses.ru, вам может пригодиться автоматизация процесса добавления новых курсов. В этой статье мы подробно разберём, как настроить автоматический импорт курсов из внешних источников, таких как CSV-файлы, JSON API или RSS-каналы, а также рассмотрим плагины и примеры кода, которые помогут быстро интегрировать этот функционал.

Почему автоматический импорт курсов важен для образовательных сайтов

Образовательные сайты, предлагающие бесплатные курсы, часто получают контент из разных источников. Ручное добавление курсов занимает много времени и приводит к ошибкам. Автоматизация позволяет:

  • Сократить время обновления контента;
  • Поддерживать актуальность и свежесть курсов;
  • Обеспечить единообразие структуры данных;
  • Уменьшить количество рутинной работы.

Для реализации импорта можно использовать готовые решения или кастомные скрипты, в зависимости от потребностей проекта.

Выбор плагина для автоматического импорта курсов

Существует несколько популярных плагинов, которые позволяют импортировать данные в WordPress. Рассмотрим наиболее подходящие для импорта курсов:

WP All Import + Add-On для Custom Post Types

Плагин WP All Import — мощный инструмент для импорта любых данных из CSV и XML. Он поддерживает кастомные типы записей и таксономии, что идеально подходит для курсов, если они реализованы как CPT.

Преимущества:

  • Гибкая настройка импорта;
  • Поддержка пользовательских полей и изображений;
  • Возможность автоматического запуска импорта по расписанию;
  • Интуитивный интерфейс.

Feedzy RSS Feeds или WP RSS Aggregator для импорта из RSS

Если курсы публикуются в виде RSS-ленты, можно использовать плагины для агрегации RSS. Например, Feedzy RSS Feeds позволяет автоматически создавать записи из RSS-источников.

Они удобны для быстрого импорта, но менее гибкие для структурированных данных, чем WP All Import.

Пример создания кастомного импорта курсов из JSON API

Если ваш источник курсов предоставляет API с данными в формате JSON, можно написать кастомный скрипт для импорта. Рассмотрим пример, где курсы импортируются в кастомный тип записи course.

Сначала регистрируем тип записи, если он ещё не создан:

add_action('init', 'wpfreecourses_register_course_cpt');
function wpfreecourses_register_course_cpt() {
    $labels = [
        'name' => 'Курсы',
        'singular_name' => 'Курс',
    ];
    $args = [
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
        'supports' => ['title', 'editor', 'thumbnail', 'custom-fields'],
    ];
    register_post_type('course', $args);
}

Далее создаём функцию для получения данных и вставки в базу:

function wpfreecourses_import_courses_from_api() {
    $response = wp_remote_get('https://example.com/api/courses');
    if (is_wp_error($response)) {
        error_log('Ошибка получения курсов: ' . $response->get_error_message());
        return;
    }
    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);
    if (empty($data) || !is_array($data)) {
        error_log('Неверный формат данных от API');
        return;
    }
    foreach ($data as $course) {
        // Проверяем, есть ли уже курс с таким заголовком
        $existing = get_page_by_title($course['title'], OBJECT, 'course');
        if ($existing) {
            continue; // пропускаем дубли
        }
        $post_id = wp_insert_post([
            'post_title' => sanitize_text_field($course['title']),
            'post_content' => wp_kses_post($course['description']),
            'post_status' => 'publish',
            'post_type' => 'course'
        ]);
        if (!is_wp_error($post_id)) {
            if (!empty($course['image'])) {
                // Загрузим изображение и прикрепим к курсу
                wpfreecourses_set_post_thumbnail_from_url($post_id, $course['image']);
            }
            if (!empty($course['duration'])) {
                update_post_meta($post_id, 'duration', sanitize_text_field($course['duration']));
            }
        }
    }
}

Для загрузки изображения используем вспомогательную функцию:

function wpfreecourses_set_post_thumbnail_from_url($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');

    if (empty($image_url)) return;

    $tmp = download_url($image_url);
    if (is_wp_error($tmp)) return;

    $file = [
        'name' => basename($image_url),
        'tmp_name' => $tmp
    ];
    $attachment_id = media_handle_sideload($file, $post_id);

    if (is_wp_error($attachment_id)) {
        @unlink($tmp);
        return;
    }

    set_post_thumbnail($post_id, $attachment_id);
}

Теперь достаточно запускать wpfreecourses_import_courses_from_api() вручную или через WP-Cron для регулярного обновления курсов.

Настройка планировщика задач для автоматического обновления

Чтобы импорт происходил по расписанию, добавим задачу в WP-Cron:

add_action('wpfreecourses_cron_import_courses', 'wpfreecourses_import_courses_from_api');

function wpfreecourses_activate_cron() {
    if (!wp_next_scheduled('wpfreecourses_cron_import_courses')) {
        wp_schedule_event(time(), 'hourly', 'wpfreecourses_cron_import_courses');
    }
}
register_activation_hook(__FILE__, 'wpfreecourses_activate_cron');

function wpfreecourses_deactivate_cron() {
    $timestamp = wp_next_scheduled('wpfreecourses_cron_import_courses');
    wp_unschedule_event($timestamp, 'wpfreecourses_cron_import_courses');
}
register_deactivation_hook(__FILE__, 'wpfreecourses_deactivate_cron');

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

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

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

Для стабильной работы важно логировать ошибки и уведомлять администратора, если импорт не удался. Это можно сделать через error_log или отправку email с помощью wp_mail.

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

Если курсов много, импорт лучше выполнять пакетами, чтобы не перегружать сервер. Для этого разбейте данные на части и используйте WP-Cron или асинхронные запросы.

Использование плагинов для расширенных возможностей

Если вы хотите добавить отзывы или рейтинги к курсам, рассмотрите интеграцию с плагином Expert Review для удобного управления оценками пользователей.

Оптимальное использование Transients API в WordPress для кеширования данных
12.12.2025
WooCommerce: автоматическое удаление неактивных заказов по расписанию с помощью WP-Cron
29.06.2026
Как создать фильтры для курсов в WordPress
15.01.2026
WooCommerce: как автоматически изменять ставку НДС по типам товаров
09.07.2026
Как безопасно удалить старые версии плагинов WordPress и освободить место
09.02.2026