0 && $download_id === $studio_id) { $membership_tier = self::max_tier($membership_tier, Pricing::TIER_STUDIO); } else if ($pro_id > 0 && $download_id === $pro_id) { $membership_tier = self::max_tier($membership_tier, Pricing::TIER_PRO); } } if ($membership_tier === '') { return; } $customer_id = (int) ($order['customer_id'] ?? 0); $customer = $customer_id > 0 ? Orders::get_customer($customer_id) : null; $user_id = is_array($customer) ? (int) ($customer['user_id'] ?? 0) : 0; if ($user_id <= 0) { Orders::append_order_note($order_id, 'ToDownload_seller_membership_error: missing customer user_id'); return; } if (!user_can($user_id, 'edit_todownload_downloads')) { Orders::append_order_note($order_id, 'ToDownload_seller_membership_error: user is not a seller'); return; } $expires_at = self::compute_next_expiry_ymd($user_id); Pricing::set_seller_tier($user_id, $membership_tier, $expires_at); Orders::append_order_note($order_id, 'ToDownload_seller_membership_applied: tier=' . $membership_tier . ' expires=' . $expires_at . ' user_id=' . (int) $user_id); } private static function max_tier(string $a, string $b): string { $a = Pricing::normalize_tier($a); $b = Pricing::normalize_tier($b); if ($a === Pricing::TIER_STUDIO || $b === Pricing::TIER_STUDIO) { return Pricing::TIER_STUDIO; } if ($a === Pricing::TIER_PRO || $b === Pricing::TIER_PRO) { return Pricing::TIER_PRO; } return ''; } private static function compute_next_expiry_ymd(int $seller_user_id): string { $seller_user_id = (int) $seller_user_id; $now = time(); $base_ts = $now; $existing = (string) get_user_meta($seller_user_id, Pricing::USER_META_TIER_EXPIRES_AT, true); $existing = trim($existing); if ($existing !== '' && preg_match('/^\d{4}-\d{2}-\d{2}$/', $existing)) { $ts = strtotime($existing . ' 00:00:00 UTC'); if ($ts && $ts > $now) { $base_ts = (int) $ts; } } $next = $base_ts + (defined('YEAR_IN_SECONDS') ? YEAR_IN_SECONDS : (365 * DAY_IN_SECONDS)); return gmdate('Y-m-d', $next); } }