我把 caogenbj 这个主题从头扫了一遍,症状是这样的:
| 症状 | 具体表现 |
|---|---|
| 认不出爹 | index.php 里背景图路径写的是 themes/jiaoxueshiping/,那是它的原名 |
| 带着别人的东西 | category-liupangketang.php 里有 30 处指向 wuli.fre9.com 的链接,还有 3 张本主题里不存在的轮播图 |
| 名字对不上 | 页脚写的是”零月租手机卡 © 2015-2020″——那是另一个站的名字和年份 |
| 文件重复 | 6 个 category-*.php 内容高度雷同,改一处要改六遍 |
| 缺零件 | 没有 404.php、search.php、tag.php |
| 写死了 | 96 处 http://www.caogenbj.com 的站内链接存在数据库里 |
这些不是”代码写错了”,是“这个主题还在替别人活着”。
重构的目标不是”写得更漂亮”,是让它变成一个你能独立维护的东西。
这一步最关键,也最容易被跳过。直接动手改,改到一半发现”这个文件根本没被调用”,白干。
1. 列文件清单
ls -la wp-content/themes/caogenbj/
把 PHP 文件、CSS、JS、图片分开列。我当时列出来是 11 个 PHP + 一堆图片和两个 JS 库。
2. 查调用关系
每个模板文件上来第一行几乎都是 get_header(),最后是 get_footer()。你要查的是两件事:
category-liupangketang.php,只有当存在 slug 为 liupangketang 的分类时才会被用;grep -rn "lingfeng_breadcrumbs" *.php
如果搜出来只有定义、没有调用,那就是死代码。
3. 找出”写死的东西”
grep -rn "http://" *.php | grep -v "w3.org"
grep -rn "themes/" *.php
grep -rn "caogenbj.com" *.php
三条命令下来,所有”绑在特定站上”的地方就暴露了。我那次搜出 29 处 http://,其中真正该改的 15 处、不该动的 14 处(后面会讲怎么区分)。
这一步的产出应该是一张表:哪个文件、什么用途、要不要留。
按”风险从低到高”排,我是这么做的:
低风险:改文字
style.css 里的 Theme Name、Author、Author URI;Theme URI 改成自己的站。这些改动不影响任何逻辑,改完刷一下就能确认。
中风险:改路径
把 themes/jiaoxueshiping/ 改成 get_stylesheet_directory_uri()。
为什么要用函数而不是直接写目录名?因为写死的目录名,下次改主题名又要改一遍。用函数,改目录名它自动跟着变。
// 改前
background: url(http://www.caogenbj.com/wp-content/themes/jiaoxueshiping/notice_bg.gif)
// 改后
background: url(<?php echo esc_url( get_stylesheet_directory_uri() . '/notice_bg.gif' ); ?>)
高风险:删文件
这一步要格外小心。category-liupangketang.php 这种,删之前必须确认两件事:
include 它?两条都确认了才删。删完立刻刷几个页面看看,别一次删五个。
我这次的做法是:不删,先注释掉或者在文件名后面加 .bak。观察一周,没出问题再真删。这叫”可回退的删除”。
前三步是”清理”,这一步是”防止再脏”。
规矩一:所有函数加前缀
function caogenbj_strimwidth() { ... }
function caogenbj_breadcrumbs() { ... }
我原来那个主题的函数全是 lingfeng_ 开头——那是模板作者的名字。改成自己的前缀,不是为了好看,是为了将来跟插件撞名时,能一眼看出是谁的。
规矩二:资源走 enqueue
把 header.php 里那两个硬写的 <script> 改成 wp_enqueue_script。
收益很实在:缓存插件能版本化它们了。 你改了 CSS,把版本号加一,访客浏览器就会重新下载。硬写的话,只能让访客自己按 Ctrl+F5(他不会按)。
规矩三:输入输出都过一道
echo $变量 全部改成 echo esc_html( $变量 );href="<?php echo $url ?>" 改成 esc_url()。
规矩四:重复的模板合并
6 个 category-*.php 如果内容一样,就只留一个 category.php。真要区分,用条件判断:
<?php if ( is_category( 'liupangketang' ) ) : ?>
...
<?php else : ?>
...
<?php endif; ?>
为什么这条重要? 我给你算一笔:这次修一个背景图路径,因为有 6 个雷同的分类模板,同一处改要改 9 遍(6 个分类模板 + index + 2 个其他)。漏一处,就前功尽弃。
前三条做完,主题是你的了。但要能长期维护,还差两件事:
一、版本控制。
最轻量的做法:每次大改之前,把主题目录打包成 caogenbj-20261106.zip,放在本地。出问题了,解压覆盖就回去。
正式一点就上 Git。主题目录 git init,每次改完 commit。好处是”能看出改了什么”——不用靠记忆。
二、子主题(如果还想跟着上游更新)。
我前面写过一篇专门讲子主题。这里只说结论:如果你已经改到这个程度(重写了 head、换了模板、加了 SEO 层),那就不用考虑子主题了——你已经不是”继承”,你是”分家”。
分家之后,”上游更新”这条路就断了。接受它,然后自己维护好。
上面这些如果一次全做,工作量大概两三天,而且极易出错。
我给自己的排序是这样的(按”风险 vs 收益”):
wp_head()、函数重名、语法错误。这些直接导致功能失效或白屏;很多人卡在第 4 步,因为第 4 步最”看得见”——改完代码变整齐了,很有成就感。但第 1、2 步才是真的在挣钱。
我这次的实际顺序是:http 链接 → 摘要函数 → wp_head → SEO 层 → 安全 → 变量名。前四步占了八成时间,最后一步(改 lingfeng_ 前缀)到现在还没做。
没做也不影响站运行。这就是”优先级”的意思。
一句话记住:摸家底 → 断奶 → 立规矩 → 能升级。四步按顺序来,别一次全改;先修会出错的,再修影响收录的。
下一篇是这个系列的最后一篇:把六卷的内容收成一张图。