В этой статье рассмотрим, как реализовать функционал автоматического создания отчетов по заказам в WordPress без использования WooCommerce. Такой подход будет полезен для сайтов, где заказы ведутся на базе кастомных типов записей или плагинов, отличных от WooCommerce.
Почему нужен автоматический отчет по заказам в WordPress
Ведение отчетности по заказам — важный этап в управлении бизнесом. Автоматизация этого процесса позволяет экономить время и минимизировать ошибки, возникающие при ручном сборе данных. Если вы не используете WooCommerce, стандартных инструментов для отчетов у вас нет, и приходится создавать их самостоятельно.
В статье мы покажем, как на базе собственного кастомного типа записей реализовать логику сбора данных и формирование отчетов, а также настроить планировщик задач для периодического создания файла с отчетом.
Создание кастомного типа записей для заказов
Для начала создадим тип записей, который будет хранить заказы. В functions.php вашей темы или в отдельном плагине добавьте следующий код:
function wporders_register_post_type_orders() {
$labels = array(
'name' => 'Заказы',
'singular_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'),
'has_archive' => false,
);
register_post_type('wporders_order', $args);
}
add_action('init', 'wporders_register_post_type_orders');Этот код создаст тип записей wporders_order, который мы будем использовать для добавления заказов. В качестве минимального набора поддерживаются заголовок и пользовательские поля.
Структура данных заказа и хранение мета-полей
Для каждого заказа важно хранить такие данные, как дата, сумма, статус, информация о покупателе. Их лучше хранить в мета-полях записи. Например:
order_date— дата создания заказаorder_amount— сумма заказаorder_status— статус (в обработке, завершен, отменен)customer_name— имя покупателяcustomer_email— email покупателя
Добавление и редактирование этих полей можно реализовать с помощью мета-боксов или плагинов типа Advanced Custom Fields, но в статье сосредоточимся на автоматическом отчете.
Функция создания отчета по заказам
Теперь перейдем к созданию функции, которая соберет заказы за определенный период и сформирует CSV-файл с отчетом.
function wporders_generate_orders_report($start_date, $end_date) {
// Формат даты в meta_query - timestamp
$args = array(
'post_type' => 'wporders_order',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => 'order_date',
'value' => array($start_date, $end_date),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
)
)
);
$orders_query = new WP_Query($args);
if (!$orders_query->have_posts()) {
return false; // Нет заказов за период
}
$filename = 'orders_report_' . date('Ymd_His') . '.csv';
$filepath = WP_CONTENT_DIR . '/uploads/' . $filename;
$file = fopen($filepath, 'w');
if (!$file) {
return false;
}
// Заголовки CSV
fputcsv($file, array('ID', 'Дата', 'Сумма', 'Статус', 'Имя клиента', 'Email клиента'));
while ($orders_query->have_posts()) {
$orders_query->the_post();
$order_id = get_the_ID();
$order_date = get_post_meta($order_id, 'order_date', true);
$order_amount = get_post_meta($order_id, 'order_amount', true);
$order_status = get_post_meta($order_id, 'order_status', true);
$customer_name = get_post_meta($order_id, 'customer_name', true);
$customer_email = get_post_meta($order_id, 'customer_email', true);
// Форматируем дату из timestamp
$order_date_formatted = date('Y-m-d H:i:s', $order_date);
fputcsv($file, array($order_id, $order_date_formatted, $order_amount, $order_status, $customer_name, $customer_email));
}
fclose($file);
wp_reset_postdata();
return $filepath;
}Функция принимает две даты в формате timestamp, выбирает заказы с датой в этом диапазоне и формирует CSV-файл с отчетом. Файл сохраняется в папку uploads.
Автоматизация создания отчета через WP-Cron
Чтобы отчет создавался регулярно, например, каждый день, настроим задачу WP-Cron.
function wporders_schedule_daily_report() {
if (!wp_next_scheduled('wporders_daily_report_event')) {
wp_schedule_event(strtotime('00:00:00'), 'daily', 'wporders_daily_report_event');
}
}
add_action('wp', 'wporders_schedule_daily_report');
function wporders_daily_report_callback() {
$yesterday_start = strtotime('yesterday 00:00:00');
$yesterday_end = strtotime('yesterday 23:59:59');
$report_path = wporders_generate_orders_report($yesterday_start, $yesterday_end);
if ($report_path) {
// Здесь можно реализовать отправку отчета по email или загрузку на сервер
}
}
add_action('wporders_daily_report_event', 'wporders_daily_report_callback');Этот код запустит функцию генерации отчета в полночь за предыдущий день. При необходимости можно добавить отправку файла на email или в облачное хранилище.
Пример отправки отчета по email
Для удобства можно отправлять отчет автоматически на почту менеджера. Для этого расширим функцию обратного вызова:
function wporders_daily_report_callback() {
$yesterday_start = strtotime('yesterday 00:00:00');
$yesterday_end = strtotime('yesterday 23:59:59');
$report_path = wporders_generate_orders_report($yesterday_start, $yesterday_end);
if ($report_path && file_exists($report_path)) {
$to = 'manager@example.com';
$subject = 'Отчет по заказам за вчера';
$message = 'В приложении находится отчет по заказам за вчерашний день.';
$headers = array('Content-Type: text/html; charset=UTF-8');
$attachments = array($report_path);
wp_mail($to, $subject, $message, $headers, $attachments);
}
}Не забудьте заменить manager@example.com на реальный адрес. Этот пример использует стандартную функцию WordPress wp_mail для отправки письма с прикрепленным отчетом.
Советы по безопасности и производительности
Создавая автоматические отчеты, учитывайте несколько важных моментов:
- Ограничьте права доступа к отчетам. Храните их в защищенной папке и не давайте прямых ссылок без авторизации.
- Оптимизируйте выборку данных. При большом количестве заказов используйте пагинацию или выборки по частям.
- Очистка старых файлов. Реализуйте удаление устаревших отчетов для экономии места.
- Обработка ошибок. Добавьте логирование ошибок создания и отправки отчетов, чтобы оперативно реагировать на проблемы.
Заключение
Мы рассмотрели, как создать автоматическое формирование отчетов по заказам в WordPress без WooCommerce с помощью кастомного типа записей, мета-полей, WP_Query и WP-Cron. Такой подход гибок и легко настраивается под любые задачи.
Если вы используете на сайте плагины для работы с заказами, например, WPRemark для управления комментариями к заказам или ABC Pagination для удобного вывода списков заказов, можно интегрировать отчетность с этими инструментами.