Przejdź do głównej zawartości

Subskrypcje

Moduł subskrypcji dodaje produkty z płatnością cykliczną. Klienci kupują subskrypcje z ręcznym odnawianiem, a administrator zarządza nimi w WooCommerce.

  1. Administrator tworzy produkt typu “Subskrypcja” z cyklem i ceną
  2. Klient kupuje subskrypcję i opłaca pierwsze zamówienie
  3. Plugin tworzy subskrypcję ze statusem “Aktywna”
  4. Przed datą odnowienia klient otrzymuje przypomnienie e-mail
  5. W dniu odnowienia plugin tworzy zamówienie odnowienia
  6. Klient opłaca zamówienie odnowienia (ręczne odnowienie)
  7. Cykl powtarza się do anulowania subskrypcji

To wydanie nie ma ekranu ustawień subskrypcji. Moduł czyta opcję polski_subscriptions bezpośrednio, a ani strony administracyjne Polski, ani REST API PRO nie udostępniają dla niej formularza, więc wartości trzeba zapisać do opcji, na przykład przez WP-CLI:

Okno terminala
wp option patch update polski_subscriptions reminder_first_days 10

Tak samo włącza się sam moduł. Na stronie Polski > Moduły nie ma kafelka subskrypcji, więc klucz subscriptions w opcji polski_modules trzeba ustawić na 1.

Klucz Domyślnie Opis
show_on_single true Pokaż opcje subskrypcji na stronie produktu
reminder_first_days 14 Ile dni przed odnowieniem wysłać pierwsze przypomnienie
reminder_second_days 7 Ile dni przed odnowieniem wysłać drugie przypomnienie
allow_cancellation true Pozwól klientowi anulować subskrypcję w Moim koncie
allow_pause true Pozwól klientowi wstrzymać i wznowić subskrypcję
show_in_account / account_label true / Subskrypcje Sekcja w Moim koncie z listą subskrypcji
date_format d.m.Y Format daty w treściach dla klienta

E-maile z przypomnieniem i odnowieniem, nazwy statusów oraz opis cyklu mają własne klucze (reminder_subject, renewal_intro_text, status_paused i tak dalej). Wartości domyślne są w Polski\Pro\Service\SubscriptionService. Przypomnienia i zamówienia odnowienia działają na zdarzeniu cron polski_daily_maintenance.

  1. Przejdź do Produkty > Dodaj nowy
  2. Wybierz typ produktu: Subskrypcja
  3. Skonfiguruj cenę i cykl:
Pole Opis
Cena subskrypcji Kwota za okres rozliczeniowy
Okres rozliczeniowy Dzień / Tydzień / Miesiąc / Rok
Długość okresu Liczba okresów (np. 1 miesiąc, 3 miesiące)
Cena początkowa Opcjonalna - inna cena za pierwszy okres
Opłata aktywacyjna Opcjonalna - jednorazowa opłata przy pierwszym zamówieniu
Limit odnowień 0 = bez limitu, lub liczba odnowień
  1. Opublikuj produkt

Cena za pierwszy okres może być inna niż za kolejne. Zastosowania:

  • okres próbny za darmo lub po obniżonej cenie
  • promocyjna cena na start
  • opłata aktywacyjna + niższa cena cykliczna

Cena początkowa dotyczy tylko pierwszego zamówienia. Kolejne odnowienia mają standardową cenę.

Pending → Active → On Hold → Active → ...
→ Expired
→ Cancelled
Status Opis
Pending Oczekująca na opłacenie pierwszego zamówienia
Active Aktywna - klient ma dostęp do produktu
On Hold Wstrzymana - zamówienie odnowienia oczekuje na opłacenie
Expired Wygasła - liczba odnowień osiągnęła limit lub minął okres karencji
Cancelled Anulowana przez klienta lub administratora

