染卷不卷'blog

12年站长,AI实践中。互联网 IT行业,工作见闻、技术教程全分享。

AI 智能体 / 软件应用

花了10天,让TraeWork魔改下WordPress子主题(附skill)

本篇目录

以前要给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`。
 
```css
body.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. 球面分布:斐波那契算法
 
均匀铺点,避免两极堆积:
 
```js
var 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)
 
```js
var 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` 只需相对中心的偏移量,**不要再加容器中心坐标**,否则标签全跑到右下角。
 
```js
var px = pr.x * radius; // 正确:仅偏移量
var py = pr.y * radius;
el.style.transform = 'translate3d(' + px + 'px,' + py + 'px,0) translate(-50%,-50%)';
```
 
### 4. 拖拽方向:要取反
 
鼠标向右拖,直觉上球体应向右转。3D 数学上 `angleY` 增大会让正面点向左移,所以必须**取反**:
 
```js
angleY -= dx * 0.006; // 不是 +=
angleX -= dy * 0.006;
```
 
### 5. 拖拽必须 `preventDefault`
 
`<a>` 标签有原生"拖拽链接"行为,会劫持 `mousemove`,导致"按住不跟手、松开才转"。`mousedown` 里必须 `e.preventDefault()`。
 
### 6. 拖拽与点击区分
 
移动超过 4px 判定为拖拽,阻止 click 跳转:
 
```js
if (!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` 让浏览器按目标字号渲染,文字清晰。
 
```js
el.style.fontSize = (baseFont * depthFactor * countFactor).toFixed(1) + 'px';
```
 
### 8. 文章数量加权字号
 
从 `aria-label="标签名 (N 项)"` 提取数量,归一化后作为字号系数:
 
```js
var 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` 里的版本号 |

染卷

本站文章也会定期同步到微信公众号,可以关注下避免错过~

建站 12年 3天
微信公众号

发表评论

邮箱不会公开,带 * 为必填。