Subskrypcje
Moduł subskrypcji dodaje produkty z płatnością cykliczną. Klienci kupują subskrypcje z ręcznym odnawianiem, a administrator zarządza nimi w WooCommerce.
Jak to działa
Dział zatytułowany „Jak to działa”- Administrator oznacza zwykły produkt jako subskrypcję, z cyklem i ceną, na zakładce Polski Pro w edytorze produktu
- Klient kupuje subskrypcję i opłaca pierwsze zamówienie
- Plugin tworzy subskrypcję ze statusem “Aktywna”
- Przed datą odnowienia klient otrzymuje przypomnienie e-mail
- W dniu odnowienia plugin tworzy zamówienie odnowienia
- Klient opłaca zamówienie odnowienia (ręczne odnowienie)
- Cykl powtarza się do anulowania subskrypcji
Konfiguracja
Dział zatytułowany „Konfiguracja”Od Polski PRO 1.22.0 subskrypcje mają własny wiersz na ekranie Polski > Moduły (klucz modułu subscriptions). Tam włączasz moduł i tam ustawiasz wartości dla całego sklepu; zapis wiersza wpisuje je do opcji polski_subscriptions. Moduł jest domyślnie wyłączony.
Wiersz nie wystawia każdego klucza, który moduł czyta. Brakujące nadal można ustawić bezpośrednio na opcji, na przykład przez WP-CLI:
wp option patch update polski_subscriptions reminder_first_days 10Wartości per produkt (czy produkt w ogóle jest subskrypcją i jaki ma cykl) są na zakładce Polski Pro w edytorze produktu, zobacz Ustawienia per produkt.
Ustawienia czytane przez moduł
Dział zatytułowany „Ustawienia czytane przez moduł”| 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.
Tworzenie produktu subskrypcyjnego
Dział zatytułowany „Tworzenie produktu subskrypcyjnego”Nie ma typu produktu “Subskrypcja”. Subskrypcja to zwykły produkt z ustawionym na nim meta subskrypcji, a od Polski PRO 1.26.0 zapisuje je zakładka Polski Pro w polu danych produktu:
- Przejdź do Produkty > Dodaj nowy i zbuduj zwykły produkt. Jego cena to kwota pobierana za każdy okres rozliczeniowy.
- Otwórz zakładkę Polski Pro w polu Dane produktu i zaznacz Sell as a subscription.
- Skonfiguruj cykl:
| Pole | Klucz meta | Opis |
|---|---|---|
| Bill every | _polski_subscription_interval |
Liczba okresów między obciążeniami, co najmniej 1 |
| Billing period | _polski_subscription_period |
Dzień, tydzień, miesiąc albo rok; bez wartości miesiąc |
| Number of payments | _polski_subscription_length |
0 odnawia do czasu rezygnacji klienta |
| Sign-up fee | _polski_subscription_signup_fee |
Doliczana raz, przy pierwszej płatności |
| Trial days | _polski_subscription_trial_days |
Dni do pierwszego obciążenia, 0 oznacza brak okresu próbnego |
- Opublikuj produkt
Całą zakładkę opisuje Ustawienia per produkt.
Pierwsza płatność a kolejne
Dział zatytułowany „Pierwsza płatność a kolejne”Pierwszą płatność odróżniają od następnych dwa pola:
- Sign-up fee doliczana jest raz, tylko do pierwszego zamówienia.
- Trial days przesuwa pierwsze obciążenie o tyle dni, a subskrypcja startuje w statusie
trialzamiastactive.
Nie ma osobnego pola “cena początkowa”. Poza tym obowiązuje cena produktu, pobierana ponownie w każdym okresie rozliczeniowym.
Cykl życia subskrypcji
Dział zatytułowany „Cykl życia subskrypcji”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 |
Odnowienia
Dział zatytułowany „Odnowienia”Ręczne odnowienie
Dział zatytułowany „Ręczne odnowienie”Plugin obsługuje ręczne odnowienia:
- Plugin tworzy zamówienie odnowienia ze statusem “Oczekujące na płatność”
- Klient otrzymuje e-mail z linkiem do opłacenia zamówienia
- Klient opłaca zamówienie przez wybraną metodę płatności
- Po opłaceniu subskrypcja zostaje odnowiona na kolejny okres
Proces odnowienia
Dział zatytułowany „Proces odnowienia”Plugin sprawdza subskrypcje do odnowienia codziennie przez WP-Cron:
polski_daily_maintenanceCodzienne zadanie cron:
- sprawdza subskrypcje do odnowienia
- tworzy zamówienia odnowienia
- zawiesza subskrypcje po okresie karencji
- wygasza subskrypcje po osiągnięciu limitu odnowień
Przypomnienia e-mail
Dział zatytułowany „Przypomnienia e-mail”Plugin wysyła dwa przypomnienia e-mail przed datą odnowienia:
| 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.
Panel Moje konto
Dział zatytułowany „Panel Moje konto”Moduł dodaje sekcję w Moje konto pod adresem:
/moje-konto/polski-subscriptions/Lista subskrypcji
Dział zatytułowany „Lista subskrypcji”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 |
Szczegóły subskrypcji
Dział zatytułowany „Szczegóły subskrypcji”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)
Anulowanie subskrypcji
Dział zatytułowany „Anulowanie subskrypcji”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
polski_pro/subscription/status_changed
Dział zatytułowany „polski_pro/subscription/status_changed”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);polski_pro/subscription/renewal_created
Dział zatytułowany „polski_pro/subscription/renewal_created”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);polski_pro/subscription/renewal_paid
Dział zatytułowany „polski_pro/subscription/renewal_paid”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);Hooki przypomnień o odnowieniu (1.8.2+)
Dział zatytułowany „Hooki przypomnień o odnowieniu (1.8.2+)”Silnik przypomnień (14 dni + 7 dni przed odnowieniem) udostępnia filtry i akcje do pełnej personalizacji:
// Change reminder windows in daysadd_filter('polski_subscription_reminder_windows', fn ($w) => ['first' => 21, 'second' => 7, 'last' => 1]);
// Change the email subjectadd_filter('polski_subscription_reminder_subject', fn ($subject, $sub, $type) => "[$type] $subject", 10, 3);
// Change the email bodyadd_filter('polski_subscription_reminder_body', fn ($body, $sub, $type) => $body . "\n\nDzieki!", 10, 3);
// Add custom headers, for example HTML modeadd_filter('polski_subscription_reminder_headers', fn () => ['Content-Type: text/html; charset=UTF-8']);
// Skip a reminder for a specific subscriptionadd_filter('polski_subscription_skip_reminder', fn ($skip, $sub) => $sub->productId === 42, 10, 2);
// Monitor reminder sendsadd_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);Powiadomienia o zmianie ceny (1.8.3+)
Dział zatytułowany „Powiadomienia o zmianie ceny (1.8.3+)”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 changesadd_action('polski_subscription_amount_changed', function (int $id, float $previous, float $next) { error_log("Subscription $id: $previous -> $next");}, 10, 3);
// Customise the email bodyadd_filter('polski_subscription_amount_change_body', fn ($body, $sub, $prev, $next) => $body, 10, 4);
// Monitor send resultadd_action('polski_subscription_amount_change_notified', fn ($sub, $prev, $next, $sent) => null, 10, 4);Panel administracyjny
Dział zatytułowany „Panel administracyjny”Lista subskrypcji
Dział zatytułowany „Lista subskrypcji”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.
Edycja subskrypcji
Dział zatytułowany „Edycja subskrypcji”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
Najczęstsze problemy
Dział zatytułowany „Najczęstsze problemy”Zamówienia odnowienia nie są tworzone
Dział zatytułowany „Zamówienia odnowienia nie są tworzone”- Sprawdź, czy WP-Cron działa poprawnie (
wp_cronjest wywoływany) - Przejdź do Narzędzia > Scheduled Actions i sprawdź, czy zadanie
polski_daily_maintenancejest zaplanowane - Zweryfikuj, czy subskrypcja ma status “Active” i poprawną datę odnowienia
Klient nie otrzymuje przypomnień
Dział zatytułowany „Klient nie otrzymuje przypomnień”- Sprawdź konfigurację e-maili WooCommerce
- Zweryfikuj, czy szablon e-maila przypomnienia jest włączony
- Sprawdź ustawienie “Dni przypomnienia” - czy jest większe od 0
Subskrypcja nie zmienia statusu po opłaceniu
Dział zatytułowany „Subskrypcja nie zmienia statusu po opłaceniu”- Sprawdź, czy zamówienie odnowienia ma poprawne powiązanie z subskrypcją
- Zweryfikuj logi WooCommerce pod kątem błędów
- Sprawdź, czy bramka płatności poprawnie zmienia status zamówienia