В некоторых случаях на сайте WordPress требуется реализовать функционал импорта заказов из внешних систем или файлов без использования WooCommerce. Например, если вы работаете с кастомной системой заказов или интегрируете сайт с внешним сервисом. В этой статье мы подробно разберем, как создать автоматический импорт заказов в WordPress, используя стандартные методы и кастомный код.
Почему стоит реализовать импорт заказов без WooCommerce
WooCommerce — мощное решение для интернет-магазинов, но не всегда подходит для всех бизнес-задач. Если у вас нестандартная система заказов или нужна легкая интеграция с внешним сервисом, лучше написать собственный механизм импорта. Это позволит:
- Контролировать структуру данных заказов;
- Избежать избыточных функций WooCommerce;
- Оптимизировать производительность;
- Гибко настраивать логику обработки заказов.
Подготовка: создание собственного типа записей для заказов
Для хранения заказов нам нужно создать кастомный тип записей. Это позволит использовать стандартные возможности WordPress для хранения и управления заказами.
function wporders_register_order_post_type() {
$labels = [
'name' => 'Заказы',
'singular_name' => 'Заказ',
'menu_name' => 'Заказы',
'add_new' => 'Добавить заказ',
'add_new_item' => 'Добавить новый заказ',
'edit_item' => 'Редактировать заказ',
'new_item' => 'Новый заказ',
'view_item' => 'Просмотреть заказ',
'search_items' => 'Поиск заказов',
'not_found' => 'Заказы не найдены',
'not_found_in_trash' => 'Заказы не найдены в корзине',
];
$args = [
'labels' => $labels,
'public' => false,
'show_ui' => true,
'supports' => ['title', 'custom-fields'],
'capability_type' => 'post',
'has_archive' => false,
'menu_position' => 20,
'menu_icon' => 'dashicons-cart',
];
register_post_type('wporders_order', $args);
}
add_action('init', 'wporders_register_order_post_type');
Этот код создаст новый тип записей с названием «Заказы», который будет доступен в административной панели для управления.
Формат данных для импорта заказов
Чаще всего импортируют данные из CSV, XML или JSON. Для примера возьмем CSV с такими полями:
- order_id — уникальный идентификатор заказа
- customer_name — имя клиента
- customer_email — email клиента
- product_sku — артикул товара
- quantity — количество
- total_price — итоговая сумма
- order_date — дата заказа
Такой формат универсален и легко обрабатывается на PHP.
Создаем функцию автоматического импорта из CSV
Ниже пример функции для импорта заказов из файла CSV. Важно запускать этот код через крон-задачу или вручную по необходимости, чтобы не нагружать сервер.
function wporders_import_orders_from_csv($csv_filepath) {
if (!file_exists($csv_filepath) || !is_readable($csv_filepath)) {
return new WP_Error('file_error', 'Файл не найден или недоступен');
}
$header = null;
$data = [];
if (($handle = fopen($csv_filepath, 'r')) !== false) {
while (($row = fgetcsv($handle, 1000, ',')) !== false) {
if (!$header) {
$header = $row;
} else {
$data[] = array_combine($header, $row);
}
}
fclose($handle);
}
foreach ($data as $order) {
// Проверяем, существует ли заказ с таким order_id
$existing = get_posts([
'post_type' => 'wporders_order',
'meta_key' => 'order_id',
'meta_value' => $order['order_id'],
'post_status' => 'any',
'numberposts' => 1
]);
if ($existing) {
// Заказ уже импортирован, пропускаем
continue;
}
// Создаем заказ как запись
$post_id = wp_insert_post([
'post_type' => 'wporders_order',
'post_title' => 'Заказ #' . $order['order_id'] . ' от ' . $order['customer_name'],
'post_status' => 'publish'
]);
if (is_wp_error($post_id)) {
continue; // Ошибка при создании
}
// Добавляем мета-поля заказа
update_post_meta($post_id, 'order_id', sanitize_text_field($order['order_id']));
update_post_meta($post_id, 'customer_name', sanitize_text_field($order['customer_name']));
update_post_meta($post_id, 'customer_email', sanitize_email($order['customer_email']));
update_post_meta($post_id, 'product_sku', sanitize_text_field($order['product_sku']));
update_post_meta($post_id, 'quantity', intval($order['quantity']));
update_post_meta($post_id, 'total_price', floatval($order['total_price']));
update_post_meta($post_id, 'order_date', sanitize_text_field($order['order_date']));
}
return true;
}
Чтобы запустить импорт, вызовите функцию с путем к CSV файлу, например:
wporders_import_orders_from_csv(WP_CONTENT_DIR . '/uploads/orders.csv');
Организация автоматического запуска импорта через WP-Cron
Чтобы импорт происходил регулярно, например раз в сутки, подключаем нашу функцию к cron:
function wporders_schedule_import_event() {
if (!wp_next_scheduled('wporders_daily_import_event')) {
wp_schedule_event(time(), 'daily', 'wporders_daily_import_event');
}
}
add_action('wp', 'wporders_schedule_import_event');
add_action('wporders_daily_import_event', 'wporders_run_import');
function wporders_run_import() {
$csv_path = WP_CONTENT_DIR . '/uploads/orders.csv';
wporders_import_orders_from_csv($csv_path);
}
Такой подход позволит не запускать import вручную и гарантировать актуальность заказов.
Расширение функционала: уведомления и отчеты
После импорта полезно добавить уведомления для администратора о новых заказах. Например, отправим письмо с количеством добавленных заказов:
function wporders_import_orders_from_csv($csv_filepath) {
// ... код импорта
$imported_count = 0;
// В цикле добавляем:
// $imported_count++ после успешного создания заказа
// В конце функции:
if ($imported_count > 0) {
wp_mail(
get_option('admin_email'),
'Новые заказы импортированы',
"Импортировано новых заказов: " . $imported_count
);
}
return true;
}
Также можно создавать административные страницы для просмотра и фильтрации импортированных заказов, используя стандартные возможности WordPress.
Полезные плагины для облегчения импорта и управления заказами
Если хочется сэкономить время, можно использовать готовые решения:
- WPRemark — удобный плагин для работы с заказами и отзывами, который можно настроить для импорта;
- ABC Pagination — для удобного отображения большого объема заказов с пагинацией;
- Плагины для импорта CSV, например, WP All Import, но с кастомной доработкой под ваш тип записей.
Заключение по технической реализации
Импорт заказов в WordPress без WooCommerce — вполне выполнимая задача, если грамотно организовать хранение данных и обработку. Создание собственного типа записей и написание скриптов импорта дают максимальную гибкость и контроль. Рекомендуется тщательно валидировать и фильтровать входящие данные, использовать WP-Cron для автоматизации и добавлять уведомления для мониторинга процесса.