Если вы создаёте сайт на WordPress с функцией заказов, но не хотите использовать WooCommerce, часто возникает задача — автоматическое сохранение заказов в базе данных с возможностью их дальнейшей обработки и отображения. В этой статье я подробно расскажу, как реализовать такой функционал с помощью собственного кода и минимального набора плагинов.
Почему нужно автоматическое сохранение заказов вне WooCommerce
WooCommerce — мощный и удобный плагин, но он может быть избыточным или слишком сложным для простых сайтов с заказами. В ряде случаев требуется кастомное решение, которое лучше адаптируется под конкретные задачи, например, если вы принимаете заказы на услуги, бронирования или нестандартные товары.
Автоматическое сохранение заказов позволяет:
- Обеспечить надежное хранение данных без потери в случае сбоев;
- Автоматизировать уведомления и обработку заказов;
- Гибко настраивать логику работы с заказами;
- Избавиться от избыточного функционала WooCommerce.
Рассмотрим вариант создания пользовательского типа записей для заказов и автоматическую обработку формы с заказом.
Создание пользовательского типа записей «Заказы» в WordPress
Для начала создадим в WordPress тип записей wporders_order для хранения заказов. Это позволит удобно работать с ними через админку и программно.
add_action('init', 'wporders_register_order_post_type');
function wporders_register_order_post_type() {
$labels = array(
'name' => 'Заказы',
'singular_name' => 'Заказ',
'menu_name' => 'Заказы',
'add_new' => 'Добавить заказ',
'add_new_item' => 'Добавить новый заказ',
'edit_item' => 'Редактировать заказ',
'new_item' => 'Новый заказ',
'view_item' => 'Просмотреть заказ',
'search_items' => 'Искать заказы',
'not_found' => 'Заказы не найдены',
'not_found_in_trash' => 'В корзине заказы не найдены'
);
$args = array(
'labels' => $labels,
'public' => false,
'show_ui' => true,
'supports' => array('title', 'custom-fields'),
'capability_type' => 'post',
'has_archive' => false
);
register_post_type('wporders_order', $args);
}Код добавьте в файл functions.php вашей темы или в собственный плагин. После этого в админке появится раздел «Заказы».
Создание формы заказа и обработка данных
Далее создадим форму на фронтенде, которая будет собирать данные и отправлять их на сервер для сохранения.
<form method="post" action="">
<label>Имя:</label>
<input type="text" name="wporders_name" required>
<label>Email:</label>
<input type="email" name="wporders_email" required>
<label>Товар:</label>
<input type="text" name="wporders_product" required>
<input type="submit" name="wporders_submit" value="Отправить заказ">
</form>Обработка формы и сохранение заказа в базе:
add_action('init', 'wporders_handle_order_form');
function wporders_handle_order_form() {
if (!empty($_POST['wporders_submit'])) {
$name = sanitize_text_field($_POST['wporders_name']);
$email = sanitize_email($_POST['wporders_email']);
$product = sanitize_text_field($_POST['wporders_product']);
$post_data = array(
'post_type' => 'wporders_order',
'post_title' => 'Заказ от ' . $name,
'post_status' => 'publish'
);
$post_id = wp_insert_post($post_data);
if ($post_id) {
update_post_meta($post_id, 'wporders_name', $name);
update_post_meta($post_id, 'wporders_email', $email);
update_post_meta($post_id, 'wporders_product', $product);
// Можно добавить отправку уведомления по email
wp_mail($email, 'Ваш заказ принят', 'Спасибо за заказ!');
// Редирект после успешного сохранения
wp_redirect(add_query_arg('order_status', 'success', wp_get_referer()));
exit;
}
}
}Этот код проверит форму, сохранит заказ как пост типа wporders_order, добавит метаданные и отправит пользователю письмо с подтверждением.
Добавление статусов заказов и их автоматическое обновление
Для удобства добавим статусы заказов, чтобы можно было отслеживать этапы обработки. Для этого используем таксономию или пользовательские поля.
Пример добавления статусов через пользовательское поле wporders_status:
- new — новый заказ;
- processing — в обработке;
- completed — выполнен;
- cancelled — отменён.
Можно создавать простую функцию для смены статуса программно:
function wporders_update_order_status($order_id, $new_status) {
$allowed_statuses = array('new', 'processing', 'completed', 'cancelled');
if (in_array($new_status, $allowed_statuses)) {
update_post_meta($order_id, 'wporders_status', $new_status);
}
}Автоматически менять статус можно, например, после оплаты через интеграцию с платежной системой или вручную в админке.
Использование плагина Clearfy Pro для ускорения работы с заказами
Для оптимизации и повышения безопасности сайта с пользовательскими заказами рекомендую обратить внимание на плагин Clearfy Pro. Он позволяет отключать ненужные функции WordPress, ускорять загрузку страниц и защищать данные заказов.
Вывод заказов на сайте и фильтрация
Для отображения заказов на странице сайта используйте WP_Query с нужными параметрами:
$args = array(
'post_type' => 'wporders_order',
'meta_key' => 'wporders_status',
'meta_value' => 'new', // например, новые заказы
'posts_per_page' => 10
);
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
$name = get_post_meta(get_the_ID(), 'wporders_name', true);
$product = get_post_meta(get_the_ID(), 'wporders_product', true);
echo '<li>' . esc_html($name) . ': ' . esc_html($product) . '</li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo 'Заказы не найдены';
}Можно добавить пагинацию с помощью плагина ABC Pagination для удобства навигации.
Заключение
Автоматическое сохранение заказов вне WooCommerce — вполне реализуемая задача с помощью пользовательского типа записей, обработки форм и метаданных. Такой подход даёт свободу в настройке и упрощает работу с заказами на нестандартных сайтах. Используйте примеры кода из статьи как основу и дополняйте их под свои нужды.