feat: remove shop feature (Phase 2)

Delete all shop domain classes, controllers, schema builders, templates,
JS/CSS, admin SPA pages, and shop-only payment classes (Shipping,
AfterSale, Discount). Remove shop-only DB table definitions (product_variant,
after_sale, order_shipping, card_key) from migrator and add their DROP
to uninstall.php. Clean up shared files:

- Remove aksrt_product CPT + taxonomies from Setup.php
- Remove shop rewrite rules/query vars/template redirect from SetupPart2.php
- Remove shop widget areas from SetupPart1.php
- Remove shop enqueues from ScriptsPart1b.php
- Remove sepakerator-aksrt-shop from SetupPart2.php
- Remove get_shop_settings facade (delete ForumShop.php, clean DomainGroups.php)
- Remove ORDER_PRODUCT_SHOP constant from DomainModel.php
- Remove Shop::class fallback branches from UserOrders.php, OrderCenterRest.php
- Remove shipping/after-sale branches from OrderRepositoryAdmin.php, PayMenus.php, PayOrders.php
- Remove shop product widgets from widgets-register.php
- Remove cart page from template-registry.php, routing.php, ScriptsPart2.php
- Remove cart UI from sidebar-nav.php, profile-orders.php, sidebar-orders.php
- Clean up order-center.js (remove rebuy/cartUrl/receipt/after-sale handlers)
- Remove aksrt_get_cart_page_url/product_page/product_edit from transactions.php
- Clean up aksrt_product_cat references in Coupon.php, PayCoupons.php

