WordPress, как автоматически менять роль пользователя по истечению времени?

Ссылка скопирована
1 ответ

Здравствуйте! Возможно кто то сталкивался с такой задачей, когда на Wordpress, при покупке на Woocommerce автоматически меняется роль пользователя, и они получает доступ к закрытому контенту, но есть один нюанс, необходимо чтобы эта роль, и соответственно доступ к закрытому контенту был временный, например задать для пользователя, что его новая роль будет действовать 3 дня.. Есть ли какие то плагины, которые способны задавать временные роли для пользователя?.. перерыл в поисковике, но ничего подобного не нашел..

Я использовал Ultimate Member, позволяющий создавать произвольные роли пользователей
User Access Manager, чтобы задавать права доступа к закрытому контенту в привязке к ролям пользователей.

Дополнительно:

Ответы:

Как вариант:

1. Берем дату создания заказа и определяем Юзера его оплатившего.
2. Вешаете на Cron событие, которое будет проверять прошел ли нужный срок с момента заказа, если да - меняем роль.

Вам понадобиться функция wp_update_user(), опыт с Cron, ну и знание бека разумеется)

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Редакция по БД Ответ

Такую задачу можно решить без постоянного 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('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');
});

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('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');
    }
});

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 вполне подходит.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно