kate522
a57b44bd61
fix(user): serialize level experience awards
2026-07-30 09:44:32 +08:00
kate522
20c19dfe31
feat(user): complete growth level chain
2026-07-30 09:38:45 +08:00
kate522
b2e6045117
Merge pull request 'fix(user): move avatar upload to hover overlay' ( #325 ) from worktree-user-avatar-system into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#325
2026-07-29 14:34:47 +08:00
kate522
eed75d9f15
fix(user): move avatar upload to hover overlay
2026-07-29 14:17:52 +08:00
kate522
0463efee8e
Merge pull request 'fix(user): normalize default avatar filename' ( #324 ) from worktree-user-avatar-system into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#324
2026-07-29 13:58:33 +08:00
kate522
224691e709
fix(user): normalize default avatar filename
2026-07-29 13:53:59 +08:00
kate522
cf62eee95d
Merge pull request 'Worktree user avatar system' ( #323 ) from worktree-user-avatar-system into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#323
2026-07-29 13:50:00 +08:00
kate522
eeabe1d384
fix(user): harden native avatar uploads
2026-07-29 13:39:02 +08:00
kate522
e94437ef60
feat(user): add local avatar management flow
2026-07-29 13:35:17 +08:00
kate522
1b4ba8938a
Merge pull request 'fix(identity): show certification in user admin' ( #322 ) from worktree-fix-identity-certification-flow into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#322
2026-07-29 12:47:33 +08:00
kate522
7dbbb2cdda
fix(identity): show certification in user admin
2026-07-29 12:46:44 +08:00
kate522
8bc0f5a06b
Merge pull request 'fix(identity): complete native certification review flow' ( #321 ) from worktree-fix-identity-certification-flow into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#321
2026-07-29 12:30:35 +08:00
kate522
2dfaa10798
fix(identity): complete native certification review flow
2026-07-29 12:25:58 +08:00
kate522
32658be87d
Merge pull request 'fix(user-center): complete certification and order flows' ( #320 ) from worktree-fix-user-center-order-certification-flow into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#320
2026-07-29 10:46:20 +08:00
kate522
815e83bac0
fix(user-center): complete certification and order flows
...
Fix modal scroll ownership and certification modal styling, store evidence as Media Library attachments, reconcile missed provider callbacks, validate currencies, and complete digital fulfillment only after durable entitlement delivery.
2026-07-29 10:29:59 +08:00
kate522
b945c6e835
Merge pull request 'fix(user-center): embed official certification panel' ( #319 ) from worktree-user-center-sidebar-wallet-redesign into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#319
2026-07-28 15:26:04 +08:00
kate522
0a04c3e4cc
fix(user-center): embed official certification panel
2026-07-28 15:22:09 +08:00
kate522
90bf3ee5ed
Merge pull request 'fix(user-center): connect certification workflow' ( #318 ) from worktree-user-center-sidebar-wallet-redesign into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#318
2026-07-28 14:28:17 +08:00
kate522
d3bf75fbea
fix(user-center): connect certification workflow
2026-07-28 14:17:18 +08:00
kate522
d6e5ab067c
Merge pull request 'feat(user-center): redesign sidebar and wallet tips' ( #317 ) from worktree-user-center-sidebar-wallet-redesign into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#317
2026-07-28 13:53:57 +08:00
kate522
a7f3caec59
feat(user-center): redesign sidebar and wallet tips
2026-07-28 13:41:00 +08:00
kate522
82e71d1bf9
Merge pull request 'feat(user-center): deepen zibll parity and profile media' ( #316 ) from worktree-user-center-zibll-complete into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#316
2026-07-28 12:48:21 +08:00
kate522
e47ee1b029
feat(user-center): deepen zibll parity and profile media
2026-07-28 12:22:52 +08:00
kate522
c13f686cdc
Merge pull request 'fix(homepage): unify runtime rendering contract' ( #315 ) from fix/homepage-runtime-contract into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#315
2026-07-28 02:54:48 +08:00
kate522
bcebd37807
fix(homepage): unify runtime rendering contract
2026-07-28 02:54:18 +08:00
kate522
bd6f55c42e
Merge pull request 'feat: deepen single post experience' ( #314 ) from worktree-frontend-single-deep-rebuild into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#314
2026-07-28 02:10:12 +08:00
kate522
2086f938ed
feat: deepen single post experience
2026-07-28 02:07:10 +08:00
kate522
a00db4538f
Merge pull request 'fix(ip-geo): harden full-chain IP geolocation reliability' ( #313 ) from worktree-ip-geo-fix into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#313
2026-07-27 16:10:05 +08:00
kate522
59f5d5d98a
fix(ip-geo): harden full-chain IP geolocation reliability
...
Capture real client IPs behind CDN, improve provider fallbacks and
negative cache, fix admin credential dependsOn for polling mode, and
map country labels to ISO codes for moderation GeoIP blocks.
2026-07-27 15:39:16 +08:00
kate522
c206928746
Merge pull request 'fix(orders): wire detail progress timeline and two-step cancel' ( #312 ) from worktree-order-detail-progress-close into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#312
2026-07-27 15:19:02 +08:00
kate522
ad40d9a7ca
fix(orders): wire detail progress timeline and two-step cancel
...
Order progress was stuck on "订单创建" because timeline only read sparse
timestamp columns and status transitions didn't always stamp them.
Drive timeline from current status + related records, backfill lifecycle
timestamps on update_status, and replace window.confirm cancel with a
关闭订单 → 确认取消 button step in the detail modal.
2026-07-27 15:15:35 +08:00
kate522
64d0dc66da
Merge pull request 'fix(orders): drop secondary "我的余额/会员/积分" link from detail modal' ( #311 ) from worktree-order-center-list into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#311
2026-07-27 14:00:58 +08:00
kate522
eac58f07bf
feat(orders): polish detail modal layout and visuals
...
Restructure the order detail modal into status-tinted hero, product
card, info list with copyable order number, multi-item lines, and a
newest-first timeline. Refresh spacing, dark mode, and footer buttons.
2026-07-27 13:54:34 +08:00
kate522
e6eee91eb3
fix(orders): drop secondary "我的余额/会员/积分" link from detail modal
...
The user center already has a dedicated tab for these; showing the
secondary shortcut inside the order detail modal is redundant noise.
The view-model field is kept for other consumers.
2026-07-27 13:40:23 +08:00
kate522
0c3e33bed4
Merge pull request 'feat(orders): redesign detail modal — hero pill, no duplicate close' ( #310 ) from worktree-order-center-list into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#310
2026-07-27 13:37:15 +08:00
kate522
e47a3958fb
feat(orders): redesign detail modal — hero pill, no duplicate close
...
- Remove bottom "关闭" button so the top-right ✕ is the single dismiss.
- Drop redundant 订单类型 row from modal body (already shown as card chip).
- Add hero strip with status pill + amount; unify dt/dd rows into a
bordered card; tighten items list and add timeline rail.
- Refresh modal styling: rounded dialog, gradient header, hover-lift
buttons, mobile-friendly rows.
2026-07-27 13:34:30 +08:00
kate522
1648df8457
Merge pull request 'feat(orders): order detail modal, list actions, use configured prefix' ( #309 ) from worktree-order-center-list into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#309
2026-07-27 13:13:15 +08:00
kate522
a1e35a4499
feat(orders): order detail modal, list actions, use configured prefix
...
Wire admin payment_order_prefix into order number generation (with 32-char
cap for gateways), make 查看 open a full order-detail modal with
status-aware footer actions, keep type badge top-left only, and right-align
unpaid list actions with countdown on the left.
2026-07-27 12:39:21 +08:00
kate522
5e1e2e2634
Merge pull request 'Worktree tighten payment gateways' ( #308 ) from worktree-tighten-payment-gateways into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#308
2026-07-27 11:44:55 +08:00
kate522 and Claude Fable 5
abc3f1565f
fix(payment): reject duplicate provider transactions
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-27 11:31:39 +08:00
kate522 and Claude Fable 5
089421cd3e
fix(payment): unify and harden payment attempts
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-27 11:29:57 +08:00
kate522
158b0d0e61
Merge pull request 'Worktree tighten payment gateways' ( #307 ) from worktree-tighten-payment-gateways into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#307
2026-07-26 13:43:38 +08:00
kate522 and Claude Fable 5
53933988bf
fix(payment): resolve provider out_trade_no on Alipay refund query
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-26 13:29:47 +08:00
kate522 and Claude Fable 5
ed55d302e9
fix(payment): re-pay with fresh provider out_trade_no
...
WeChat/Alipay/Epay reject reusing the same merchant order number when
params change. Allocate attempt-suffixed out_trade_no on resume pay,
map callbacks back to the local order, and best-effort close prior trades.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-26 13:28:45 +08:00
kate522
12147d9cac
Merge pull request 'feat(payment): tighten gateways and implement Epay' ( #306 ) from worktree-tighten-payment-gateways into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#306
2026-07-26 13:13:25 +08:00
kate522 and Claude Fable 5
723dd180e4
feat(payment): tighten gateways and implement Epay
...
Keep only balance, Alipay, WeChat, PayPal, Stripe, Epay, and card-pass
channels; remove placeholder aggregators. Add dual-channel Epay gateway
with MD5 notify/return, register cashier methods, and gate card-pass
redeem behind the payment channel switch.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-26 12:59:28 +08:00
kate522
aa4bdfb5c4
Merge pull request 'fix(payment): harden payment and refund chains' ( #305 ) from fix/payment-chain-hardening into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#305
2026-07-26 02:40:55 +08:00
kate522
53ff99f343
fix(payment): harden payment and refund chains
2026-07-26 02:29:46 +08:00
kate522
c70fbe9835
Merge pull request 'refactor(payment): migrate SDK to yansongda pay' ( #304 ) from worktree-pay-sdk-yansongda into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#304
2026-07-26 00:14:52 +08:00
kate522
a8d99b200b
refactor(payment): migrate SDK to yansongda pay
2026-07-26 00:09:38 +08:00
kate522
8fbde0785e
Merge pull request 'fix(uc): drop 我的订单 from 我的服务; keep under 权益与消费' ( #303 ) from worktree-ip-location-display into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#303
2026-07-25 16:33:19 +08:00
kate522
a93aab991e
fix(uc): drop 我的订单 from 我的服务; keep under 权益与消费
2026-07-25 16:31:43 +08:00
kate522
6f56294159
Merge pull request 'fix(user): enable pretty /user and /profile when permalinks empty' ( #302 ) from worktree-ip-location-display into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#302
2026-07-25 16:24:35 +08:00
kate522
6abcdf65e0
fix(user): enable pretty /user and /profile when permalinks empty
2026-07-25 15:56:11 +08:00
kate522
6c2682b835
Merge pull request 'fix(ip-geo): fallback free lookup when Amap key platform mismatches' ( #301 ) from worktree-ip-location-display into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#301
2026-07-25 15:47:43 +08:00
kate522
06d4844c8e
fix(ip-geo): fallback free lookup when Amap key platform mismatches
2026-07-25 15:46:36 +08:00
kate522
0183c60bf3
Merge pull request 'fix(ip-geo): real pconline + amap sig/errors; clearer admin test failures' ( #300 ) from worktree-ip-location-display into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#300
2026-07-25 15:38:18 +08:00
kate522
62478a02fd
fix(ip-geo): real pconline + amap sig/errors; clearer admin test failures
2026-07-25 15:31:38 +08:00
kate522
3ea1be02ed
Merge pull request 'refactor(ip-geo): drop dual-read gates; keep single meta and four surfaces' ( #299 ) from worktree-ip-location-display into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#299
2026-07-25 15:21:01 +08:00
kate522
3bb7fb0ba6
refactor(ip-geo): drop dual-read gates; keep single meta and four surfaces
...
Canonical keys only (ip_geo_display defaults to all four, aksrt_user_addr /
aksrt_comment_addr only). Self-view still resolves current IP on read.
2026-07-25 15:14:29 +08:00
kate522
09035278d5
Merge pull request 'fix(auth): logout without /logout rewrite (avoid Apache 404)' ( #298 ) from worktree-ip-location-display into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#298
2026-07-25 15:10:35 +08:00
kate522
6e71008d00
fix(auth): logout without /logout rewrite (avoid Apache 404)
2026-07-25 15:09:58 +08:00
kate522
8c2901fcbb
Merge pull request 'fix(user): show IP city on home/center and force /user + profile templates' ( #297 ) from worktree-ip-location-display into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#297
2026-07-25 15:04:24 +08:00
kate522
820fafd8a7
fix(user): show IP city on home/center and force /user + profile templates
2026-07-25 15:02:57 +08:00
kate522
61a17ff527
Merge pull request 'feat(ip-geo): full-chain IP 归属地 on comments, user home, center, post' ( #296 ) from worktree-ip-location-display into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#296
2026-07-25 14:43:23 +08:00
kate522
ac7ff8d4f2
feat(ip-geo): full-chain IP 归属地 on comments, user home, center, post
2026-07-25 14:39:47 +08:00
kate522
1f2ca3ac8f
Merge pull request 'fix(orders): restore frontend pay REST and harden order-center client' ( #295 ) from worktree-feat-orders-in-uc into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#295
2026-07-25 14:16:55 +08:00
kate522
9277674da0
fix(orders): restore frontend pay REST and harden order-center client
...
Add AKSRT\Payment\OrderCenterRest so /shop/frontend/orders/{n}/pay|cancel
always register on rest_api_init; widen order_number route charset; make
order-center.js use credentials, encodeURIComponent, and clearer 404 errors.
2026-07-25 14:12:40 +08:00
kate522
7896c43acc
Merge pull request 'style(orders): polish UC order center cards, tabs, and empty state' ( #294 ) from worktree-feat-orders-in-uc into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#294
2026-07-25 14:00:20 +08:00
kate522
3117081a58
style(orders): polish UC order center cards, tabs, and empty state
...
Refresh orders.css for embedded user-center layout: segmented status
tabs, stat tiles, card hierarchy, action pills, after-sale list, and
dark mode; light HTML polish for title and empty state.
2026-07-25 13:58:44 +08:00
kate522
ed5a1f592d
Merge pull request 'feat(orders): embed My Orders inside user center (zibll-style)' ( #293 ) from worktree-feat-orders-in-uc into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#293
2026-07-25 13:55:06 +08:00
kate522
354a1072ef
feat(orders): embed My Orders inside user center (zibll-style)
...
Register UC panel tab=orders with full order list/actions UI; route
aksrt_get_orders_page_url and /orders template to profile?tab=orders;
enqueue order assets when the UC orders tab is active.
2026-07-25 13:54:08 +08:00
kate522
dae85f0198
Merge pull request 'Worktree feat my orders' ( #292 ) from worktree-feat-my-orders into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#292
2026-07-25 13:42:06 +08:00
kate522
a8760b976a
fix(orders): enqueue cart/revenue assets on virtual routes
2026-07-25 13:41:21 +08:00
kate522
59901bdc26
fix(orders): route /orders without WP page (404)
...
Register commerce rewrite aliases and special-template bootstrap so
/orders loads page-orders even when no page is assigned; flush rules.
2026-07-25 13:40:56 +08:00
kate522
7b0668bcf3
Merge pull request 'feat(orders): full-chain My Orders for all product types' ( #291 ) from worktree-feat-my-orders into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#291
2026-07-25 13:34:31 +08:00
kate522
3baa8573c9
feat(orders): full-chain My Orders for all product types
...
Unify front-end order center across shop, content, VIP, recharge,
points, and plate-follow with type filters, stats, and type-aware
cards; keep shop-only fulfillment actions; ensure 权益与消费 entry URL.
2026-07-25 13:33:43 +08:00
kate522
85ade059a2
Merge pull request 'fix(payment): align plate-follow cash preview with wallet balance' ( #290 ) from worktree-fix-balance-chain into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#290
2026-07-25 13:15:07 +08:00
kate522
daba099755
fix(payment): align plate-follow cash preview with wallet balance
...
Use cash wallet for plate follow cashiers and stop stubbing methods when Gateway is missing.
2026-07-25 13:13:56 +08:00
kate522
8bc2a934c2
Merge pull request 'fix(rest): build signin URLs from restUrl under plain permalinks' ( #289 ) from worktree-fix-user-card-vip-btn into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#289
2026-07-25 13:11:38 +08:00
kate522
729812fc06
Merge pull request 'feat(admin): collapsible gateway credential forms on payment page' ( #288 ) from worktree-fix-balance-chain into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#288
2026-07-25 13:11:26 +08:00
kate522
6db4da32c6
feat(admin): collapsible gateway credential forms on payment page
...
Hide channel config cards until enabled; open expanded on enable and allow manual collapse via group header.
2026-07-25 13:08:37 +08:00
kate522
42b13ae997
Merge pull request 'fix(payment): wire balance wallet end-to-end when pay_balance_s is on' ( #287 ) from worktree-fix-balance-chain into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#287
2026-07-25 12:55:45 +08:00
kate522
3267bee71e
fix(payment): wire balance wallet end-to-end when pay_balance_s is on
...
Opening 余额功能 alone now enables cash-wallet pay (unless 余额支付 is explicitly off). Drop points-as-balance fallback, stop fake method injection, expose real wallet in cashiers, and honor auto_to_balance on recharge fulfill.
2026-07-25 12:46:38 +08:00
kate522
e4905e3088
fix(rest): build signin URLs from restUrl under plain permalinks
...
credits.js hardcoded siteUrl + /wp-json/aksrt/v1 which 404s when WP uses
plain permalinks (?rest_route=...). Prefer aksrtData.restUrl/apiUrl and
harden header-userbox path join for the same case.
2026-07-25 12:29:03 +08:00
kate522
c85774f9a0
Merge pull request 'Worktree fix user card vip btn' ( #286 ) from worktree-fix-user-card-vip-btn into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#286
2026-07-25 12:21:52 +08:00
kate522
a1852714d3
fix(nav): keep radius/jb paint tokens on 发布 toggle not wrapper
2026-07-25 12:00:36 +08:00
kate522
c8b4d1a851
fix(nav): never drop top-nav 发布 when submit page URL is empty
...
aksrt_get_new_post_url() returns '' without a page-submit assignment,
which previously skipped the post action and emptied the multi-type
chip. Fall back to post-new.php, keep a last-resort action list, put
radius/jb paint on the toggle, and force chip visibility CSS.
2026-07-25 12:00:07 +08:00
kate522
9a0b01f2b3
Merge pull request 'fix(nav): restore multi-type 发布 chip paint on bare navbar-but' ( #285 ) from worktree-fix-user-card-vip-btn into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#285
2026-07-25 11:52:42 +08:00
kate522
e194c603cb
fix(nav): restore multi-type 发布 chip paint on bare navbar-but
...
Paint classes (jb-*/but/radius) were on the transparent newadd wrapper,
so the multi-type 发布 toggle rendered invisible outside navbar-but-cluster.
Move them onto .newadd-btns__toggle and style the bare DOM path.
2026-07-25 11:51:47 +08:00
kate522
3df37a4404
Merge pull request 'fix(nav): align header user-card VIP CTA with check-in button' ( #284 ) from worktree-fix-user-card-vip-btn into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#284
2026-07-25 11:44:36 +08:00
kate522
e98f94bc06
fix(nav): align header user-card VIP CTA with check-in button
...
Drop navbar-cta/pill radius classes from the dropdown 开通会员 link and
force full-width 6px radius geometry to match the签到 button.
2026-07-25 11:42:13 +08:00
kate522
7b22f7336d
Merge pull request 'fix(nav): kill Bootstrap 5 navbar padding so bar matches zibll height' ( #283 ) from worktree-fix-theme-toggle-overlap into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#283
2026-07-25 11:36:22 +08:00
kate522
89b4070614
fix(nav): kill Bootstrap 5 navbar padding so bar matches zibll height
...
AKSRT loads BS5 (.navbar --bs-navbar-padding-y:.5rem) while zibll uses
BS3 without it; that alone added ~16px. Zero BS navbar pad, keep only
.header 8px 20px (mobile 0 8px), horizontal CTA margins, tighter mobile
logo/toggle row.
2026-07-25 11:33:52 +08:00
kate522
4a599258c8
Merge pull request 'fix(nav): align header bar height with zibll main.css' ( #282 ) from worktree-fix-theme-toggle-overlap into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#282
2026-07-25 11:28:15 +08:00
kate522
8a6f6feafb
fix(nav): align header bar height with zibll main.css
...
Drop forced 34px CTA chips and container min-height:50 that inflated
or shrank the bar vs zibll. Restore .navbar-but .but to 0.8em / 0.3em
1em / margin 0.4em; keep logo 36px, header pad 8px 20px, fixed reserve 88px.
2026-07-25 11:27:31 +08:00
kate522
bf4c019ab3
Merge pull request 'fix(admin): accept multi-value 发布类型 on header-nav save' ( #281 ) from worktree-fix-theme-toggle-overlap into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#281
2026-07-25 11:15:49 +08:00
kate522
ab3d361d46
fix(admin): accept multi-value 发布类型 on header-nav save
...
header_newposts_types is multi-select but PHP schema used type=select,
so validate() rejected arrays with 422. Use checkbox and allow
select+multiple arrays in SchemaProvider.
2026-07-25 11:13:52 +08:00
kate522
d77fce8fdd
Merge pull request 'fix(vip): join REST query with & under plain permalinks' ( #280 ) from worktree-fix-theme-toggle-overlap into main
...
Reviewed-on: CYL/wordpress-theme-aksrt#280
2026-07-25 11:10:43 +08:00
kate522
53836ac6b8
fix(vip): join REST query with & under plain permalinks
...
GET pay/vip/modal?vip_level=1 became rest_route=.../modal?vip_level which
404s. Build rest_route path then append &vip_level= for plain links.
2026-07-25 11:08:15 +08:00