В современных проектах на 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, но с меньшими накладными расходами.