В крупных и средних сайтах на WordPress часто возникает задача – при удалении пользователя нужно автоматически отключать или отменять все его подписки. Это особенно актуально для сайтов с платным контентом, рассылками, подписками на курсы и другими сервисами, где активные подписки напрямую связаны с аккаунтом пользователя.
В этой статье разберём, как реализовать автоматическое отключение подписок при удалении пользователя с помощью собственных хуков WordPress, а также рассмотрим практические примеры интеграции с популярными плагинами подписок.
Почему важно автоматически отключать подписки при удалении пользователя
Если просто удалить пользователя из административной панели WordPress, то данные о его подписках могут остаться активными в базе данных. Это ведёт к нескольким проблемам:
- Платёжные системы продолжают списывать средства.
- Пользователь, удалённый из системы, может получать письма и уведомления.
- Накопление мусора в базе данных и потенциальные ошибки в работе сайта.
Чтобы этого избежать, нужно при удалении пользователя запускать автоматический процесс отключения всех связанных подписок.
Используем хук delete_user для отработки удаления
WordPress предоставляет хук delete_user, который вызывается при удалении пользователя. На основе этого хука можно добавить свой обработчик, который выполнит необходимые действия по отключению подписок.
Пример функции, которая будет вызвана при удалении пользователя:
function wpreset_delete_user_cancel_subscriptions($user_id) {
// Логика отключения подписок
// Например, получить все подписки пользователя и отключить их
}Регистрируем этот обработчик так:
add_action('delete_user', 'wpreset_delete_user_cancel_subscriptions');Получение подписок пользователя в WooCommerce Subscriptions
Если вы используете плагин WooCommerce Subscriptions (один из самых популярных для подписок), то для поиска подписок пользователя можно использовать следующий подход:
function wpreset_delete_user_cancel_subscriptions($user_id) {
if (!class_exists('WC_Subscriptions_Manager')) {
return; // Плагин подписок не активен
}
$subscriptions = wcs_get_users_subscriptions($user_id);
foreach ($subscriptions as $subscription) {
if ($subscription->has_status('active')) {
$subscription->cancel_order(); // Отменяем подписку
}
}
}Эта функция получает все подписки пользователя и отменяет активные.
Отключение подписок в плагине Paid Memberships Pro
Для других популярных плагинов подписок логика может отличаться. Например, в Paid Memberships Pro можно деактивировать уровень доступа или подписку через API плагина:
function wpreset_delete_user_cancel_subscriptions($user_id) {
if (!function_exists('pmpro_hasMembershipLevel')) {
return; // Плагин не активен
}
// Удаляем все уровни подписки у пользователя
$levels = pmpro_getMembershipLevelsForUser($user_id);
foreach ($levels as $level) {
pmpro_changeMembershipLevel(0, $user_id); // Снимаем уровень
}
}Рекомендации по автоматизации с помощью плагинов
Если вы не хотите писать код самостоятельно, рассмотрите плагины с поддержкой автоматизации:
- Clearfy Pro — плагин для оптимизации и управления функциями WordPress, в том числе автоматическими процессами.
- WPReset — для быстрого восстановления сайта, но может пригодиться для автоматизации и тестирования процессов удаления пользователей.
Также полезно комбинировать с плагинами для резервного копирования, чтобы быть уверенным в сохранности данных при массовых операциях.
Расширенный пример: логирование отмен подписок
Для контроля процессов стоит добавить логирование в функцию отмены подписок. Это поможет отслеживать ошибки и успешные операции.
function wpreset_delete_user_cancel_subscriptions($user_id) {
if (!class_exists('WC_Subscriptions_Manager')) {
error_log("[WPReset] Плагин WooCommerce Subscriptions не активен");
return;
}
$subscriptions = wcs_get_users_subscriptions($user_id);
if (empty($subscriptions)) {
error_log("[WPReset] Нет подписок для пользователя ID: $user_id");
return;
}
foreach ($subscriptions as $subscription) {
if ($subscription->has_status('active')) {
$subscription->cancel_order();
error_log("[WPReset] Отменена подписка ID: " . $subscription->get_id() . " для пользователя ID: $user_id");
}
}
}
add_action('delete_user', 'wpreset_delete_user_cancel_subscriptions');Особенности и подводные камни при работе с подписками
При реализации автоматической отмены подписок учитывайте:
- Кэш и задержки: иногда данные о подписках кэшируются, и отмена может не примениться мгновенно.
- Платёжные шлюзы: интеграция с платёжной системой должна корректно обрабатывать отмену, иначе деньги будут списываться.
- Права доступа: функция должна запускаться с достаточными правами.
- Резервное копирование: перед массовыми удалениями всегда делайте бэкап.
Как протестировать автоматическую отмену подписок
Для тестирования можно создать тестового пользователя с подпиской, затем удалить его через админку и проверить логи и состояние подписок. Также полезно использовать плагин WPReset для отката изменений при ошибках во время разработки.