Plugin obsługuje ręczne odnowienia:

  1. Plugin tworzy zamówienie odnowienia ze statusem “Oczekujące na płatność”
  2. Klient otrzymuje e-mail z linkiem do opłacenia zamówienia
  3. Klient opłaca zamówienie przez wybraną metodę płatności
  4. Po opłaceniu subskrypcja zostaje odnowiona na kolejny okres

Plugin sprawdza subskrypcje do odnowienia codziennie przez WP-Cron:

polski_daily_maintenance

Codzienne zadanie cron:

  • sprawdza subskrypcje do odnowienia
  • tworzy zamówienia odnowienia
  • zawiesza subskrypcje po okresie karencji
  • wygasza subskrypcje po osiągnięciu limitu odnowień

Plugin wysyła dwa przypomnienia e-mail przed datą odnowienia:

E-mail Kiedy Treść
Pierwsze przypomnienie 14 dni przed odnowieniem (konfigurowalne) Informacja o zbliżającym się odnowieniu, kwota, link do anulowania jednym kliknięciem
Drugie przypomnienie 7 dni przed odnowieniem (konfigurowalne) Ostatnie przypomnienie, kwota, link do anulowania i link do panelu
Zamówienie odnowienia W dniu odnowienia Zamówienie do opłacenia z linkiem do płatności
Subskrypcja wstrzymana Po upływie terminu płatności Informacja o wstrzymaniu, link do opłacenia
Subskrypcja wygasła Po upływie okresu karencji Informacja o wygaśnięciu, link do ponownego zakupu

Szablony e-maili można dostosować w WooCommerce > Ustawienia > E-maile.

Moduł dodaje sekcję w Moje konto pod adresem:

/moje-konto/polski-subscriptions/

Klient widzi tabelę z subskrypcjami:

Kolumna Opis
Produkt Nazwa produktu subskrypcyjnego
Status Aktualny status subskrypcji
Cena Kwota za okres
Następne odnowienie Data następnego odnowienia
Akcje Anuluj / Opłać odnowienie

Po kliknięciu w subskrypcję klient widzi:

  • pełne dane subskrypcji (produkt, cena, cykl, daty)
  • historię odnowień (lista zamówień powiązanych)
  • przycisk anulowania subskrypcji
  • przycisk opłacenia oczekującego odnowienia (jeśli dotyczy)

Klient może anulować aktywną subskrypcję w Moje konto. Anulowanie:

  • zmienia status subskrypcji na “Cancelled”
  • subskrypcja pozostaje aktywna do końca bieżącego opłaconego okresu
  • klient jest informowany o dacie zakończenia dostępu

Akcja wywoływana po zmianie statusu subskrypcji.

/**
* @param int $subscription_id ID subskrypcji
* @param string $new_status Nowy status
* @param string $old_status Poprzedni status
*/
do_action('polski_pro/subscription/status_changed', int $subscription_id, string $new_status, string $old_status);

Przykład:

add_action('polski_pro/subscription/status_changed', function (int $subscription_id, string $new_status, string $old_status): void {
if ($new_status === 'cancelled') {
$subscription = polski_pro_get_subscription($subscription_id);
// Wysłanie ankiety o powód rezygnacji
wp_mail(
$subscription->get_customer_email(),
'Szkoda, że odchodzisz',
'Powiedz nam, dlaczego anulujesz subskrypcję: https://example.com/ankieta'
);
}
}, 10, 3);

Akcja wywoływana po utworzeniu zamówienia odnowienia.

/**
* @param int $order_id ID zamówienia odnowienia
* @param int $subscription_id ID subskrypcji
*/
do_action('polski_pro/subscription/renewal_created', int $order_id, int $subscription_id);

Przykład:

add_action('polski_pro/subscription/renewal_created', function (int $order_id, int $subscription_id): void {
$order = wc_get_order($order_id);
$order->add_order_note(
sprintf('Zamówienie odnowienia dla subskrypcji #%d', $subscription_id)
);
}, 10, 2);

