Files
wordpress-theme-aksrt/.zcode/plans/plan-sess_c373fb29-30ab-4cd5-8649-5347223b88e2.md
T

5.6 KiB
Raw Blame History

公开用户主页去参数化 + 全链路无刷新加载

目标

/author/demo/ 的 URL 永远干净(无 ?tab=、follow_sub、follow_page、posts_page 等),Tab 切换、粉丝/关注子切换、各面板分页全部走 REST AJAX 无刷新加载。单路径实现,不写双路/兼容/迁移代码。

现状:主 Tab 已是 DOM 切换,但 author.js 会把 ?tab= 写进 URL;follow 子切换和 comments/follow 分页是带参整页链接;posts/favorites 分页走 aksrt_render_pagination()(numbered 模式产出 ?posts_page=N 链接;load_more/infinite 走 admin-ajax)。

服务端

1. 上下文构建 — inc/helpers/aksrt-user-home.php

  • aksrt_get_user_home_page_context() 删除全部 $_GET 读取(第 104、134-136 行):active_tab 恒等于 default_tab,三个 page 恒为 1(保留键,供 REST 覆写);新增 follow_page => 1、follow_sub => 'followers' 键。
  • 新增 aksrt_render_user_home_pagination(int $total, int $current):输出 <nav class="profile-pagination uh-pagination"> + <button type="button" class="page-numbers" data-uh-page="N">(当前页带 current 类,含 ‹ › 前后页),复用现有 .profile-pagination 样式(lists.css:331+)。
  • 新增 aksrt_capture_user_home_panel(string $tab, array $ctx): string:locate_template('templates/parts/user-home/panel-{$tab}.php') + ob_start 捕获(仿 aksrt_capture_user_center_panel,aksrt-user-center.php:199)。

2. 面板模板重构 — templates/parts/user-home/

  • 删除 panels-core.php,拆为按面板 body 模板:panel-posts.php、panel-comments.php、panel-favorites.php、panel-credits.php;panel-follow.php 改为纯 body(去掉外层 wrapper,第 21-23 行 $_GET 读取改为从 $args 取 $follow_page/$follow_sub)。
  • page-user-home.php:dashboard 根节点加 data-user-id="<?php echo (int) $user_id; ?>";循环 $enabled_tabs,对存在 body 模板的 tab 输出 <div id="panel-{tab}" class="dashboard-panel…"> wrapper + get_template_part('templates/parts/user-home/panel', $tab, $ctx)。
  • 各 body 分页统一改用 aksrt_render_user_home_pagination():
    • posts/favorites 不再用 aksrt_render_pagination()(本页退出全站三模式分页体系);
    • comments 不再用 aksrt_render_profile_pagination()(该函数保留,用户中心仍在用)。
  • panel-follow.php 子切换 <a href="?tab=follow&…">(第 40、47 行)→ <button type="button" data-uh-sub="followers|following">;paginate_links(第 63-69 行)→ 新分页渲染器。

3. REST 端点 — src/User/Home.php(仿 src/User/Center.php:34-110)

  • init() 挂 rest_api_init;路由 GET aksrt/v1/user-home/panel/(?P<user_id>\d+)/(?P<tab>[a-z0-9_-]+),query 参数 page(int ≥1)、sub(followers|following),permission_callback => '__return_true'(公开数据)。
  • rest_panel():校验用户存在 → aksrt_get_user_home_page_context() 重建上下文 → 用请求参数覆写 active_tab、对应 page、follow_sub → tab 不在 enabled_tabs(如 credits 非本人)返回 404 → 捕获 body → 返回 {success:true, data:{tab, html}}。

前端 — assets/js/author.js

  • 删除 updateTabUrl()(第 15-24 行)与 resolveInitialTab()(第 70-73 行):不再读写任何 URL 参数,初始态以服务端渲染的 is-active/data-default-tab 为准。
  • 新增 loadPanelBody(tab, page, sub):fetch(aksrtData.apiUrl + '/user-home/panel/{data-user-id}/{tab}?page=N(&sub=X)', {credentials:'same-origin', headers:{'X-WP-Nonce': aksrtData.restNonce}}) → panel.innerHTML = data.html → AksrtFrontend.rehydrate(panel, 'ajax');per-panel 请求去重防竞态(仿 user-center.js _aksrtPanelRequest);is-loading 态 + 失败 notyf 提示。
  • dashboard 根上事件委托(覆盖 AJAX 注入的新按钮):
    • [data-uh-sub] → 加载 follow 面板 sub=X, page=1;
    • [data-uh-page] → btn.closest('.dashboard-panel') 得 tab,panel.dataset.uhSub(默认 followers)得子项,加载对应页。
  • URL 永不变更(无 pushState/replaceState)。follow.js 是 document 级委托,注入的 minicard 关注按钮自动可用,无需改动。

附带清理与 CSS

  • templates/parts/submit/editor-main.php:106-108:「查看草稿」现指向公开主页 + ?tab=post&post_status=draft(公开主页从未支持该参数,本就错位)。改为 add_query_arg('post_status', 'draft', aksrt_get_user_center_tab_url('posts'))(用户中心支持该过滤,posts-list.php:14-16)。
  • assets/css/routes/user-home.css:button.page-numbers 复位 + hover 态(现 hover 选择器只覆盖 a.page-numbers);.uh-follow__subtab 改 button 后的复位;.dashboard-panel.is-loading 半透明过渡。

测试与验证

  • 更新 tests/widget-system/post-visual-contract.test.cjs:移除 panels-core.php/page_var 断言(第 39、205、222-224、328-330 行),改为断言:各 panel-*.php body 模板存在且调用 aksrt_render_user_home_pagination;user-home 模板无 $_GET/add_query_arg;author.js 无 searchParams(防回归契约)。
  • php -l 全部改动 PHP 文件;node --test tests/widget-system/post-visual-contract.test.cjs。

明确的行为变化(单路径的直接结果)

  • 公开主页 posts/favorites 分页不再跟随后台「文章分页模式」(numbered/加载更多/无限滚动)设置,统一为本页 AJAX 数字分页。
  • 刷新/分享/回退永远回到默认 Tab 第 1 页(URL 无状态,需求本身决定)。
  • 旧外链 ?tab=follow 不解析不重定向,按默认 Tab 加载(无兼容代码)。