title: Joe主题再续前缘1.4版:后台订单统计总额功能详解
date: 2025-09-18 12:00:00
tags: [joe主题, 再续前缘, 订单统计, typecho]
category: 主题教程
cover: https://www.3cym.com/usr/uploads/2025/09/2409291984.jpg
功能一句话
后台「订单管理」顶部实时显示:总订单数、已支付金额、未支付金额等 6 项关键数据,无需插件,开箱即用。
效果预览

核心代码(已内置)
📎 点击查看 /admin/orders.php 完整源码(已折叠)
<?php
require_once TYPECHO_ADMIN_ROOT . 'header.php';
require_once TYPECHO_ADMIN_ROOT . 'menu.php';
require_once __DIR__ . '/widget.php';
$orders_url = '../themes/' . THEME_NAME . '/admin/orders.php';
$panel_url = $options->adminUrl . 'extending.php?panel=' . urlencode($orders_url);
/* =========================================================
* 把整张表一次性读出来,用 PHP 算数字
* ========================================================= */
$db = Typecho_Db::get();
$rows = $db->fetchAll($db->select()->from('table.orders'));
$totalOrders = $totalPaidOrders = $totalUnpaidOrders = 0;
$totalAmount = $totalPaidAmount = $totalUnpaidAmount = 0; // 单位:分
foreach ($rows as $r) {
$totalOrders++;
$money = intval(round(floatval($r['money']) * 100));
$pay = intval(round(floatval($r['pay_price']) * 100));
$status = (int)$r['status']; // 1 已支付,0 未支付
$totalAmount += $money;
if ($status === 1) {
$totalPaidOrders++;
$totalPaidAmount += $pay;
} else {
$totalUnpaidOrders++;
$totalUnpaidAmount += ($money - $pay);
}
}
// 转回元
$totalAmountYuan = number_format($totalAmount / 100, 2, '.', '');
$totalPaidAmountYuan = number_format($totalPaidAmount / 100, 2, '.', '');
$totalUnpaidAmountYuan = number_format($totalUnpaidAmount / 100, 2, '.', '');
/* =========================================================
* 下面负责展示
* ========================================================= */
$orders = Typecho\Widget::widget('JoeOrders\Widget');
?>
<style>
.stats{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:15px;padding:10px;background:#f9f9f9;border:1px solid #ddd;font-size:13px}
.stats>div{flex:1 1 110px;text-align:center}
.stats strong{display:block;font-size:15px;color:#333}
</style>
<div class="main">
<div class="body container">
<div class="typecho-page-title"><h2>订单管理</h2></div>
<div class="row typecho-page-main" role="main">
<div class="col-mb-12 typecho-list">
<!-- 统计卡片(使用 PHP 计算好的结果) -->
<div class="stats">
<div>总订单 <strong><?php echo $totalOrders; ?></strong></div>
<div>已支付订单 <strong><?php echo $totalPaidOrders; ?></strong></div>
<div>未支付订单 <strong><?php echo $totalUnpaidOrders; ?></strong></div>
<div>订单总额 <strong><?php echo $totalAmountYuan; ?>元</strong></div>
<div>已支付金额 <strong><?php echo $totalPaidAmountYuan; ?>元</strong></div>
<div>未支付金额 <strong><?php echo $totalUnpaidAmountYuan; ?>元</strong></div>
</div>
<!-- 以下保持你原先的业务代码,一字未改 -->
<div class="typecho-list-operate clearfix">
<form method="get" action="<?php $options->adminUrl('extending.php'); ?>">
<input type="hidden" name="panel" value="<?= '../themes/' . THEME_NAME . '/admin/orders.php' ?>" />
<div class="operate">
<label><i class="sr-only"><?php _e('全选'); ?></i><input type="checkbox" class="typecho-table-select-all" /></label>
<div class="btn-group btn-drop">
<button class="btn dropdown-toggle btn-s" type="button"><i class="sr-only"><?php _e('操作'); ?></i><?php _e('选中项'); ?> <i class="i-caret-down"></i></button>
<ul class="dropdown-menu">
<li><a lang="<?php _e('你确认要删除这些订单吗?'); ?>" href="<?= $panel_url . '&action=delete' ?>"><?php _e('删除') ?></a></li>
</ul>
<button lang="你确认要清理所有未支付订单吗?" class="btn btn-s btn-warn btn-operate" href="<?= $panel_url . '&action=clear' ?>">清理所有未支付订单</button>
</div>
</div>
<div class="search" role="search">
<?php if ('' != $request->keywords): ?>
<a href="<?= $panel_url ?>"><?php _e('« 取消筛选'); ?></a>
<?php endif; ?>
<input type="text" class="text-s" placeholder="<?php _e('请输入关键字'); ?>" value="<?php echo $request->filter('html')->keywords; ?>" name="keywords" />
<select class="search-type" name="type">
<option value=""><?php _e('支付方式'); ?></option>
<?php foreach (['wxpay' => '微信', 'alipay' => '支付宝', 'qqpay' => 'QQ'] as $id => $name) : ?>
<option value="<?php echo $id; ?>" <?php if ($request->get('type') == $id) : ?> selected="true" <?php endif; ?>><?php echo $name; ?></option>
<?php endforeach; ?>
</select>
<select class="search-status" name="status">
<option value=""><?php _e('支付状态'); ?></option>
<?php foreach (['1' => '已支付', '0' => '未支付'] as $id => $name) : ?>
<option value="<?php echo $id; ?>" <?= $request->get('status', 2) == $id ? 'selected="true"' : null ?>><?php echo $name; ?></option>
<?php endforeach; ?>
</select>
<button type="submit" class="search-btn btn btn-s"><?php _e('筛选'); ?></button>
</div>
</form>
</div><!-- end .typecho-list-operate -->
<form method="post" name="manage_users" class="operate-form">
<div class="typecho-table-wrap">
<table class="typecho-list-table">
<colgroup>
<col width="25px" />
<col width="130px" />
<col width="150px" />
<col width="200px" />
<col width="60px" />
<col width="60px" />
<col width="100px" />
<col width="50px" />
<col width="60px" />
<col width="60px" />
<col width="60px" />
<col width="130px" />
</colgroup>
<thead>
<tr>
<th></th>
<th>订单号</th>
<th>接口订单号</th>
<th>文章标题</th>
<th>支付方式</th>
<th>订单金额</th>
<th>用户IP</th>
<th>用户ID</th>
<th>实付金额</th>
<th>通知管理</th>
<th>通知用户</th>
<th>创建时间</th>
</tr>
</thead>
<tbody>
<?php if ($orders->have()) : ?>
<?php while ($orders->next()) : ?>
<tr id="<?php $orders->id(); ?>">
<td><input type="checkbox" value="<?php $orders->id(); ?>" name="id[]" /></td>
<td><?php $orders->trade_no(); ?></td>
<td><?php $orders->api_trade_no(); ?></td>
<td><?php $orders->content_title(); ?></td>
<td><?php $orders->typeName(); ?></td>
<td><?php $orders->money(); ?></td>
<td><?php $orders->ip(); ?></td>
<td><?php $orders->user_id(); ?></td>
<td><?php $orders->pay_price(); ?></td>
<td><?php $orders->admin_email(); ?></td>
<td><?php $orders->user_email(); ?></td>
<td><?php $orders->create_time(); ?></td>
</tr>
<?php endwhile; ?>
<?php else : ?>
<tr class="even">
<td colspan="12">
<h6 class="typecho-list-table-title"><?php _e('当前无订单'); ?></h6>
</td>
</tr>
<?php endif; ?>
</tbody>
</table><!-- end .typecho-list-table -->
</div><!-- end .typecho-table-wrap -->
</form><!-- end .operate-form -->
<div class="typecho-list-operate clearfix">
<form method="get">
<?php if ($orders->have()): ?>
<ul class="typecho-pager">
<?php $orders->pageNav(); ?>
</ul>
<?php endif; ?>
</form>
</div>
<!-- end .typecho-list-operate -->
</div><!-- end .typecho-list -->
</div><!-- end .typecho-page-main -->
</div>
</div>
<?php
include 'copyright.php';
include 'common-js.php';
include 'table-js.php';
include 'footer.php';
?>