本篇目录
以前要给Wordpress站点换个主题还得到处找主题、模板,后面好不容找了个不错的模板用了没多久站点被挂马黑了(大抵是藏了后门),最后只能找了个免费的官方模板然后自己修改css样式这些用了不少年。
最近花了10天的闲余时间借助TraeWork给我的WP站点主题来了个大魔改,效果还不错。如果你恰巧还有WP站点想优化下主题或许可以参考下。
一、让TraeWork分析下站点
现在的桌面智能体大抵都能直接或借助插件操控浏览器,TraeWork、WorkBuddy、千问办公 这些办公类的桌面智能体会自己实现浏览器控制。开工指令如下:
https://ranjuan.cn/ 这个站点使用的wordpress搭建的,看下主题样式能不能优化下,给个优化方案是页面布局、样式符合站点内容,且能在主体模版中进行修改输入指令后TraeWork 就操作浏览器访问了网址并进行内容分析,分析结果提到了“使用子主题”,这个建议还不错,而且风险可控可以回退。为了避免影响线上站点,在修改主题前可以自己搭建一个测试站点来测试效果。
二、开始优化主题
直接下载WP主题然后丢给Trae让其直接基于这个主题创建子主题即可。
我把主题spicepress完整下载下来了,请你帮我实现子主体所有功能代码最终会生成子主题文件夹,进入Wordpress后台选择这个子主题即可预览效果(Trae 也给了部署及配置说明)
如果效果不符合预期也很正常,这需要跟AI不断沟通、调整、测试、修复,全部纯聊天或截图式开发。首页、侧栏小工具、导航菜单、底部页脚、文章详情等都可以修改,你也可以给一个别人的Wordpress站点url让Trae参考着修改或直接重新实现一个主题!
(以下为部分沟通过程)
遇到的问题基本不超过3轮AI就能解决,主要是主题样式冲突、函数引用错误、移动端适配。这次我还让新增了深色模式切换、标签词云、侧拉搜索、AI工具页面。
三、最终效果
1、首页,增加AI实操系列置顶区块,增加明暗模式切换

2、新增的深色模式(深色模式也有限制,截图、内嵌html等内容是没办法调整的)

3、新增的“AI工具记录”自定义页面
在主题的template文件夹下可以创建自定义“模板”然后在Wordpress后台新增一个页面后可以设置关联这个模板(我这个页面是先让AI开发了一个html网页,然后复制body部分代码到template-aitools.php这个模板文件里面)。最后在菜单编辑中把这个页面添加为菜单即可。当然自定义模板怎么开发、实现也可以直接问AI,比用搜索引擎更快得到结果。

template文件夹下文件需要符合前缀条件的php文件才会视为模板,且需要指定注释中的Template Name 做为WP后台选择模板时的模板名(如上图我的新模板名为“AI工具笔记”)

添加页面到主菜单中,即可实现wp站点菜单点击后跳转自定义页面。


全程到最终上线完成断断续续沟通了30轮左右,如果有些bug修复多次没解决可以关闭Auto模型选择,切换使用GLM5.3、Kimi K3、DeepSeek V4 模型来解决。

四、skill经验分享
整个过程已让Trae总结成了skill,如果你也有WP主题改造的需求可以让AI参考阅读下这个skill(不建议安装这个skill),因为是我改造自己主题总结的所以这个skill肯定是有局限性的没有那么通用。

