feat(admin): order detail view, invite-code batching, product tag term fields
Add native order detail page under 支付中心订单, standalone invite-code batch generate/disable on users.php, and aksrt_product_tag taxonomy form fields. Source only; no SPA build artifacts.
This commit is contained in:
@@ -286,6 +286,13 @@ class AKSRT_Admin_Pay_Menus {
|
||||
return;
|
||||
}
|
||||
|
||||
$detail_order = isset($_GET['order']) ? sanitize_text_field((string) wp_unslash($_GET['order'])) : '';
|
||||
if ($detail_order !== '') {
|
||||
$this->render_order_detail_page($detail_order);
|
||||
$this->render_footer();
|
||||
return;
|
||||
}
|
||||
|
||||
$status = isset($_GET['status']) ? sanitize_key((string) wp_unslash($_GET['status'])) : '';
|
||||
$search = isset($_GET['s']) ? sanitize_text_field((string) wp_unslash($_GET['s'])) : '';
|
||||
$page_num = max(1, (int) ($_GET['paged'] ?? 1));
|
||||
@@ -353,7 +360,8 @@ class AKSRT_Admin_Pay_Menus {
|
||||
echo '<td>' . esc_html(number_format((float) ($row['amount'] ?? 0), 2)) . ' ' . esc_html((string) ($row['currency'] ?? '')) . '</td>';
|
||||
echo '<td>' . esc_html($status_label) . '</td>';
|
||||
echo '<td>' . esc_html((string) ($row['created_at'] ?? '')) . '</td>';
|
||||
echo '<td>';
|
||||
echo '<td style="display:flex;gap:6px;flex-wrap:wrap;align-items:center;">';
|
||||
echo '<a class="button button-small" href="' . esc_url($this->page_url('aksrt_orders', ['order' => $order_number])) . '">' . esc_html__('详情', 'aksrt') . '</a>';
|
||||
echo '<form method="post" action="' . esc_url(admin_url('admin-post.php')) . '" style="display:flex;gap:4px;align-items:center;">';
|
||||
echo '<input type="hidden" name="action" value="aksrt_pay_update_order_status" />';
|
||||
echo '<input type="hidden" name="order_number" value="' . esc_attr($order_number) . '" />';
|
||||
@@ -392,6 +400,102 @@ class AKSRT_Admin_Pay_Menus {
|
||||
$this->render_footer();
|
||||
}
|
||||
|
||||
private function render_order_detail_page(string $order_number): void {
|
||||
$repo = AKSRT_Order_Repository::get_instance();
|
||||
$order = $repo->get($order_number);
|
||||
if (!$order) {
|
||||
echo '<div class="notice notice-error"><p>' . esc_html__('订单不存在。', 'aksrt') . '</p></div>';
|
||||
echo '<p><a class="button" href="' . esc_url($this->page_url('aksrt_orders')) . '">' . esc_html__('返回订单列表', 'aksrt') . '</a></p>';
|
||||
return;
|
||||
}
|
||||
|
||||
$labels = class_exists('AKSRT_Domain_Model')
|
||||
? AKSRT_Domain_Model::order_status_labels()
|
||||
: [];
|
||||
$context = $repo->get_admin_order_context($order_number);
|
||||
$user_id = (int) ($order['user_id'] ?? 0);
|
||||
$user = $user_id > 0 ? get_userdata($user_id) : null;
|
||||
$status = (string) ($order['status'] ?? '');
|
||||
|
||||
$shipping_items = class_exists('AKSRT_Shipping')
|
||||
? AKSRT_Shipping::get_instance()->get_by_order($order_number)
|
||||
: [];
|
||||
$after_sale = class_exists('AKSRT_After_Sale')
|
||||
? (AKSRT_After_Sale::get_instance()->get_list(['order_number' => $order_number, 'limit' => 20])['items'] ?? [])
|
||||
: [];
|
||||
|
||||
echo '<p><a class="button" href="' . esc_url($this->page_url('aksrt_orders')) . '">← ' . esc_html__('返回订单列表', 'aksrt') . '</a></p>';
|
||||
|
||||
echo '<table class="widefat striped" style="max-width:960px;"><tbody>';
|
||||
$rows = [
|
||||
__('订单号', 'aksrt') => $order_number,
|
||||
__('用户', 'aksrt') => $user ? $user->display_name . ' (#' . $user_id . ')' : (string) $user_id,
|
||||
__('商品类型', 'aksrt') => (string) ($order['product_type'] ?? ''),
|
||||
__('商品 ID', 'aksrt') => (string) ($order['product_id'] ?? ''),
|
||||
__('金额', 'aksrt') => number_format((float) ($order['amount'] ?? 0), 2) . ' ' . (string) ($order['currency'] ?? ''),
|
||||
__('状态', 'aksrt') => $labels[$status] ?? $status,
|
||||
__('支付方式', 'aksrt') => (string) ($order['payment_method'] ?? ''),
|
||||
__('交易号', 'aksrt') => (string) ($order['payment_transaction_id'] ?? ''),
|
||||
__('创建时间', 'aksrt') => (string) ($order['created_at'] ?? ''),
|
||||
__('支付时间', 'aksrt') => (string) ($order['paid_at'] ?? ''),
|
||||
__('备注', 'aksrt') => (string) ($order['note'] ?? ''),
|
||||
];
|
||||
foreach ($rows as $label => $value) {
|
||||
echo '<tr><th style="width:160px;">' . esc_html($label) . '</th><td>' . esc_html((string) $value) . '</td></tr>';
|
||||
}
|
||||
if (!empty($context)) {
|
||||
echo '<tr><th>' . esc_html__('附加上下文', 'aksrt') . '</th><td><pre style="white-space:pre-wrap;margin:0;">' . esc_html(wp_json_encode($context, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)) . '</pre></td></tr>';
|
||||
}
|
||||
echo '</tbody></table>';
|
||||
|
||||
echo '<h2 style="margin-top:20px;">' . esc_html__('更新状态', 'aksrt') . '</h2>';
|
||||
echo '<form method="post" action="' . esc_url(admin_url('admin-post.php')) . '" style="display:flex;gap:8px;align-items:center;">';
|
||||
echo '<input type="hidden" name="action" value="aksrt_pay_update_order_status" />';
|
||||
echo '<input type="hidden" name="order_number" value="' . esc_attr($order_number) . '" />';
|
||||
echo '<input type="hidden" name="redirect_order" value="' . esc_attr($order_number) . '" />';
|
||||
wp_nonce_field('aksrt_pay_update_order_status_' . $order_number);
|
||||
echo '<select name="new_status">';
|
||||
foreach ($labels as $key => $label) {
|
||||
printf('<option value="%s"%s>%s</option>', esc_attr($key), selected($status, $key, false), esc_html($label));
|
||||
}
|
||||
echo '</select> ';
|
||||
submit_button(__('保存状态', 'aksrt'), 'primary', '', false);
|
||||
echo '</form>';
|
||||
|
||||
echo '<h2 style="margin-top:24px;">' . esc_html__('物流记录', 'aksrt') . '</h2>';
|
||||
if (!$shipping_items) {
|
||||
echo '<p>' . esc_html__('暂无物流记录。', 'aksrt') . ' <a href="' . esc_url($this->page_url('aksrt_shipping')) . '">' . esc_html__('去物流管理', 'aksrt') . '</a></p>';
|
||||
} else {
|
||||
echo '<table class="widefat striped"><thead><tr><th>ID</th><th>' . esc_html__('承运商', 'aksrt') . '</th><th>' . esc_html__('运单号', 'aksrt') . '</th><th>' . esc_html__('状态', 'aksrt') . '</th><th>' . esc_html__('时间', 'aksrt') . '</th></tr></thead><tbody>';
|
||||
foreach ($shipping_items as $item) {
|
||||
echo '<tr>';
|
||||
echo '<td>' . esc_html((string) ($item['id'] ?? '')) . '</td>';
|
||||
echo '<td>' . esc_html((string) ($item['carrier'] ?? '')) . '</td>';
|
||||
echo '<td>' . esc_html((string) ($item['tracking_no'] ?? '')) . '</td>';
|
||||
echo '<td>' . esc_html((string) ($item['status'] ?? '')) . '</td>';
|
||||
echo '<td>' . esc_html((string) ($item['created_at'] ?? '')) . '</td>';
|
||||
echo '</tr>';
|
||||
}
|
||||
echo '</tbody></table>';
|
||||
}
|
||||
|
||||
echo '<h2 style="margin-top:24px;">' . esc_html__('售后工单', 'aksrt') . '</h2>';
|
||||
if (!$after_sale) {
|
||||
echo '<p>' . esc_html__('暂无售后工单。', 'aksrt') . ' <a href="' . esc_url($this->page_url('aksrt_after_sale')) . '">' . esc_html__('去售后管理', 'aksrt') . '</a></p>';
|
||||
} else {
|
||||
echo '<table class="widefat striped"><thead><tr><th>ID</th><th>' . esc_html__('类型', 'aksrt') . '</th><th>' . esc_html__('状态', 'aksrt') . '</th><th>' . esc_html__('时间', 'aksrt') . '</th></tr></thead><tbody>';
|
||||
foreach ($after_sale as $item) {
|
||||
echo '<tr>';
|
||||
echo '<td>' . esc_html((string) ($item['id'] ?? '')) . '</td>';
|
||||
echo '<td>' . esc_html((string) ($item['type'] ?? '')) . '</td>';
|
||||
echo '<td>' . esc_html((string) ($item['status'] ?? '')) . '</td>';
|
||||
echo '<td>' . esc_html((string) ($item['created_at'] ?? '')) . '</td>';
|
||||
echo '</tr>';
|
||||
}
|
||||
echo '</tbody></table>';
|
||||
}
|
||||
}
|
||||
|
||||
public function handle_update_order_status(): void {
|
||||
if (!current_user_can(self::CAPABILITY)) {
|
||||
wp_die(esc_html__('权限不足', 'aksrt'));
|
||||
@@ -406,9 +510,13 @@ class AKSRT_Admin_Pay_Menus {
|
||||
$ok = AKSRT_Order_Repository::get_instance()->update_status($order_number, $new_status, ['force' => true]);
|
||||
}
|
||||
|
||||
wp_safe_redirect($this->page_url('aksrt_orders', [
|
||||
'aksrt_pay_msg' => $ok ? 'order_updated' : 'order_failed',
|
||||
]));
|
||||
$args = ['aksrt_pay_msg' => $ok ? 'order_updated' : 'order_failed'];
|
||||
$redirect_order = isset($_POST['redirect_order']) ? sanitize_text_field((string) wp_unslash($_POST['redirect_order'])) : '';
|
||||
if ($redirect_order !== '') {
|
||||
$args['order'] = $redirect_order;
|
||||
}
|
||||
|
||||
wp_safe_redirect($this->page_url('aksrt_orders', $args));
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user