Как очистить корзины пользователей по крону WordPress + WooCommerce?
Есть php код, который выполняет две функции:
1. Изменение статуса заказа на "completed" для всех заказов, которые находятся в статусе "processing". Это делается с помощью функции change_order_status_to_completed(). Эта функция использует WC_Order_Query для получения всех заказов в статусе "processing", а затем обновляет статус каждого заказа на "completed".
2. Очистка корзины пользователя. Функция clear_user_cart() получает список всех пользователей с помощью функции get_users() и затем очищает корзину каждого пользователя с помощью WC()->cart->empty_cart().
Обе функции затем регистрируются как крон-задачи с помощью функции wp_schedule_event(). Это означает, что они будут выполняться автоматически каждый день в 1:00.
function change_order_status_to_completed() { $orders = wc_get_orders( array( 'status' => 'processing', ) ); foreach ( $orders as $order ) { $order->update_status( 'completed' ); } } add_action( 'change_order_status_cron', 'change_order_status_to_completed' ); // Регистрация крон-задачи if ( ! wp_next_scheduled( 'change_order_status_cron' ) ) { $timestamp = strtotime('today 01:00'); wp_schedule_event( $timestamp, 'daily', 'change_order_status_cron' ); } function clear_user_cart() { $users = get_users(); foreach ( $users as $user ) { $user_id = $user->ID; $user_cart = WC()->cart->get_cart_for_user( $user_id ); foreach ( $user_cart as $cart_item_key => $cart_item ) { WC()->cart->remove_cart_item( $cart_item_key ); } } } add_action( 'clear_user_cart_cron', 'clear_user_cart' ); // Регистрация крон-задачи if ( ! wp_next_scheduled( 'clear_user_cart_cron' ) ) { $timestamp = strtotime('today 01:00'); wp_schedule_event( $timestamp, 'daily', 'clear_user_cart_cron' ); } |
function change_order_status_to_completed() { $orders = wc_get_orders( array( 'status' => 'processing', ) ); foreach ( $orders as $order ) { $order->update_status( 'completed' ); } } add_action( 'change_order_status_cron', 'change_order_status_to_completed' ); // Регистрация крон-задачи if ( ! wp_next_scheduled( 'change_order_status_cron' ) ) { $timestamp = strtotime('today 01:00'); wp_schedule_event( $timestamp, 'daily', 'change_order_status_cron' ); } function clear_user_cart() { $users = get_users(); foreach ( $users as $user ) { $user_id = $user->ID; $user_cart = WC()->cart->get_cart_for_user( $user_id ); foreach ( $user_cart as $cart_item_key => $cart_item ) { WC()->cart->remove_cart_item( $cart_item_key ); } } } add_action( 'clear_user_cart_cron', 'clear_user_cart' ); // Регистрация крон-задачи if ( ! wp_next_scheduled( 'clear_user_cart_cron' ) ) { $timestamp = strtotime('today 01:00'); wp_schedule_event( $timestamp, 'daily', 'clear_user_cart_cron' ); }
В итоге: крон задачи создаются, статусы заказов меняются в указанное время
Но корзины не очищаются!
Подскажите, что не так в функции clear_user_cart()
Дополнительно:
ВПшный крон работает только в том случае, если в это время кто-то будет обращаться к сайту. Т.е. будет траффик.
Если в час ночи его нет (что наверняка так), то про крон можно забыть.
И вообще для "забытых корзин" есть готовые плагины.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Очищать корзины пользователей по крону в WooCommerce можно, но не стоит смешивать это с автоматическим переводом заказов в
completed. Это разные задачи и разные риски. Заказы менять массово опасно: можно закрыть неоплаченные или спорные заказы.Если цель — очистить старые корзины/сессии WooCommerce, сначала посмотрите стандартные инструменты. WooCommerce хранит сессии в таблице
wp_woocommerce_sessionsи умеет чистить истёкшие сессии своим cron-событием. Иногда достаточно убедиться, что WP-Cron вообще работает.Для ручной очистки истёкших сессий:
if (class_exists('WC_Session_Handler')) { $handler = new WC_Session_Handler(); $handler->cleanup_sessions(); }
Можно повесить это на свой cron:
add_action('my_wc_cleanup_carts', function () { if (class_exists('WC_Session_Handler')) { $handler = new WC_Session_Handler(); $handler->cleanup_sessions(); } }); if (!wp_next_scheduled('my_wc_cleanup_carts')) { wp_schedule_event(time(), 'daily', 'my_wc_cleanup_carts'); }
Если нужно очищать не только истёкшие, а вообще старые корзины авторизованных пользователей, это сложнее: корзина может храниться в user meta/session, и нельзя удалять активные корзины покупателей. Делайте порог по времени, например старше 7-14 дней.
Для надёжности запускайте WordPress cron системным cron:
*/10 * * * * php /path/to/site/wp-cron.php > /dev/null 2>&1
Итог: для очистки корзин используйте cleanup sessions, а не прямое удаление из базы. Автоматическое завершение заказов держите отдельной функцией и включайте только если точно понимаете бизнес-логику оплаты и доставки.