feat(shop): 交易中心壳层 1:1 统一购物车/订单/收益

抽出 commerce header 与二级导航,购物车/订单/收益共用主站交易中心壳层;收益 stats 轻量化,降低独立电商后台观感。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-12 11:32:04 +08:00
co-authored by Claude Fable 5
parent 578f4da9ae
commit 663c0bb53e
7 changed files with 241 additions and 12 deletions
+94
View File
@@ -0,0 +1,94 @@
/**
* Commerce center shared shell (cart / orders / revenue).
*
* @package AKSRT
*/
.aksrt-commerce-header {
margin: 0 0 20px;
}
.aksrt-commerce-header__title {
margin: 0 0 6px;
font-size: 24px;
font-weight: 700;
line-height: 1.25;
color: var(--color-ink, #1f2937);
}
.aksrt-commerce-header__subtitle {
margin: 0 0 14px;
font-size: 14px;
color: var(--color-ink-3, #6b7280);
}
.aksrt-commerce-header__nav {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.aksrt-commerce-header__nav-item {
display: inline-flex;
align-items: center;
padding: 6px 12px;
border-radius: 999px;
border: 1px solid var(--color-line, rgba(0, 0, 0, 0.08));
background: var(--surface-1, #fff);
color: var(--color-ink-2, #4b5563);
font-size: 13px;
text-decoration: none;
transition: color .15s, border-color .15s, background .15s;
}
.aksrt-commerce-header__nav-item:hover {
color: var(--color-primary, #f04494);
border-color: color-mix(in srgb, var(--color-primary, #f04494) 35%, transparent);
}
.aksrt-commerce-header__nav-item.is-active {
color: var(--color-on-primary, #fff);
background: var(--color-primary, #f04494);
border-color: var(--color-primary, #f04494);
}
/* Soften revenue dashboard cards — task-first, not ops console */
.aksrt-revenue-page__stats {
gap: 12px !important;
margin-bottom: 18px !important;
}
.aksrt-revenue-page__stat-card {
padding: 14px 16px !important;
border-radius: 12px !important;
box-shadow: none !important;
border: 1px solid var(--color-line-soft, rgba(0, 0, 0, 0.06)) !important;
background: var(--surface-1, #fff) !important;
}
.aksrt-revenue-page__stat-icon {
width: 36px !important;
height: 36px !important;
font-size: 15px !important;
background: var(--body-bg-color, #f5f6f7) !important;
color: var(--color-ink-2, #4b5563) !important;
}
.aksrt-revenue-page__stat-value {
font-size: 18px !important;
font-weight: 600 !important;
}
.aksrt-revenue-page__stat-label {
font-size: 12px !important;
}
/* Orders / cart title rhythm when using shared header */
.aksrt-orders-page__header,
.aksrt-cart-page__header > div:first-child {
margin-bottom: 0;
}
.aksrt-orders-page__tabs {
margin-top: 4px;
}
+1
View File
@@ -43,6 +43,7 @@ require_once AKSRT_DIR . '/inc/helpers/aksrt-credits.php';
require_once AKSRT_DIR . '/inc/helpers/menu-decoration.php';
require_once AKSRT_DIR . '/inc/helpers/class-aksrt-nav-walker.php';
require_once AKSRT_DIR . '/inc/helpers/aksrt-transactions.php';
require_once AKSRT_DIR . '/inc/helpers/aksrt-commerce.php';
require_once AKSRT_DIR . '/inc/helpers/aksrt-user-dashboard.php';
require_once AKSRT_DIR . '/inc/helpers/aksrt-user-center.php';
require_once AKSRT_DIR . '/inc/helpers/aksrt-user-home.php';
@@ -301,6 +301,22 @@ trait AKSRT_Scripts_Part_1b {
);
}
// 交易中心共享壳层(购物车 / 订单 / 收益)
$is_commerce_center = is_page_template('templates/pages/page-orders.php')
|| is_page_template('templates/pages/page-cart.php')
|| is_page_template('templates/pages/page-revenue.php');
if ($is_commerce_center) {
$commerce_css = get_template_directory() . '/assets/css/routes/commerce.css';
if (file_exists($commerce_css)) {
wp_enqueue_style(
'aksrt-commerce-shell',
$base_uri . '/assets/css/routes/commerce.css',
['aksrt-tokens'],
(string) filemtime($commerce_css)
);
}
}
// 订单中心页
if (is_page_template('templates/pages/page-orders.php')) {
wp_enqueue_style(
+96
View File
@@ -0,0 +1,96 @@
<?php
/**
* Commerce center (cart / orders / revenue) presentation helpers.
*
* @package AKSRT
*/
defined('ABSPATH') || exit;
if (!function_exists('aksrt_get_commerce_nav_items')) {
/**
* Secondary nav for commerce center pages.
*
* @return array<int, array{key:string,label:string,url:string}>
*/
function aksrt_get_commerce_nav_items(): array {
$items = [];
$cart = function_exists('aksrt_get_cart_page_url') ? aksrt_get_cart_page_url() : '';
if ($cart !== '') {
$items[] = [
'key' => 'cart',
'label' => __('购物车', 'aksrt'),
'url' => $cart,
];
}
$orders = function_exists('aksrt_get_orders_page_url') ? aksrt_get_orders_page_url() : '';
if ($orders !== '') {
$items[] = [
'key' => 'orders',
'label' => __('我的订单', 'aksrt'),
'url' => $orders,
];
}
$revenue = function_exists('aksrt_get_revenue_page_url') ? aksrt_get_revenue_page_url() : '';
if ($revenue !== '') {
$items[] = [
'key' => 'revenue',
'label' => __('创作收益', 'aksrt'),
'url' => $revenue,
];
}
$center = function_exists('aksrt_get_user_center_url') ? aksrt_get_user_center_url() : '';
if ($center !== '') {
$items[] = [
'key' => 'center',
'label' => __('个人中心', 'aksrt'),
'url' => $center,
];
}
return $items;
}
}
if (!function_exists('aksrt_render_commerce_page_header')) {
/**
* Shared commerce page header: title / intro / secondary nav.
*
* @param array{title?:string,subtitle?:string,active?:string} $args
*/
function aksrt_render_commerce_page_header(array $args = []): void {
$title = (string) ($args['title'] ?? '');
$subtitle = (string) ($args['subtitle'] ?? '');
$active = sanitize_key((string) ($args['active'] ?? ''));
$nav = aksrt_get_commerce_nav_items();
?>
<header class="aksrt-commerce-header">
<?php if ($title !== '') : ?>
<h1 class="aksrt-commerce-header__title"><?php echo esc_html($title); ?></h1>
<?php endif; ?>
<?php if ($subtitle !== '') : ?>
<p class="aksrt-commerce-header__subtitle"><?php echo esc_html($subtitle); ?></p>
<?php endif; ?>
<?php if (!empty($nav)) : ?>
<nav class="aksrt-commerce-header__nav" aria-label="<?php esc_attr_e('交易中心导航', 'aksrt'); ?>">
<?php foreach ($nav as $item) :
$is_active = $active !== '' && $active === ($item['key'] ?? '');
?>
<a
class="aksrt-commerce-header__nav-item<?php echo $is_active ? ' is-active' : ''; ?>"
href="<?php echo esc_url((string) ($item['url'] ?? '#')); ?>"
<?php echo $is_active ? ' aria-current="page"' : ''; ?>
>
<?php echo esc_html((string) ($item['label'] ?? '')); ?>
</a>
<?php endforeach; ?>
</nav>
<?php endif; ?>
</header>
<?php
}
}
+9 -4
View File
@@ -42,11 +42,16 @@ $address_book = is_array($cart_view['address_book'] ?? null) ? $cart_view['addre
data-currency-symbol="<?php echo esc_attr((string) ($cart_view['currency_symbol'] ?? '¥')); ?>"
data-coupon-enabled="<?php echo !empty($cart_view['coupon_enabled']) ? '1' : '0'; ?>"
>
<?php
if (function_exists('aksrt_render_commerce_page_header')) {
aksrt_render_commerce_page_header([
'title' => __('购物车', 'aksrt'),
'subtitle' => __('在下单前确认地址、运费、优惠券和支付方式。', 'aksrt'),
'active' => 'cart',
]);
}
?>
<div class="aksrt-cart-page__header">
<div>
<h1 class="aksrt-cart-page__title"><?php esc_html_e('购物车', 'aksrt'); ?></h1>
<p class="aksrt-cart-page__subtitle"><?php esc_html_e('在下单前确认地址、运费、优惠券和支付方式。', 'aksrt'); ?></p>
</div>
<?php if (!empty($pending_orders)) : ?>
<div class="aksrt-cart-page__pending">
<span class="aksrt-cart-page__pending-label"><?php esc_html_e('待支付订单', 'aksrt'); ?></span>
+12 -3
View File
@@ -56,10 +56,19 @@ $tabs = [
?>
<main id="main-content" class="site-main content-shell" tabindex="-1">
<?php if (function_exists('aksrt_breadcrumbs')) { aksrt_breadcrumbs(); } ?>
<div class="container aksrt-orders-page" data-aksrt-order-center>
<div class="aksrt-orders-page__header">
<h1><?php esc_html_e('我的订单', 'aksrt'); ?></h1>
</div>
<?php
if (function_exists('aksrt_render_commerce_page_header')) {
aksrt_render_commerce_page_header([
'title' => __('我的订单', 'aksrt'),
'subtitle' => __('查看订单状态、物流进度与售后处理。', 'aksrt'),
'active' => 'orders',
]);
} else {
echo '<div class="aksrt-orders-page__header"><h1>' . esc_html__('我的订单', 'aksrt') . '</h1></div>';
}
?>
<!-- 5-tab navigation -->
<div class="aksrt-orders-page__tabs">
+13 -5
View File
@@ -54,12 +54,20 @@ $paged_records = array_slice($records, ($paged - 1) * $per_page, $per_page);
<div class="container aksrt-revenue-page" data-aksrt-revenue-page
data-min-amount="<?php echo esc_attr((string) $min_amount); ?>"
data-fee-rate="<?php echo esc_attr((string) $fee_rate); ?>">
<div class="aksrt-revenue-page__header">
<h1><?php esc_html_e('创作收益', 'aksrt'); ?></h1>
<p class="aksrt-revenue-page__subtitle"><?php esc_html_e('查看分成明细并发起提现。', 'aksrt'); ?></p>
</div>
<?php
if (function_exists('aksrt_render_commerce_page_header')) {
aksrt_render_commerce_page_header([
'title' => __('创作收益', 'aksrt'),
'subtitle' => __('查看分成明细并发起提现。', 'aksrt'),
'active' => 'revenue',
]);
} else {
echo '<div class="aksrt-revenue-page__header"><h1>' . esc_html__('创作收益', 'aksrt') . '</h1>';
echo '<p class="aksrt-revenue-page__subtitle">' . esc_html__('查看分成明细并发起提现。', 'aksrt') . '</p></div>';
}
?>
<div class="aksrt-revenue-page__stats">
<div class="aksrt-revenue-page__stats" aria-label="<?php esc_attr_e('收益概览', 'aksrt'); ?>">
<div class="aksrt-revenue-page__stat-card">
<div class="aksrt-revenue-page__stat-icon"><i class="fas fa-wallet"></i></div>
<div class="aksrt-revenue-page__stat-info">