WordPress, как автоматически менять роль пользователя по истечению времени?
Здравствуйте! Возможно кто то сталкивался с такой задачей, когда на Wordpress, при покупке на Woocommerce автоматически меняется роль пользователя, и они получает доступ к закрытому контенту, но есть один нюанс, необходимо чтобы эта роль, и соответственно доступ к закрытому контенту был временный, например задать для пользователя, что его новая роль будет действовать 3 дня.. Есть ли какие то плагины, которые способны задавать временные роли для пользователя?.. перерыл в поисковике, но ничего подобного не нашел..
Я использовал Ultimate Member, позволяющий создавать произвольные роли пользователей
User Access Manager, чтобы задавать права доступа к закрытому контенту в привязке к ролям пользователей.
Дополнительно:
Ответы:
Как вариант:
1. Берем дату создания заказа и определяем Юзера его оплатившего.
2. Вешаете на Cron событие, которое будет проверять прошел ли нужный срок с момента заказа, если да - меняем роль.
Вам понадобиться функция wp_update_user(), опыт с Cron, ну и знание бека разумеется)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Такую задачу можно решить без постоянного cron-сканирования всех пользователей: при успешной оплате заказа выдавать роль и сохранять timestamp окончания доступа, а дальше запланировать одноразовое событие WP-Cron для конкретного пользователя.
add_action('woocommerce_order_status_completed', function ($order_id) { $order = wc_get_order($order_id); if (! $order || ! $order->get_user_id()) { return; } $user_id = $order->get_user_id(); $expires = time() + 3 * DAY_IN_SECONDS; $user = new WP_User($user_id); $user->add_role('paid_access'); update_user_meta($user_id, 'paid_access_expires', $expires); if (! wp_next_scheduled('remove_paid_access_role', [$user_id])) { wp_schedule_single_event($expires, 'remove_paid_access_role', [$user_id]); } });
Снятие роли:
add_action('remove_paid_access_role', function ($user_id) { $expires = (int) get_user_meta($user_id, 'paid_access_expires', true); if ($expires > time()) { return; } $user = new WP_User($user_id); $user->remove_role('paid_access'); });
Важный момент: WP-Cron срабатывает при посещениях сайта. Если доступ должен сниматься строго по времени, настройте системный cron на вызов
wp-cron.php. Если пользователь может купить доступ повторно до окончания срока, нужно продлевать дату и пересоздавать событие.Да, временный доступ лучше делать не постоянной сменой роли «навсегда», а хранить дату окончания доступа в meta пользователя и проверять её при входе или по cron. Роль можно менять при покупке, но обязательно нужно запомнить, когда её вернуть обратно.
Пример логики после успешной оплаты WooCommerce:
add_action('woocommerce_order_status_completed', function ($order_id) { $order = wc_get_order($order_id); if (! $order || ! $order->get_user_id()) { return; } $user_id = $order->get_user_id(); $user = new WP_User($user_id); $user->set_role('premium_user'); update_user_meta($user_id, '_premium_until', time() + 3 * DAY_IN_SECONDS); });
Дальше нужно регулярно проверять истечение срока. Например, при авторизации пользователя:
add_action('init', function () { if (! is_user_logged_in()) { return; } $user_id = get_current_user_id(); $until = (int) get_user_meta($user_id, '_premium_until', true); if ($until && $until < time()) { $user = new WP_User($user_id); $user->set_role('subscriber'); delete_user_meta($user_id, '_premium_until'); } });
Для продакшена лучше проверять не только на
init, но и через WP-Cron раз в час/день, чтобы доступ снимался даже если пользователь не заходит. Если у вас подписки, не пишите это с нуля: смотрите WooCommerce Subscriptions, Paid Memberships Pro, Restrict Content Pro или похожие membership-плагины. Если нужна разовая покупка на 3 дня, кастомный код с user_meta вполне подходит.