Для многих проектов на 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 — для удобного управления комментариями и уведомлениями.
Такой подход позволит создать удобный и легкий механизм заказов, который легко интегрируется с существующей инфраструктурой и масштабируется под будущие задачи.