В WooCommerce со временем накапливается большое количество заказов, что может негативно сказаться на производительности сайта и размере базы данных. В стандартном функционале WordPress и WooCommerce нет возможности автоматически удалять заказы по определённым статусам и возрасту. В этой статье мы подробно рассмотрим, как настроить автоматическое удаление старых заказов WooCommerce по статусу с помощью пользовательского кода и плагинов.
Почему важно удалять старые заказы WooCommerce
Со временем база заказов WooCommerce может существенно вырасти. Это приводит к следующим проблемам:
- Увеличение размера базы данных, что замедляет запросы и бэкапы;
- Падение производительности административной панели;
- Усложнение аналитики и поиска нужных данных.
Удаление заказов со статусом «отменён» или «выполнен» старше определённого срока помогает поддерживать базу в порядке и улучшать скорость работы магазина.
Удаление заказов через плагин WPShop My Popup
Хотя плагин My Popup из WPShop не специализируется на управлении заказами, для подобных задач лучше использовать специализированные плагины. Например, Advanced Order Cleaner или WooCommerce Order Cleanup. Они позволят гибко настраивать удаление заказов по статусам и времени.
Однако, если вы хотите реализовать удаление заказов без сторонних плагинов, можно использовать кастомный PHP-код.
Реализация автоматического удаления заказов через код
Ниже приведён пример функционала, который можно добавить в файл functions.php вашей темы или создать отдельный плагин. Этот код удалит все заказы со статусом cancelled, старше 30 дней.
<?php
// Функция для удаления старых заказов Woocommerce
function wproot_delete_old_woocommerce_orders() {
if ( ! class_exists( 'WooCommerce' ) ) {
return; // WooCommerce не активен
}
global $wpdb;
$days = 30; // количество дней
$status = 'wc-cancelled'; // статус заказа
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Получаем ID заказов по статусу и дате
$order_ids = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
$status,
$date_threshold
) );
if ( ! empty( $order_ids ) ) {
foreach ( $order_ids as $order_id ) {
wp_delete_post( $order_id, true ); // Полное удаление
}
}
}
// Добавляем задачу в wp_cron для ежедневного запуска
function wproot_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wproot_daily_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wproot_daily_order_cleanup' );
}
}
add_action( 'wp', 'wproot_schedule_order_cleanup' );
add_action( 'wproot_daily_order_cleanup', 'wproot_delete_old_woocommerce_orders' );
?>
Этот код создает ежедневную задачу, которая удаляет заказы с отменённым статусом старше 30 дней. Вы можете изменить переменную $status на другие статусы WooCommerce: wc-completed, wc-failed и так далее.
Как проверить работу кода
Чтобы убедиться, что функция работает корректно, можно временно добавить логирование:
function wproot_delete_old_woocommerce_orders() {
if ( ! class_exists( 'WooCommerce' ) ) {
return;
}
global $wpdb;
$days = 30;
$status = 'wc-cancelled';
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$order_ids = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
$status,
$date_threshold
) );
if ( ! empty( $order_ids ) ) {
error_log( 'wproot: Удаляем заказов: ' . count( $order_ids ) );
foreach ( $order_ids as $order_id ) {
wp_delete_post( $order_id, true );
}
} else {
error_log( 'wproot: Нет заказов для удаления' );
}
}
Логи будут доступны в файле wp-content/debug.log, если включена отладка WordPress define('WP_DEBUG_LOG', true);.
Удаление заказов через WP-CLI
Для администраторов серверов с доступом к командной строке удобен способ удаления заказов через WP-CLI. Пример команды для удаления заказов со статусом отменён и старше 30 дней:
wp post delete $(wp post list --post_type=shop_order --post_status=wc-cancelled --date_query_column=post_date --before='30 days ago' --format=ids) --force
Этот способ позволяет быстро очистить базу без написания кода и подходит для разовых операций.
Выводы и рекомендации
Автоматизация удаления старых заказов в WooCommerce помогает поддерживать базу данных в порядке, улучшать производительность сайта и снижать нагрузку на сервер. Лучший способ зависит от вашей инфраструктуры и требований:
- Для регулярной автоматизации — используйте кастомный код с WP-Cron, как в нашем примере.
- Для единоразовой очистки — удобен WP-CLI.
- Если не хотите писать код — воспользуйтесь специализированными плагинами с гибкими настройками.
Обязательно создайте резервную копию перед удалением заказов и тщательно протестируйте код на тестовом сайте.