diff --git a/inc/helpers/aksrt-pay.php b/inc/helpers/aksrt-pay.php index 4ade0008..4884857d 100644 --- a/inc/helpers/aksrt-pay.php +++ b/inc/helpers/aksrt-pay.php @@ -1457,20 +1457,12 @@ if (!function_exists('aksrt_get_paid_download_actions_html')) { return '
' . esc_html__('暂无可下载资源', 'aksrt') . '
'; } - // 下载总开关关闭 = 直连模式:按钮直接输出原始地址,不走本站中转链接。 - $direct_download = class_exists('\AKSRT\Content\Download') - && !\AKSRT\Content\Download::get_instance()->is_enabled(); - $buttons = ''; foreach ($downloads as $index => $download) { if (!is_array($download)) { continue; } $url = (string) ($download['url'] ?? ''); - if ($direct_download && $url === '') { - // 直连模式没有可用的原始地址,空源不渲染。 - continue; - } $label = trim((string) ($download['label'] ?? '')); $service = function_exists('aksrt_detect_cloud_service') ? aksrt_detect_cloud_service($url) @@ -1489,13 +1481,8 @@ if (!function_exists('aksrt_get_paid_download_actions_html')) { $copy_label = $extract_code !== '' ? $extract_code : ($copy_key !== '' ? $copy_key : __('更多内容', 'aksrt')); $buttons .= '
'; - if ($direct_download) { - $buttons .= ''; - $buttons .= '' . esc_html($label) . ''; - } else { - $buttons .= ''; - } + $buttons .= ''; if ($copy_value !== '') { $buttons .= ''; } elseif ($extract_code !== '') { diff --git a/src/Content/Download.php b/src/Content/Download.php index 1d7aa87c..a7dea8b2 100644 --- a/src/Content/Download.php +++ b/src/Content/Download.php @@ -12,11 +12,12 @@ class Download { const TOKEN_LEN = 48; const QUERY_VAR = 'aksrt_dl_token'; - // Hardened fallbacks used when the aksrt_download_config option is - // missing or contains values the admin validation would reject. - const FALLBACK_ENDPOINT = 'download'; - const FALLBACK_MAX_USES = 1; - const FALLBACK_TTL_MINUTES = 10; + // Fixed relay configuration. The admin download-config settings page was + // removed, so these constants are the single source of truth for the + // site-routed download system (endpoint, per-token uses, TTL). + const ENDPOINT = 'download'; + const MAX_USES = 1; + const TTL_MINUTES = 10; private static $instance = null; @@ -69,51 +70,17 @@ class Download { } /** - * Master switch for the site-routed download system (aksrt_download_config - * "enabled", default true). When off, download buttons render the raw - * source URLs directly and every token route/endpoint below stays dormant. - */ - public function is_enabled(): bool { - $cfg = get_option('aksrt_download_config', []); - if (!is_array($cfg)) { - return true; - } - return !isset($cfg['enabled']) || !empty($cfg['enabled']); - } - - /** - * Effective download settings (aksrt_download_config), clamped so a - * corrupted option can never break routing or accounting. + * Effective download settings for the fixed relay configuration. */ private function config(): array { - $cfg = get_option('aksrt_download_config', []); - if (!is_array($cfg)) { - $cfg = []; - } - - $alias = trim((string) ($cfg['url_alias'] ?? self::FALLBACK_ENDPOINT)); - if ($alias === '' || strlen($alias) > 48 || !preg_match('/^[A-Za-z0-9_-]+$/', $alias)) { - $alias = self::FALLBACK_ENDPOINT; - } - - $max_uses = isset($cfg['default_max_uses']) ? (int) $cfg['default_max_uses'] : self::FALLBACK_MAX_USES; - $max_uses = min(100, max(1, $max_uses)); - - $ttl_minutes = isset($cfg['ttl_minutes']) ? (int) $cfg['ttl_minutes'] : self::FALLBACK_TTL_MINUTES; - $ttl_minutes = min(1440, max(1, $ttl_minutes)); - return [ - 'endpoint' => $alias, - 'max_uses' => $max_uses, - 'ttl' => $ttl_minutes * MINUTE_IN_SECONDS, + 'endpoint' => self::ENDPOINT, + 'max_uses' => self::MAX_USES, + 'ttl' => self::TTL_MINUTES * MINUTE_IN_SECONDS, ]; } public function register_rewrite(): void { - if (!$this->is_enabled()) { - return; - } - add_rewrite_rule( '^' . preg_quote($this->config()['endpoint'], '/') . '/([A-Za-z0-9]{1,64})/?$', 'index.php?' . self::QUERY_VAR . '=$matches[1]', @@ -122,12 +89,11 @@ class Download { } /** - * Re-flush rewrite rules whenever the configured alias or the master - * switch changes, using the same version-marker approach as Auth\Router. + * Re-flush rewrite rules on theme version changes, using the same + * version-marker approach as Auth\Router. */ public function maybe_flush_rewrite(): void { - $endpoint = $this->is_enabled() ? $this->config()['endpoint'] : 'off'; - $version = AKSRT_VERSION . ':download-endpoint:' . $endpoint; + $version = AKSRT_VERSION . ':download-endpoint:' . self::ENDPOINT; if ((string) get_option('aksrt_dl_rewrite_version') !== $version) { flush_rewrite_rules(false); update_option('aksrt_dl_rewrite_version', $version); @@ -140,10 +106,6 @@ class Download { } public function register_routes(): void { - if (!$this->is_enabled()) { - return; - } - register_rest_route('aksrt/v1', '/download/request', [ 'methods' => 'POST', 'callback' => [$this, 'rest_request'], @@ -257,11 +219,6 @@ class Download { $this->fail_410(); } - // Master switch off: the token system is retired, links are dead ends. - if (!$this->is_enabled()) { - $this->fail_410(); - } - global $wpdb; $table = \AKSRT\Core\DBMigrator::table('dl_token'); if (!$table) $this->fail_410(); diff --git a/templates/parts/resource-download-box.php b/templates/parts/resource-download-box.php index c69ab822..8bbcf93e 100644 --- a/templates/parts/resource-download-box.php +++ b/templates/parts/resource-download-box.php @@ -27,9 +27,6 @@ if ($pay_type !== 'download' || empty($downloads)) { $is_resource_context = function_exists('aksrt_is_resource_post') && aksrt_is_resource_post($post_id); $context_variant = $is_resource_context ? 'resource' : 'content'; -// 下载总开关关闭 = 直连模式:下载按钮直接输出原始地址,不走本站中转链接。 -$direct_download = class_exists('\AKSRT\Content\Download') - && !\AKSRT\Content\Download::get_instance()->is_enabled(); $subject_label = trim((string) ($meta['subject_label'] ?? '')); if ($subject_label === '') { $subject_label = $is_resource_context ? __('资源', 'aksrt') : __('内容', 'aksrt'); @@ -60,9 +57,7 @@ $pay_modo = is_array($priced) $user_amount = is_array($priced) ? (float) ($priced['amount'] ?? 0) : (float) ($meta['price'] ?? 0); $cost = function_exists('aksrt_resource_download_cost') ? (int) aksrt_resource_download_cost($post_id) : 0; -// 直连模式下没有“获取链接”请求,验证码容器不会被打开,属死 UI 不渲染。 -$captcha_active = !$direct_download - && function_exists('aksrt_is_captcha_enabled_for') +$captcha_active = function_exists('aksrt_is_captcha_enabled_for') && aksrt_is_captcha_enabled_for('download'); $balance = (int) ($gate_data['balance'] ?? (is_user_logged_in() ? \AKSRT\Ledger\LedgerService::get_instance()->balance(get_current_user_id(), \AKSRT\Ledger\AssetType::POINTS) : 0)); $login_url = (string) ($gate_data['login_url'] ?? wp_login_url(get_permalink($post_id))); @@ -350,10 +345,6 @@ if ($is_need_purchase && $user_amount > 0) { } $type = isset($row['type']) ? (string) $row['type'] : 'direct'; $url = isset($row['url']) ? (string) $row['url'] : ''; - if ($direct_download && $url === '') { - // 直连模式没有可用的原始地址,空源不渲染。 - continue; - } $extract_code = isset($row['extract_code']) ? trim((string) $row['extract_code']) : ''; $has_extract = $extract_code !== ''; @@ -371,15 +362,6 @@ if ($is_need_purchase && $user_amount > 0) { $btn_action = ''; $btn_target = ''; $btn_rel = ''; - } elseif ($direct_download) { - $btn_tag = 'a'; - $btn_href = $url; - $btn_text = __('立即下载', 'aksrt'); - $btn_icon = 'fa-download'; - $btn_modifier = $has_paid_access ? ' resource-download-box__btn--owned' : ''; - $btn_action = ''; - $btn_target = ' target="_blank"'; - $btn_rel = ' rel="nofollow noopener"'; } else { $btn_tag = 'button'; $btn_href = ''; @@ -406,12 +388,6 @@ if ($is_need_purchase && $user_amount > 0) { - - -