diff --git a/src/Admin/Native/AdminListPagination.php b/src/Admin/Native/AdminListPagination.php index 6e5891fc..299cb63b 100644 --- a/src/Admin/Native/AdminListPagination.php +++ b/src/Admin/Native/AdminListPagination.php @@ -2,13 +2,22 @@ /** * @package AKSRT * - * 后台列表页分页条(WP 原生 paginate_links)。 + * 后台列表页分页条 —— 1:1 复刻「卡密管理」页的 zibpay_admin_pagenavi 结构。 * * 支付中心各页面(订单明细 / 售后服务 / 付费文章 / 优惠码 / 创作分成 / 提现审核 / 卡密管理) - * 原先各写一份几乎相同的 paginate_links 调用,且基准 URL 都写成 - * add_query_arg('paged', '%#%') —— 只有两个参数时 WordPress 会退到 - * $_SERVER['REQUEST_URI'],链接绑在当前请求上,随请求形态漂移,列条件也容易丢。 - * 这里统一到一处:显式以「page 参数 + 当前筛选参数」为基准拼装,页码先夹到有效范围。 + * 原先各写一份几乎相同的翻页代码。这里统一到一处,标记沿用卡密管理那一套: + * `« ‹ 第 X 页,共 Y 页 › »` 四枚按钮 + 「每页 X 共Y」计数,没有数字页码链接。 + * + * 与参考实现的两处差异,均为缺陷修复: + * 1) 基准 URL 显式以「page 参数 + 当前筛选参数」拼装。历史写法里 add_query_arg('paged', N) + * 只有两个参数时会落到 $_SERVER['REQUEST_URI'],链接绑在当前请求上,随请求形态 + * 漂移,列条件也容易丢。 + * 2) 页码先夹到 [1, total_pages],禁用状态由夹取后的页码推导。历史写法在此处会留下 + * 「第 2 页 / 共 1 页」这类越界状态,四个分支一个都不命中,上一页/下一页同时停在 + * '#':按钮既不禁用也点不动。 + * + * 单页也渲染分页条(只要总数 > 0):与参考实现一致,运营能直接看到「每页 20 共 5」 + * 这样的口径,四枚按钮全 disabled 也明确了「没有更多页」。 */ namespace AKSRT\Admin\Native; @@ -20,12 +29,14 @@ class AdminListPagination { /** 每页条数默认值。所有列表页一致,且不提供「每页显示」控件。 */ public const DEFAULT_PER_PAGE = 20; + /** @var bool 内联样式只输出一次 */ + private static $assets_printed = false; + /** * 渲染分页条。 * - * 页码夹取到 [1, total_pages] 再决定渲染与否:历史写法在此处会留下「第 2 页 / 共 1 页」 - * 这类越界状态。真正的数据回退(数据也要跟着落到最后一页)由各页面在查询前完成, - * 这里只负责把显示状态收敛到自洽。 + * 真正的数据回退(数据也要跟着落到最后一页)由各页面在查询前完成,这里只把页码 + * 夹到有效范围,保证显示状态自洽。 * * @param string $page_slug 当前 admin.php 的 page 参数。 * @param int $total_count 当前筛选条件下的记录总数。 @@ -44,31 +55,57 @@ class AdminListPagination { return; } + self::print_assets(); + $total_pages = max(1, (int) ceil($total_count / $per_page)); $current_page = min(max(1, $current_page), $total_pages); - if ($total_pages <= 1) { + // 显式基准 URL:不再让 add_query_arg() 只有两个参数时退回 $_SERVER['REQUEST_URI']。 + $base = add_query_arg(array_merge(['page' => $page_slug], $query_args), admin_url('admin.php')); + $page_url = static function (int $page) use ($base): string { + return add_query_arg('paged', $page, $base); + }; + + $on_first = $current_page <= 1; + $on_last = $current_page >= $total_pages; + + $first_page_url = $on_first ? '#' : $page_url(1); + $prev_page_url = $on_first ? '#' : $page_url($current_page - 1); + $next_page_url = $on_last ? '#' : $page_url($current_page + 1); + $last_page_url = $on_last ? '#' : $page_url($total_pages); + ?> +
+ $page_slug], $query_args), admin_url('admin.php')); - $base = add_query_arg('paged', '%#%', $base); - - echo '