5.6 KiB
5.6 KiB
公开用户主页去参数化 + 全链路无刷新加载
目标
/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()(该函数保留,用户中心仍在用)。
- posts/favorites 不再用
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-*.phpbody 模板存在且调用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 加载(无兼容代码)。