Files
wordpress-theme-aksrt/tests/widget-system/vip-points-entry-harness.php
T
kate522andClaude Opus 5 5b16bc6e15 fix(frontend): route the VIP points-exchange entry through the custom currency name
/user/vip/ 档位购买卡下方的入口横条仍硬编码「积分兑换会员」,而后台
「积分配置 → 自定义货币名称」改名后不跟随。上一轮改名只覆盖了兑换弹窗
标题与会员弹窗内入口,页面自身的入口横条是另一处服务端渲染,漏改了。

入口横条(inc/helpers/aksrt-vip.php)
- aksrt_get_vip_points_exchange_entry_html 改取已加载的
  catalog.currency_name,回退 Settings::get_currency_name() 再回退「积分」

同一页面上其余漏改的兑换文案一并收口,命名与入口/弹窗保持一致:
- VipServiceModal:积分不足提示 → {货币名}不足,暂时无法兑换
- VipServicePurchase.exchange_with_points:兑换未启用 / 兑换无效 /
  不足三处 WP_Error、流水说明、订单备注(%1$s兑换会员 %2$d %1$s。)
  currency_name 在此单独解析,get_catalog 内的局部变量不在该作用域
- LedgerPresentation:vip_points_exchange 流水原因标签

契约测试新增源断言,并用两个 PHP harness 做运行时断言:入口横条
(改名后 / 已是会员不输出 / 缺 key 回退)与弹窗(余额充足 / 不足两分支)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-11-01 16:19:49 +08:00

58 lines
2.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
declare(strict_types=1);
namespace {
define('ABSPATH', __DIR__ . '/');
function __(string $text, string $domain = ''): string { return $text; }
function esc_html($value): string { return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8'); }
function esc_html__($value, string $domain = ''): string { return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8'); }
function esc_attr($value): string { return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8'); }
function esc_attr__($value, string $domain = ''): string { return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8'); }
function esc_url($value): string { return (string) $value; }
function wp_kses_post($value): string { return (string) $value; }
function aksrt_get_user_center_tab_url(string $tab): string { return '/user/' . $tab; }
function add_action(string $hook, callable $cb, int $p = 10, int $a = 1): void {}
}
namespace AKSRT\Content {
// VipService 门面:get_catalog 由探测值驱动(含 currency_name + 可兑换套餐)。
final class VipService {
public static function get_instance(): self { return new self(); }
/** @return array<string,mixed> */
public function get_catalog(int $user_id = 0): array {
return [
'currency_name' => $GLOBALS['aksrt_probe_currency'] ?? '积分',
'points_exchange' => [
'enabled' => true,
'packages' => [['package_id' => 6001, 'level' => 1, 'points' => 500]],
],
];
}
}
}
namespace AKSRT\Settings {
final class Settings {
// 仅在 catalog 未带 currency_name 时回退,用于验证兜底路径。
public static function get_currency_name(): string { return $GLOBALS['aksrt_probe_fallback'] ?? '积分'; }
}
}
namespace {
require dirname(__DIR__, 2) . '/inc/helpers/aksrt-vip.php';
$GLOBALS['aksrt_probe_currency'] = isset($argv[1]) ? (string) $argv[1] : '书币';
$GLOBALS['aksrt_probe_fallback'] = isset($argv[2]) ? (string) $argv[2] : '回退币';
// 场景 1:后台改名后,横条标题跟随自定义货币名。
echo aksrt_get_vip_points_exchange_entry_html(1, 0), "\n";
// 场景 2:已是会员 → 不输出。
echo (aksrt_get_vip_points_exchange_entry_html(1, 2) === '' ? 'VIP_HIDDEN' : 'VIP_SHOWN'), "\n";
// 场景 3:catalog 未带 currency_name → 回退到设置里的名称。
$GLOBALS['aksrt_probe_currency'] = '';
echo aksrt_get_vip_points_exchange_entry_html(1, 0), "\n";
}