Автоматизация создания заказов в WordPress без WooCommerce

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

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

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

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

Кроме того, это отличный способ изучить, как работать с пользовательскими типами записей, мета-полями и AJAX в WordPress.

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

Для начала создадим собственный тип записей «Заказы», который будет хранить всю информацию о заказах.

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,
        'capability_type' => 'post',
        'hierarchical' => false,
        'menu_position' => 25,
        'supports' => array('title','editor','custom-fields'),
        'menu_icon' => 'dashicons-cart',
    );
    register_post_type('wporders_order', $args);
}
add_action('init', 'wporders_register_order_post_type');

Этот код добавит в административную панель раздел «Заказы», где можно создавать и редактировать записи, соответствующие заказам.

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

Данные о клиенте, товаре, статусе и сумме удобно хранить в мета-полях. Для удобства можно использовать плагин Clearfy Pro для расширенного управления мета-полями и безопасности.

Пример добавления мета-полей с помощью кастомных функций:

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');

    $client_name = get_post_meta($post->ID, '_wporders_client_name', true);
    $order_amount = get_post_meta($post->ID, '_wporders_amount', true);
    $order_status = get_post_meta($post->ID, '_wporders_status', true);
    ?>
    <p><label>Имя клиента: <input type="text" name="wporders_client_name" value="<?php echo esc_attr($client_name); ?>" /></label></p>
    <p><label>Сумма заказа: <input type="number" step="0.01" name="wporders_amount" value="<?php echo esc_attr($order_amount); ?>" /></label></p>
    <p><label>Статус заказа: 
        <select name="wporders_status">
            <option value="new" <?php selected($order_status, 'new'); ?>>Новый</option>
            <option value="processing" <?php selected($order_status, 'processing'); ?>>В обработке</option>
            <option value="completed" <?php selected($order_status, 'completed'); ?>>Завершен</option>
        </select>
    </label></p>
    <?php
}

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_client_name'])) {
        update_post_meta($post_id, '_wporders_client_name', sanitize_text_field($_POST['wporders_client_name']));
    }
    if (isset($_POST['wporders_amount'])) {
        update_post_meta($post_id, '_wporders_amount', floatval($_POST['wporders_amount']));
    }
    if (isset($_POST['wporders_status'])) {
        update_post_meta($post_id, '_wporders_status', sanitize_text_field($_POST['wporders_status']));
    }
}
add_action('save_post', 'wporders_save_order_meta');

Автоматическое создание заказов из формы на сайте

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

Рассмотрим пример на основе стандартной формы с полями «Имя клиента» и «Сумма заказа».

Добавление формы в шаблон

<form id="wporders_order_form" method="post">
    <label>Имя клиента:<input type="text" name="client_name" required></label><br>
    <label>Сумма заказа:<input type="number" step="0.01" name="amount" required></label><br>
    <input type="submit" value="Создать заказ">
</form>
<div id="wporders_response"></div>

<script type="text/javascript">
    document.getElementById('wporders_order_form').addEventListener('submit', function(e) {
        e.preventDefault();
        var formData = new FormData(this);
        fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
            method: 'POST',
            credentials: 'same-origin',
            body: formData
        })
        .then(response => response.json())
        .then(data => {
            document.getElementById('wporders_response').innerText = data.message;
        })
        .catch(error => {
            document.getElementById('wporders_response').innerText = 'Ошибка при отправке заказа';
        });
    });
</script>

Обработка AJAX-запроса в functions.php

function wporders_handle_create_order() {
    if (!isset($_POST['client_name']) || !isset($_POST['amount'])) {
        wp_send_json_error(array('message' => 'Необходимые данные не переданы'));
    }

    $client_name = sanitize_text_field($_POST['client_name']);
    $amount = floatval($_POST['amount']);

    // Создаем заказ
    $order_id = wp_insert_post(array(
        'post_type' => 'wporders_order',
        'post_title' => 'Заказ от ' . $client_name,
        'post_status' => 'publish'
    ));

    if (is_wp_error($order_id) || !$order_id) {
        wp_send_json_error(array('message' => 'Ошибка при создании заказа'));
    }

    update_post_meta($order_id, '_wporders_client_name', $client_name);
    update_post_meta($order_id, '_wporders_amount', $amount);
    update_post_meta($order_id, '_wporders_status', 'new');

    wp_send_json_success(array('message' => 'Заказ успешно создан, ID: ' . $order_id));
}
add_action('wp_ajax_wporders_create_order', 'wporders_handle_create_order');
add_action('wp_ajax_nopriv_wporders_create_order', 'wporders_handle_create_order');

Обратите внимание, что в JS запрос должен содержать параметр action=wporders_create_order. Для этого можно добавить в форму скрытое поле:

<input type="hidden" name="action" value="wporders_create_order">

Расширение функционала: уведомления и смена статусов заказов

Для полноценного управления заказами полезно реализовать уведомления и возможность менять статус заказа из админки или через API.

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

Пример отправки email при создании заказа:

function wporders_notify_admin_new_order($post_id, $post, $update) {
    if ($post->post_type != 'wporders_order' || $update) {
        return;
    }
    $client_name = get_post_meta($post_id, '_wporders_client_name', true);
    $amount = get_post_meta($post_id, '_wporders_amount', true);

    $to = get_option('admin_email');
    $subject = 'Новый заказ от ' . $client_name;
    $message = "Поступил новый заказ:\n\nКлиент: $client_name\nСумма: $amount";

    wp_mail($to, $subject, $message);
}
add_action('wp_insert_post', 'wporders_notify_admin_new_order', 10, 3);

Для смены статуса можно добавить кастомные действия в админке или отдельный REST API endpoint, который позволит внешним сервисам менять статус заказа.

Пример REST API для обновления статуса

function wporders_register_api_routes() {
    register_rest_route('wporders/v1', '/order/(?P<id>\d+)/status', array(
        'methods' => 'POST',
        'callback' => 'wporders_api_update_order_status',
        'permission_callback' => function () {
            return current_user_can('edit_posts');
        }
    ));
}
add_action('rest_api_init', 'wporders_register_api_routes');

function wporders_api_update_order_status($request) {
    $id = $request->get_param('id');
    $status = sanitize_text_field($request->get_param('status'));
    $allowed_statuses = array('new', 'processing', 'completed');

    if (!in_array($status, $allowed_statuses)) {
        return new WP_Error('invalid_status', 'Недопустимый статус', array('status' => 400));
    }

    if (get_post_type($id) !== 'wporders_order') {
        return new WP_Error('invalid_order', 'Заказ не найден', array('status' => 404));
    }

    update_post_meta($id, '_wporders_status', $status);
    return array('success' => true, 'message' => 'Статус заказа обновлен');
}

Резюме и рекомендации по плагинам

Создание собственной системы заказов в WordPress без WooCommerce позволяет гибко настраивать логику под задачи проекта. Использование пользовательских типов записей, мета-полей и AJAX значительно упрощает процесс.

Для расширения функционала и удобства рекомендуем обратить внимание на плагины:

  • Clearfy Pro — для расширенного управления мета-полями и оптимизации.
  • WPRemark — для удобного управления комментариями и уведомлениями.

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

Добавление оповещений о проблемах с оплатой в WooCommerce: практическое руководство
14.01.2026
Интеграция WordPress с системой управления заказами 1С
27.12.2025
Как создать автоматический скрипт для обновления статусов заказов WooCommerce
09.02.2026
Как создать собственный тип записей в WordPress: практическое руководство
04.12.2025
Как сделать автоматическое сохранение заказов в WordPress без WooCommerce
23.01.2026