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:
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)
);