*** name: "wordpress-child-theme-customization"description: "WordPress 子主题改造经验集,覆盖 CSS 布局/深浅模式/响应式、JS 动画与交互(3D 标签球)、PHP 入队、性能与内存优化。在改造 WordPress 子主题、覆写父主题样式、实现 3D 动画组件或排查前端内存/性能问题时调用。"----------------------------------------------------------------------------------------------------------------------------------------- # WordPress 子主题改造经验集 针对 SpicePress 等经典父主题的子主题二次开发,沉淀布局、深浅模式、动画组件、性能优化等可复用经验。 *** ## 一、CSS 覆写策略 ### 1. 特异性(Specificity)优先 父主题样式权重高,子主题直接写相同选择器通常盖不住。统一在 `<body>` 加自定义类(如 `body.rj-body`),所有覆写选择器以 `body.rj-body` 开头,必要时加 `!important`。 ```cssbody.rj-body .sidebar .widget { ... }``` ### 2. 深浅模式用 CSS 变量 + `data-theme` - 在 `<html>` 上切换 `data-theme="dark"` / `"light"` - 所有颜色用变量(`--rj-bg`、`--rj-text`、`--rj-brand` 等),深浅两套值 - 深色模式覆写:`html[data-theme="dark"] body.rj-body { ... }` ### 3. Sticky Footer 实现 用 flexbox 而非绝对定位,避免内容长时 footer 覆盖内容: ```css#wrapper { display: flex; flex-direction: column; min-height: 100vh; }.site-footer { margin-top: auto; }``` ### 4. 标签云兼容性 WordPress 标签云有两种 DOM:经典编辑器 `div.tagcloud`、区块编辑器 `p.wp-block-tag-cloud`。CSS 选择器必须同时覆盖: ```css.sidebar .widget_tag_cloud .tagcloud a,.sidebar .widget_tag_cloud .wp-block-tag-cloud a { ... }``` *** ## 二、3D 标签球(核心组件) ### 1. 球面分布:斐波那契算法 均匀铺点,避免两极堆积: ```jsvar golden = Math.PI * (3 - Math.sqrt(5));for (var i = 0; i < N; i++) { var y = 1 - (i / (N - 1)) * 2; // y: 1 -> -1 var r = Math.sqrt(1 - y * y); var theta = golden * i; items.push({ x: Math.cos(theta) * r, y: y, z: Math.sin(theta) * r });}``` ### 2. 旋转矩阵(先绕 Y 再绕 X) ```jsvar x1 = p.x * cosY - p.z * sinY;var z1 = p.x * sinY + p.z * cosY;var y2 = p.y * cosX - z1 * sinX;var z2 = p.y * sinX + z1 * cosX;``` ### 3. 定位:避免"双重居中" CSS 已用 `top:50%; left:50%` 把标签锚定在容器中心,JS 的 `translate3d` 只需相对中心的偏移量,**不要再加容器中心坐标**,否则标签全跑到右下角。 ```jsvar px = pr.x * radius; // 正确:仅偏移量var py = pr.y * radius;el.style.transform = 'translate3d(' + px + 'px,' + py + 'px,0) translate(-50%,-50%)';``` ### 4. 拖拽方向:要取反 鼠标向右拖,直觉上球体应向右转。3D 数学上 `angleY` 增大会让正面点向左移,所以必须**取反**: ```jsangleY -= dx * 0.006; // 不是 +=angleX -= dy * 0.006;``` ### 5. 拖拽必须 `preventDefault` `<a>` 标签有原生"拖拽链接"行为,会劫持 `mousemove`,导致"按住不跟手、松开才转"。`mousedown` 里必须 `e.preventDefault()`。 ### 6. 拖拽与点击区分 移动超过 4px 判定为拖拽,阻止 click 跳转: ```jsif (!moved && (Math.abs(dx) > 4 || Math.abs(dy) > 4)) moved = true;$cloud.on('click', 'a', function (e) { if (moved) e.preventDefault(); });``` ### 7. 字号控制:用 `font-size` 而非 `transform: scale` `scale()` 是 GPU 缩放栅格化后的文字,会模糊。直接设 `font-size` 让浏览器按目标字号渲染,文字清晰。 ```jsel.style.fontSize = (baseFont * depthFactor * countFactor).toFixed(1) + 'px';``` ### 8. 文章数量加权字号 从 `aria-label="标签名 (N 项)"` 提取数量,归一化后作为字号系数: ```jsvar cm = (el.getAttribute('aria-label') || '').match(/(\d+)/);var count = cm ? parseInt(cm[1], 10) : 1;// 归一化到 0..1 后映射为 0.8 ~ 1.35 的字号系数``` ### 9. 移入暂停、移出恢复自转 ```js$cloud.on('mouseenter', function () { hovering = true; });$cloud.on('mouseleave', function () { hovering = false; });// render 里:if (!dragging && !hovering) { angleY += AUTO_SPEED + velY; ... }``` ### 10. `dragging` 状态兜底 鼠标在窗口外松开会导致 `dragging` 卡住、自转停止。加 `document.mouseleave` 重置。 *** ## 三、性能与内存优化(重点) ### 1. DevTools 内存暴涨问题 **现象**:开着 F12 时间长了内存几个 G,关掉就恢复。**根因**:`requestAnimationFrame` 每帧对多个元素设置多个 inline 样式,DevTools 的 Elements 面板会记录每一次 DOM 样式变更,记录不断累积。 **优化**: - **合并样式写入**:用 `el.style.cssText` 一次性写入多个属性,只触发 1 次 DOM 变更(原来 4 次): ```js el.style.cssText = 'transform:...;font-size:...;opacity:...;z-index:...;'; ``` - **页面隐藏时暂停动画**: ```js if (!document.hidden) requestAnimationFrame(render); document.addEventListener('visibilitychange', function () { if (!document.hidden) requestAnimationFrame(render); }); ``` - **移除冗余** **`will-change`**:`translate3d` 本身已创建合成层,`will-change` 多余且增加 DevTools 追踪的合成层数量。 - **`px/py`** **取整**:避免亚像素定位导致边缘模糊和额外重绘。 ### 2. 滚动性能 - 用 `requestAnimationFrame` 节流滚动回调 - 避免在滚动回调里直接读写布局属性(防 reflow) - 用事件委托减少监听器数量 *** ## 四、PHP 入队规范 - 子主题 CSS 依赖父主题样式:`wp_enqueue_style( 'child', ..., array('parent-style'), '版本号' )` - 每次改 CSS/JS 都要**递增版本号**,否则浏览器缓存旧文件 - JS 放 `wp_footer`(第 5 个参数 `true`),避免阻塞渲染 *** ## 五、响应式断点 - 768px:手机 / 平板分界 - 992px:平板 / 小桌面 - 1130px:内容最大宽度 移动端菜单易被父主题媒体查询覆盖,用高特异性选择器(`body.rj-body`)锁定。 *** ## 六、常见坑点清单 | 坑 | 表现 | 解法 || ---------- | ----------------------- | --------------------------------------- || 子主题样式不生效 | 父主题权重更高 | 选择器加 `body.rj-body` 前缀,必要时 `!important` || 球体只在右下角露一点 | 双重居中 | `translate3d` 不要加容器中心坐标 || 按住拖动不跟手 | `<a>` 原生拖拽劫持 | `mousedown` 里 `e.preventDefault()` || 拖动方向相反 | 3D 旋转数学直觉 | `angleY -= dx`,`angleX -= dy` || 不自转 | `dragging` 状态卡住或速度太慢 | 加 `mouseleave` 兜底;`AUTO_SPEED` ≥ 0.008 || 标签文字模糊 | `transform: scale()` 缩放 | 改用 `font-size` 控制大小 || F12 内存暴涨 | DevTools 记录高频 DOM 变更 | `cssText` 合并写入 + `visibilitychange` 暂停 || 改动后页面无变化 | 浏览器缓存 | 递增 `functions.php` 里的版本号 |



发表评论