Проблема: накопление неактивных пользователей в WooCommerce
В магазинах на WooCommerce с большой базой клиентов часто накапливаются пользователи, которые не совершали покупок длительное время или не проявляют активности. Это приводит к увеличению размера базы данных, замедлению работы сайта и усложнению маркетинговых кампаний. Решение — автоматическое удаление таких пользователей по заданным критериям.
Диагностика: как определить неактивных покупателей
Для начала необходимо понять, кто именно считается неактивным покупателем. Обычно используют следующие критерии:
- Дата последнего заказа старше 1 года;
- Пользователь не заходил на сайт более 6 месяцев;
- Отсутствие активности в заказах (статус «завершён» или «выполнен» отсутствует);
- Пользователь не подписан на рассылки или не взаимодействует с сайтом.
В WooCommerce информация о заказах хранится в таблице wp_posts с типом записи shop_order, связь с пользователем — через post_author. Активность пользователя можно проверить по дате последнего заказа или дате последнего входа (если ведётся лог). Если логина нет, можно ориентироваться только на заказы.
Пошаговое решение: скрипт автоматического удаления неактивных покупателей
1. Создание функции для поиска неактивных пользователей
Пример функции, которая получает ID пользователей без заказов за последний год:
function get_inactive_customers( $months = 12 ) {
global $wpdb;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$months} months" ) );
$users = $wpdb->get_col( $wpdb->prepare(
"SELECT u.ID FROM {$wpdb->users} u
LEFT JOIN {$wpdb->prefix}posts p ON p.post_author = u.ID AND p.post_type = 'shop_order' AND p.post_status IN ('wc-completed', 'wc-processing') AND p.post_date > %s
WHERE p.ID IS NULL",
$date_threshold
) );
return $users;
}2. Функция удаления пользователей
Удаляем пользователей по ID вместе с метаданными:
function delete_inactive_customers() {
$users = get_inactive_customers( 12 ); // за 12 месяцев
foreach ( $users as $user_id ) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user( $user_id );
}
}3. Автоматизация через WP-Cron
Добавляем ежемесячное событие, чтобы очищать базу регулярно:
add_action( 'wp', function() {
if ( ! wp_next_scheduled( 'delete_inactive_customers_event' ) ) {
wp_schedule_event( time(), 'monthly', 'delete_inactive_customers_event' );
}
});
add_action( 'delete_inactive_customers_event', 'delete_inactive_customers' );Проверка результата после внедрения
- Проверьте список пользователей через phpMyAdmin или wp-cli:
wp user list --role=customer— количество должно уменьшиться; - В админке WordPress в разделе «Пользователи» убедитесь, что старые неактивные покупатели удалены;
- Запустите функцию вручную через wp-cli, чтобы протестировать:
wp eval 'delete_inactive_customers();'; - Просмотрите логи сервера на ошибки — если пользователей не удаляет, проверьте права и наличие пользователей с заказами.
Частые ошибки и как их исправить
- Удаляются активные пользователи: Проверьте правильность условий выборки и статусы заказов. Используйте только статусы
wc-completedиwc-processing. - Функция ничего не удаляет: Возможно, у всех пользователей есть хотя бы один заказ за последний год. Можно уменьшить порог в функции
get_inactive_customers(). - Пользователи с ролями, отличными от покупателя, удаляются: Добавьте проверку роли в запросе или фильтруйте результат функцией
get_userdata(). - WP-Cron не запускается: На хостинге может быть отключён WP-Cron. Запланируйте системное задание (cronjob) для вызова
wp-cron.php.
Практические советы по безопасности и производительности
- Перед удалением пользователей сделайте резервную копию базы данных.
- Добавьте журналирование, чтобы знать, кто и когда был удалён.
- Чтобы не нагружать базу, обрабатывайте пользователей партиями (например, по 50 за раз).
- Ограничьте права запуска функции только администраторам или через wp-cli.
- Для крупных магазинов с тысячами пользователей используйте WP-CLI-скрипты для пакетной обработки.
Сравнение способов удаления неактивных покупателей
| Метод | Плюсы | Минусы |
|---|---|---|
| PHP-скрипт с WP-Cron | Автоматизация, полный контроль над логикой | Нужно писать и тестировать код, зависимость от cron |
| Плагины очистки пользователей (например, Cleanup Users) | Простота, интерфейс | Могут не учитывать сложные условия заказов |
| Ручное удаление через админку | Простота, безопасность | Не подходит для больших баз, трудозатратно |