Akcja wywoływana po opłaceniu zamówienia odnowienia.

/**
* @param int $order_id ID zamówienia odnowienia
* @param int $subscription_id ID subskrypcji
*/
do_action('polski_pro/subscription/renewal_paid', int $order_id, int $subscription_id);

Silnik przypomnień (14 dni + 7 dni przed odnowieniem) udostępnia filtry i akcje do pełnej personalizacji:

// Change reminder windows in days
add_filter('polski_subscription_reminder_windows', fn ($w) => ['first' => 21, 'second' => 7, 'last' => 1]);
// Change the email subject
add_filter('polski_subscription_reminder_subject', fn ($subject, $sub, $type) => "[$type] $subject", 10, 3);
// Change the email body
add_filter('polski_subscription_reminder_body', fn ($body, $sub, $type) => $body . "\n\nDzieki!", 10, 3);
// Add custom headers, for example HTML mode
add_filter('polski_subscription_reminder_headers', fn () => ['Content-Type: text/html; charset=UTF-8']);
// Skip a reminder for a specific subscription
add_filter('polski_subscription_skip_reminder', fn ($skip, $sub) => $sub->productId === 42, 10, 2);
// Monitor reminder sends
add_action('polski_subscription_reminder_sent', fn ($sub, $type, $days) => error_log("Sent $type to $sub->email"), 10, 3);
add_action('polski_subscription_reminder_failed', fn ($sub, $type) => error_log("Failed $type"), 10, 2);

SubscriptionRepository::updateRecurringAmount() wykrywa zmianę kwoty i automatycznie wysyła e-mail do klienta z:

  • starą i nową kwotą,
  • datą wejścia zmiany w życie (następny cykl rozliczeniowy),
  • link one-click cancel (wymogi EU consumer protection).

Hooki:

// Monitor amount changes
add_action('polski_subscription_amount_changed', function (int $id, float $previous, float $next) {
error_log("Subscription $id: $previous -> $next");
}, 10, 3);
// Customise the email body
add_filter('polski_subscription_amount_change_body', fn ($body, $sub, $prev, $next) => $body, 10, 4);
// Monitor send result
add_action('polski_subscription_amount_change_notified', fn ($sub, $prev, $next, $sent) => null, 10, 4);

Przejdź do WooCommerce > Subskrypcje. Tabela zawiera:

  • ID subskrypcji
  • klient (imię, nazwisko, e-mail)
  • produkt
  • status
  • cena i cykl
  • data następnego odnowienia
  • data utworzenia

Dostępne filtry: status, produkt, data utworzenia.

Administrator może:

  • zmienić status subskrypcji
  • zmienić datę następnego odnowienia
  • zmienić cenę (wpływa na kolejne odnowienia)
  • dodać notatkę
  • przeglądać historię statusów i powiązane zamówienia
  1. Sprawdź, czy WP-Cron działa poprawnie (wp_cron jest wywoływany)
  2. Przejdź do Narzędzia > Scheduled Actions i sprawdź, czy zadanie polski_daily_maintenance jest zaplanowane
  3. Zweryfikuj, czy subskrypcja ma status “Active” i poprawną datę odnowienia
  1. Sprawdź konfigurację e-maili WooCommerce
  2. Zweryfikuj, czy szablon e-maila przypomnienia jest włączony
  3. Sprawdź ustawienie “Dni przypomnienia” - czy jest większe od 0
  1. Sprawdź, czy zamówienie odnowienia ma poprawne powiązanie z subskrypcją
  2. Zweryfikuj logi WooCommerce pod kątem błędów
  3. Sprawdź, czy bramka płatności poprawnie zmienia status zamówienia
Ta strona ma wyłącznie charakter informacyjny i nie stanowi porady prawnej. Przed wdrożeniem skonsultuj się z prawnikiem. Polski for WooCommerce jest oprogramowaniem open source (GPLv2) dostarczanym bez gwarancji.