Shared payment/order/credits/content-pay stack fully retained.
This commit is contained in:
2026-08-02 21:25:52 +08:00
parent 2bbd7c01a3
commit 1d2505356e
103 changed files with 46 additions and 21267 deletions
-59
View File
@@ -1,59 +0,0 @@
<?php
/**
* Shared product card (archive / related / storefront).
*
* Expected args:
* - product: array from \AKSRT\Shop\Shop::build_product_card_view()
* - show_sales: bool (optional)
* - sales_cfg: array (optional; used when show_sales not provided)
*
* @package AKSRT
*/
defined('ABSPATH') || exit;
$args = is_array($args ?? null) ? $args : [];
$product = is_array($args['product'] ?? null) ? $args['product'] : [];
if (empty($product) || empty($product['id'])) {
return;
}
$sales = (int) ($product['sales'] ?? 0);
if (array_key_exists('show_sales', $args)) {
$show_sales = !empty($args['show_sales']);
} else {
$sales_cfg = is_array($args['sales_cfg'] ?? null) ? $args['sales_cfg'] : [];
$mode = (string) ($sales_cfg['show'] ?? 'show');
$min_sales = max(0, (int) ($sales_cfg['show_min'] ?? 0));
$show_sales = ($mode === 'show' && $sales > 0) || ($mode === 'threshold' && $sales >= $min_sales);
}
$title = (string) ($product['title'] ?? '');
$permalink = (string) ($product['permalink'] ?? '#');
$image = (string) ($product['image'] ?? '');
$excerpt = (string) ($product['excerpt'] ?? '');
$price = (float) ($product['price'] ?? 0);
?>
<article class="aksrt-product-card product-item posts-item card ajax-item">
<a href="<?php echo esc_url($permalink !== '' ? $permalink : '#'); ?>" class="aksrt-product-card__link">
<?php if ($image !== '') : ?>
<div class="aksrt-product-card__image">
<img src="<?php echo esc_url($image); ?>" alt="<?php echo esc_attr($title); ?>" loading="lazy">
</div>
<?php else : ?>
<div class="aksrt-product-card__image aksrt-product-card__image--placeholder"><i class="fas fa-image" aria-hidden="true"></i></div>
<?php endif; ?>
<div class="aksrt-product-card__body">
<h3 class="aksrt-product-card__title"><?php echo esc_html($title); ?></h3>
<?php if ($excerpt !== '') : ?>
<p class="aksrt-product-card__excerpt"><?php echo esc_html(wp_trim_words($excerpt, 15)); ?></p>
<?php endif; ?>
<div class="aksrt-product-card__footer">
<span class="aksrt-product-card__price">¥<?php echo esc_html(number_format($price, 2)); ?></span>
<?php if ($show_sales) : ?>
<span class="aksrt-product-card__sales"><?php printf(esc_html__('已售 %d', 'aksrt'), $sales); ?></span>
<?php endif; ?>
</div>
</div>
</a>
</article>
-149
View File
@@ -1,149 +0,0 @@
<?php
/**
* Product category hierarchical filter bar (zibll shop-cat-filter parity).
*
* Expects in scope:
* - $filter array from Shop::build_product_cat_filter()
* - $orderby string
* - $order string ASC|DESC
* - $term array|null
*
* @package AKSRT
*/
defined('ABSPATH') || exit;
$filter = is_array($filter ?? null) ? $filter : [];
$orderby = sanitize_key((string) ($orderby ?? ($filter['orderby'] ?? 'date')));
$order = strtoupper(sanitize_key((string) ($order ?? ($filter['order'] ?? 'DESC'))));
if (!in_array($order, ['ASC', 'DESC'], true)) {
$order = 'DESC';
}
$current_id = (int) ($filter['current_id'] ?? 0);
$mode = (string) ($filter['mode'] ?? 'siblings');
$siblings = is_array($filter['siblings'] ?? null) ? $filter['siblings'] : [];
$children = is_array($filter['children'] ?? null) ? $filter['children'] : [];
$child_tabs = is_array($filter['child_tabs'] ?? null) ? $filter['child_tabs'] : [];
$parent_url = (string) ($filter['parent_url'] ?? '');
$parent_id = (int) ($filter['parent_id'] ?? 0);
$term_name = is_array($term ?? null) ? (string) ($term['name'] ?? '') : '';
$order_labels = [
'date' => __('最新', 'aksrt'),
'views' => __('最热', 'aksrt'),
'favorite_count' => __('收藏', 'aksrt'),
'score' => __('评分', 'aksrt'),
'sales' => __('销量', 'aksrt'),
];
$base_term_url = !empty($term['url']) ? (string) $term['url'] : '';
if ($base_term_url === '' && $current_id > 0) {
$link = get_term_link($current_id, 'aksrt_product_cat');
$base_term_url = is_wp_error($link) ? '' : (string) $link;
}
$blog = wp_strip_all_tags(get_bloginfo('name'));
?>
<div class="shop-cat-filter aksrt-shop-cat-filter zib-widget relative" data-aksrt-shop-cat-filter win-ajax-replace="shop-cat-filter">
<?php if (!empty($siblings)) : ?>
<div class="shop-cat-filter-tab list-inline scroll-x mini-scrollbar tab-nav-theme" data-aksrt-cat-tabs>
<?php foreach ($siblings as $sib) :
$sid = (int) ($sib['id'] ?? 0);
$is_active = ($mode === 'with_children' && $sid === $current_id)
|| ($mode === 'parent_siblings' && $sid === $parent_id)
|| ($mode === 'siblings' && $sid === $current_id);
?>
<?php if ($is_active) : ?>
<li class="active"><span class="focus-color"><?php echo esc_html((string) ($sib['name'] ?? '')); ?></span></li>
<?php else : ?>
<li>
<a class="ajax-next"
ajax-replace="true"
route="1"
route-title="<?php echo esc_attr((string) ($sib['name'] ?? '') . ' - ' . __('商城', 'aksrt') . ($blog ? ' · ' . $blog : '')); ?>"
href="<?php echo esc_url((string) ($sib['url'] ?? '#')); ?>"
data-aksrt-shop-term="<?php echo esc_attr((string) $sid); ?>">
<?php echo esc_html((string) ($sib['name'] ?? '')); ?>
</a>
</li>
<?php endif; ?>
<?php endforeach; ?>
</div>
<?php endif; ?>
<?php if ($mode === 'with_children' && !empty($child_tabs)) : ?>
<div class="shop-cat-filter-child" data-aksrt-cat-children>
<span class="focus-color"><?php esc_html_e('全部', 'aksrt'); ?></span>
<?php foreach ($child_tabs as $child) : ?>
<a class="ajax-next"
ajax-replace="true"
route="1"
route-title="<?php echo esc_attr((string) ($child['name'] ?? '') . ' - ' . __('商城', 'aksrt')); ?>"
href="<?php echo esc_url((string) ($child['url'] ?? '#')); ?>"
data-aksrt-shop-term="<?php echo esc_attr((string) ((int) ($child['id'] ?? 0))); ?>">
<?php echo esc_html((string) ($child['name'] ?? '')); ?>
</a>
<?php endforeach; ?>
</div>
<?php elseif ($mode === 'parent_siblings' && !empty($children)) : ?>
<div class="shop-cat-filter-child" data-aksrt-cat-children>
<?php if ($parent_url !== '') : ?>
<a class="ajax-next" ajax-replace="true" route="1" href="<?php echo esc_url($parent_url); ?>" data-aksrt-shop-term="<?php echo esc_attr((string) $parent_id); ?>">
<?php esc_html_e('全部', 'aksrt'); ?>
</a>
<?php endif; ?>
<?php foreach ($children as $child) :
$cid = (int) ($child['id'] ?? 0);
?>
<?php if ($cid === $current_id) : ?>
<span class="focus-color"><?php echo esc_html((string) ($child['name'] ?? '')); ?></span>
<?php else : ?>
<a class="ajax-next"
ajax-replace="true"
route="1"
route-title="<?php echo esc_attr((string) ($child['name'] ?? '') . ' - ' . __('商城', 'aksrt')); ?>"
href="<?php echo esc_url((string) ($child['url'] ?? '#')); ?>"
data-aksrt-shop-term="<?php echo esc_attr((string) $cid); ?>">
<?php echo esc_html((string) ($child['name'] ?? '')); ?>
</a>
<?php endif; ?>
<?php endforeach; ?>
</div>
<?php endif; ?>
<div class="shop-cat-filter-orderby shop-cat-filter-child" win-ajax-replace="orderby" data-aksrt-shop-orderby-bar>
<span class="opacity5"><?php esc_html_e('排序', 'aksrt'); ?></span>
<?php foreach ($order_labels as $key => $label) :
if ($orderby === $key) : ?>
<span class="focus-color"><?php echo esc_html($label); ?></span>
<?php else :
$href = $base_term_url !== '' ? add_query_arg(['orderby' => $key], $base_term_url) : add_query_arg(['orderby' => $key]);
?>
<a rel="nofollow" ajax-replace="true" class="ajax-next" href="<?php echo esc_url($href); ?>" data-aksrt-shop-orderby="<?php echo esc_attr($key); ?>">
<?php echo esc_html($label); ?>
</a>
<?php endif;
endforeach;
// Price toggle (single 售价 control).
if ($orderby === 'price') {
$next_order = $order === 'DESC' ? 'ASC' : 'DESC';
$icon = $next_order === 'DESC' ? 'up' : 'down';
$href = $base_term_url !== ''
? add_query_arg(['orderby' => 'price', 'order' => $next_order], $base_term_url)
: add_query_arg(['orderby' => 'price', 'order' => $next_order]);
?>
<a rel="nofollow" ajax-replace="true" class="ajax-next focus-color" href="<?php echo esc_url($href); ?>" data-aksrt-shop-orderby="price" data-aksrt-shop-order="<?php echo esc_attr($next_order); ?>">
<?php esc_html_e('售价', 'aksrt'); ?><i class="opacity5 ml3 fa fa-long-arrow-<?php echo esc_attr($icon); ?>"></i>
</a>
<?php } else {
$href = $base_term_url !== ''
? add_query_arg(['orderby' => 'price'], $base_term_url)
: add_query_arg(['orderby' => 'price']);
?>
<a rel="nofollow" ajax-replace="true" class="ajax-next" href="<?php echo esc_url($href); ?>" data-aksrt-shop-orderby="price">
<?php esc_html_e('售价', 'aksrt'); ?>
</a>
<?php } ?>
</div>
</div>