Автоматизация обработки заказов без WooCommerce в WordPress

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

Почему стоит создавать обработку заказов без WooCommerce

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

Создавая собственную систему, вы получите:

  • Легковесную и понятную структуру данных
  • Гибкость в настройке полей и логики обработки
  • Простоту в интеграции с внешними сервисами и API
  • Контроль над кодом без зависимости от обновлений сторонних плагинов

Создание пользовательского типа записей для заказов

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

<?php
function wporders_register_order_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' => 'В корзине заказы не найдены',
        'menu_name'          => 'Заказы'
    );

    $args = array(
        'labels'             => $labels,
        'public'             => false,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'capability_type'    => 'post',
        'hierarchical'       => false,
        'supports'           => array('title', 'editor'),
        'menu_position'      => 20,
        'menu_icon'          => 'dashicons-cart',
    );

    register_post_type('wporders_order', $args);
}
add_action('init', 'wporders_register_order_post_type');
?>

После добавления этого кода в файл functions.php или в свой плагин, в админке появится новый раздел «Заказы».

Добавление пользовательских полей для данных заказа

Заказ — это не просто заголовок и описание. Нам нужны поля для хранения информации о клиенте, товарах, сумме и статусе. Для этого можно использовать мета-поля.

Добавим мета-боксы с помощью функции add_meta_box:

function wporders_add_order_meta_boxes() {
    add_meta_box(
        'wporders_order_details',
        'Данные заказа',
        'wporders_order_meta_box_callback',
        'wporders_order',
        'normal',
        'high'
    );
}
add_action('add_meta_boxes', 'wporders_add_order_meta_boxes');

function wporders_order_meta_box_callback($post) {
    wp_nonce_field('wporders_save_order_meta', 'wporders_order_meta_nonce');

    $customer_name = get_post_meta($post->ID, '_wporders_customer_name', true);
    $customer_phone = get_post_meta($post->ID, '_wporders_customer_phone', true);
    $order_amount = get_post_meta($post->ID, '_wporders_order_amount', true);
    $order_status = get_post_meta($post->ID, '_wporders_order_status', true);

    echo '<p><label>Имя клиента:</label><br><input type="text" name="wporders_customer_name" value="' . esc_attr($customer_name) . '" style="width:100%" /></p>';
    echo '<p><label>Телефон клиента:</label><br><input type="text" name="wporders_customer_phone" value="' . esc_attr($customer_phone) . '" style="width:100%" /></p>';
    echo '<p><label>Сумма заказа:</label><br><input type="number" step="0.01" name="wporders_order_amount" value="' . esc_attr($order_amount) . '" style="width:100%" /></p>';
    echo '<p><label>Статус заказа:</label><br><select name="wporders_order_status" style="width:100%">';
    $statuses = array('Новый', 'В обработке', 'Завершён', 'Отменён');
    foreach ($statuses as $status) {
        $selected = selected($order_status, $status, false);
        echo '<option value="' . esc_attr($status) . '" ' . $selected . '>' . esc_html($status) . '</option>';
    }
    echo '</select></p>';
}

function wporders_save_order_meta($post_id) {
    if (!isset($_POST['wporders_order_meta_nonce']) || !wp_verify_nonce($_POST['wporders_order_meta_nonce'], 'wporders_save_order_meta')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    if (isset($_POST['wporders_customer_name'])) {
        update_post_meta($post_id, '_wporders_customer_name', sanitize_text_field($_POST['wporders_customer_name']));
    }
    if (isset($_POST['wporders_customer_phone'])) {
        update_post_meta($post_id, '_wporders_customer_phone', sanitize_text_field($_POST['wporders_customer_phone']));
    }
    if (isset($_POST['wporders_order_amount'])) {
        update_post_meta($post_id, '_wporders_order_amount', floatval($_POST['wporders_order_amount']));
    }
    if (isset($_POST['wporders_order_status'])) {
        update_post_meta($post_id, '_wporders_order_status', sanitize_text_field($_POST['wporders_order_status']));
    }
}
add_action('save_post', 'wporders_save_order_meta');

Теперь при создании или редактировании заказа вы сможете вводить необходимые данные.

Автоматизация изменения статуса заказа и уведомления

Чтобы не проверять вручную новые заказы, реализуем автоматическую обработку статусов и отправку уведомлений клиенту и администратору.

Обработка статусов и запуск действий

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

function wporders_handle_status_change($post_id) {
    if (get_post_type($post_id) !== 'wporders_order') {
        return;
    }

    $old_status = get_post_meta($post_id, '_wporders_order_status_old', true);
    $new_status = get_post_meta($post_id, '_wporders_order_status', true);

    if ($old_status === $new_status) {
        return;
    }

    // Сохраняем новый статус для следующей проверки
    update_post_meta($post_id, '_wporders_order_status_old', $new_status);

    // Пример: отправка уведомления при смене статуса
    if ($new_status === 'В обработке') {
        wporders_send_status_email($post_id, $new_status);
    }
}
add_action('save_post', 'wporders_handle_status_change', 20);

function wporders_send_status_email($post_id, $status) {
    $customer_email = get_post_meta($post_id, '_wporders_customer_email', true);
    if (empty($customer_email)) {
        return;
    }
    $subject = 'Статус вашего заказа изменён';
    $message = 'Ваш заказ #' . $post_id . ' теперь имеет статус: ' . $status;
    wp_mail($customer_email, $subject, $message);
}

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

Интеграция с внешними сервисами и API

Для автоматизации и масштабирования часто требуется передавать данные заказов во внешние CRM или ERP-системы. Добавим пример интеграции с REST API по событию создания заказа.

function wporders_send_order_to_api($post_id) {
    if (get_post_type($post_id) !== 'wporders_order') {
        return;
    }

    $customer_name = get_post_meta($post_id, '_wporders_customer_name', true);
    $customer_phone = get_post_meta($post_id, '_wporders_customer_phone', true);
    $order_amount = get_post_meta($post_id, '_wporders_order_amount', true);

    $data = array(
        'order_id' => $post_id,
        'customer_name' => $customer_name,
        'customer_phone' => $customer_phone,
        'amount' => $order_amount
    );

    $response = wp_remote_post('https://external-crm.example.com/api/orders', array(
        'method' => 'POST',
        'headers' => array('Content-Type' => 'application/json'),
        'body' => json_encode($data),
        'timeout' => 15
    ));

    if (is_wp_error($response)) {
        error_log('Ошибка отправки заказа в CRM: ' . $response->get_error_message());
    } else {
        // Можно обработать ответ, например, сохранить ID из CRM
    }
}
add_action('save_post_wporders_order', 'wporders_send_order_to_api', 10, 1);

Таким образом, при сохранении нового заказа данные будут автоматически отправляться во внешнюю систему.

Полезные плагины для расширения функционала заказов

Если вы хотите ускорить разработку или добавить дополнительные возможности, обратите внимание на плагины из набора WPSHOP. Например:

  • Clearfy Pro — для оптимизации и безопасности сайта
  • Expert Review — для сбора отзывов и оценок к заказам
  • WPRemark — расширенные комментарии и отзывы

Эти инструменты помогут улучшить пользовательский опыт и управляемость заказов.

Выводы и рекомендации по разработке

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

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

Добавление последовательных вариаций товара в WooCommerce
05.01.2026
Создание автоматических уведомлений о статусах заказов WooCommerce
24.12.2025
Интеграция WordPress с системой управления заказами 1С
27.12.2025
Кастомизация email уведомлений о статусах заказов в WooCommerce
10.01.2026
Как создать автоматический скрипт для обновления статусов заказов WooCommerce
09.02.2026