wordpress-turnstile

Wordpress paywall plugin
Log | Files | Refs | README | LICENSE

commit c0fe535acacf59524b005537cad28121472198e8
parent 8ddb877dc0bbbdb11998df8e756899045ac5760f
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sun,  2 Nov 2025 17:33:42 +0100

add logic to track when subscriptions expire and purge caches when that happens

Diffstat:
Madmin/class-price-category-admin.php | 13++++++++++++-
Mincludes/class-price-category.php | 13++++++++++++-
Mincludes/class-taler-merchant-api.php | 7+++++--
3 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/admin/class-price-category-admin.php b/admin/class-price-category-admin.php @@ -177,6 +177,8 @@ class Taler_Turnstile_Price_Category_Admin { check_admin_referer('taler_save_price_category'); + $subscriptions = Taler_Merchant_API::get_subscriptions(); + $label = isset($_POST['label']) ? sanitize_text_field($_POST['label']) : ''; $description = isset($_POST['description']) ? sanitize_textarea_field($_POST['description']) : ''; $prices = isset($_POST['prices']) ? $_POST['prices'] : array(); @@ -191,22 +193,31 @@ class Taler_Turnstile_Price_Category_Admin { // Validate and filter prices $filtered_prices = array(); + $sub_expirations = array(); + if (is_array($prices)) { foreach ($prices as $subscription_id => $currencies) { + $sub_active = FALSE; if (is_array($currencies)) { foreach ($currencies as $currency_code => $price) { if ($price !== '' && is_numeric($price) && $price >= 0) { $filtered_prices[$subscription_id][$currency_code] = floatval($price); + $sub_active = TRUE; } } } + if ($sub_active) { + $sub_expirations[$subscription_id] + = $subscriptions[$subscription_id]['valid_before_s']; + } } } $category_data = array( 'label' => $label, 'description' => $description, - 'prices' => $filtered_prices + 'prices' => $filtered_prices, + 'expirations' => $sub_expirations ); Taler_Price_Category::save($id, $category_data); diff --git a/includes/class-price-category.php b/includes/class-price-category.php @@ -86,9 +86,17 @@ class Taler_Price_Category { return array(); } + $max_cache = time() + 3600; $choices = array(); + $prices = $category['prices']; + $expirations = $category['expirations']; foreach ($category['prices'] as $token_family_slug => $currency_map) { + $expi = $expirations[$token_family_slug]; + if ($expi < time()) + continue; // already expired + $max_cache = min ($max_cache, + $expi); foreach ($currency_map as $currency_code => $price) { $inputs = array(); @@ -151,7 +159,10 @@ class Taler_Price_Category { } } - wp_cache_set($cache_key, $choices, 'taler_turnstile', 3600); + wp_cache_set($cache_key, + $choices, + 'taler_turnstile', + $max_cache - time()); return $choices; } diff --git a/includes/class-taler-merchant-api.php b/includes/class-taler-merchant-api.php @@ -204,15 +204,18 @@ class Taler_Merchant_API { $token_families = $jbody['token_families']; $now = time (); // in seconds since Epoch + $valid_before = ($family['valid_before']['t_s'] === 'never') + ? PHP_INT_MAX + : $family['valid_before']['t_s']; foreach ($token_families as $family) { if ( ($family['kind'] === 'subscription') && - ( ($family['valid_before']['t_s'] >= $now) || - ($family['valid_before']['t_s'] === 'never') ) && + ($valid_before >= $now) && ($family['valid_after']['t_s'] < $now) ) { $slug = $family['slug']; $result[$slug] = array( 'name' => $family['name'], 'label' => $slug, + 'valid_before_s' => $valid_before, 'description' => $family['description'], 'description_i18n' => ($family['description_i18n'] ?? NULL) );