Как добавить автоматическое сохранение заказов в WordPress без WooCommerce

В современных проектах на WordPress часто возникает необходимость организовать сбор и хранение заказов без использования WooCommerce. Причины могут быть разные — нестандартная логика заказов, высокая нагрузка или интеграция с внешними системами. В этой статье мы разберём, как добавить автоматическое сохранение заказов в WordPress без WooCommerce, используя собственные типы записей и AJAX-запросы. Приведём конкретные примеры кода и объясним нюансы реализации.

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

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

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

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

Создание собственного типа записей «Заказы»

Первым шагом создадим кастомный тип записей для заказов. Это позволит хранить данные заказов в стандартной таблице wp_posts с типом wporders_order. Такой подход упрощает использование стандартных функций WordPress для работы с контентом.

function wporders_register_post_type_order() {
    $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,
        'supports'           => array('title'),
        'menu_position'      => 20,
        'menu_icon'          => 'dashicons-cart',
        'exclude_from_search'=> true,
        'has_archive'        => false,
    );

    register_post_type('wporders_order', $args);
}
add_action('init', 'wporders_register_post_type_order');

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

Автоматическое сохранение заказа с помощью AJAX

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

Пример формы заказа (HTML):

<form id="wporders-order-form">
  <input type="text" name="customer_name" placeholder="Имя" required>
  <input type="email" name="customer_email" placeholder="Email" required>
  <input type="text" name="product" placeholder="Товар" required>
  <button type="submit">Отправить заказ</button>
</form>

JS-код для отправки формы через AJAX (подключите внизу страницы или в отдельном файле):

jQuery(document).ready(function($) {
  $('#wporders-order-form').on('submit', function(e) {
    e.preventDefault();
    var data = $(this).serialize();

    $.post(wporders_ajax_obj.ajax_url, {
      action: 'wporders_save_order',
      data: data,
      nonce: wporders_ajax_obj.nonce
    }, function(response) {
      if (response.success) {
        alert('Заказ успешно сохранён! Номер заказа: ' + response.data.order_id);
        $('#wporders-order-form')[0].reset();
      } else {
        alert('Ошибка сохранения заказа: ' + response.data.message);
      }
    });
  });
});

Для передачи адреса AJAX и nonce добавьте в functions.php или в плагин:

function wporders_enqueue_scripts() {
    wp_enqueue_script('jquery');
    wp_register_script('wporders-main', get_stylesheet_directory_uri() . '/js/wporders-main.js', array('jquery'), null, true);
    wp_localize_script('wporders-main', 'wporders_ajax_obj', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce'    => wp_create_nonce('wporders_nonce')
    ));
    wp_enqueue_script('wporders-main');
}
add_action('wp_enqueue_scripts', 'wporders_enqueue_scripts');

Обработка AJAX-запроса и сохранение заказа в базу

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

function wporders_handle_save_order() {
    check_ajax_referer('wporders_nonce', 'nonce');

    parse_str($_POST['data'], $form_data);

    $customer_name  = sanitize_text_field($form_data['customer_name'] ?? '');
    $customer_email = sanitize_email($form_data['customer_email'] ?? '');
    $product        = sanitize_text_field($form_data['product'] ?? '');

    if (empty($customer_name) || empty($customer_email) || empty($product)) {
        wp_send_json_error(array('message' => 'Все поля обязательны для заполнения.'));
    }

    $order_post = array(
        'post_title'  => 'Заказ от ' . $customer_name,
        'post_type'   => 'wporders_order',
        'post_status' => 'publish'
    );

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

    // Сохраняем метаданные заказа
    update_post_meta($order_id, 'wporders_customer_name', $customer_name);
    update_post_meta($order_id, 'wporders_customer_email', $customer_email);
    update_post_meta($order_id, 'wporders_product', $product);
    update_post_meta($order_id, 'wporders_order_date', current_time('mysql'));

    wp_send_json_success(array('order_id' => $order_id));
}
add_action('wp_ajax_wporders_save_order', 'wporders_handle_save_order');
add_action('wp_ajax_nopriv_wporders_save_order', 'wporders_handle_save_order');

Таким образом, при отправке формы создаётся новая запись типа wporders_order, и в мета-полях сохраняются данные заказа.

Просмотр и фильтрация заказов в админке

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

function wporders_add_custom_columns($columns) {
    $columns = array(
        'cb'                 => '<input type="checkbox" />',
        'title'              => 'Название заказа',
        'customer_name'      => 'Имя клиента',
        'customer_email'     => 'Email клиента',
        'order_date'         => 'Дата заказа',
    );
    return $columns;
}
add_filter('manage_wporders_order_posts_columns', 'wporders_add_custom_columns');

function wporders_custom_columns_content($column, $post_id) {
    switch ($column) {
        case 'customer_name':
            echo esc_html(get_post_meta($post_id, 'wporders_customer_name', true));
            break;
        case 'customer_email':
            echo esc_html(get_post_meta($post_id, 'wporders_customer_email', true));
            break;
        case 'order_date':
            echo esc_html(get_post_meta($post_id, 'wporders_order_date', true));
            break;
    }
}
add_action('manage_wporders_order_posts_custom_column', 'wporders_custom_columns_content', 10, 2);

// Добавляем сортировку по дате заказа
function wporders_sortable_columns($columns) {
    $columns['order_date'] = 'order_date';
    return $columns;
}
add_filter('manage_edit-wporders_order_sortable_columns', 'wporders_sortable_columns');

function wporders_order_date_orderby($query) {
    if (!is_admin()) {
        return;
    }

    $orderby = $query->get('orderby');
    if ('order_date' === $orderby) {
        $query->set('meta_key', 'wporders_order_date');
        $query->set('orderby', 'meta_value');
    }
}
add_action('pre_get_posts', 'wporders_order_date_orderby');

Теперь в списке заказов в админке WordPress вы увидите имена клиентов, email и дату заказа с возможностью сортировки по дате.

Дополнительные рекомендации и плагины для управления заказами

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

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

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

Автоматическое удаление заказов WooCommerce старше 30 дней
28.05.2026
WooCommerce: как использовать кастомные метаданные для поиска и фильтров заказов
22.04.2026
Как создать настройки плагина в WordPress: подробное руководство
30.11.2025
Автоматическое сохранение заказов в WordPress без WooCommerce
31.01.2026
Автоматическая синхронизация заказов между WordPress и внешними системами
30.03.2026