本文约 3,310 字,预计阅读 9 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:你做了三十个小工具,搜索引擎只收录了三个
在线工具站的魅力在于长尾明确(”在线 JSON 格式化””时间戳转换””图片转 Base64″)且几乎不需要维护。但新手常做成这样:一个 tools.php 页面,靠 ?tab=json 参数切换工具;或者用 SPA 单页应用,所有工具在一个 HTML 里用 JS 渲染。这两种做法的结果都差不多:只有入口页有 URL 权重,工具页既没有独立标题也没有独立内容,搜索引擎看不到任何”这是一个 JSON 格式化工具”的信号。流量自然起不来。工具站的 SEO 核心其实就一句话:每个工具必须有唯一 URL、唯一标题、以及真实存在于 HTML 里的说明文字。
原理分析:静态外壳 + 即时计算 = 可抓取且无需后端
工具的本质通常是「输入 → 纯函数 → 输出」,完全可以跑在浏览器里,不需要 Ajax 到 PHP。所以最优结构是:WordPress 负责内容壳(标题、说明、用法、FAQ、内链),JavaScript 负责计算。页面下载一次,计算本地完成,服务器压力接近零,也不怕被刷量。
需要警惕的是两类低质量信号:一是「参数化垃圾页」——如果工具页支持任意 ?input=xxx 并被抓取,会生成无限多个内容几乎相同的 URL;二是「入口即工具」——没有说明文字,页面可索引内容不足几十字,很容易被判为”没有价值的聚合页”。
| 组织方式 | 独立 URL | 可抓取内容 | 建议 |
|---|---|---|---|
| 单页 + query 参数 | 否 | 少 | 不推荐 |
| SPA 渲染切换 | 否 | 少 | 不推荐 |
| 每个工具一个文章/CPT | 是 | 可控 | 推荐 |
| 工具 + Hash 状态共享 | 是 | 可控 | 可作辅助 |
保姆级实操
步骤 1:注册 tool 文章类型。 每个工具就是一篇 CPT 记录,天然获得独立 slug 与干净的重写结构:
add_action( 'init', function () {
register_post_type( 'tool', [
'labels' => [ 'name' => '在线工具', 'singular_name' => '在线工具' ],
'public' => true,
'has_archive' => true,
'rewrite' => [ 'slug' => 'tool' ],
'supports' => [ 'title', 'editor', 'thumbnail', 'excerpt' ],
'show_in_rest'=> true,
] );
} );
步骤 2:工具本体用 JS 实现。以 QR 码生成为例,用真实存在的开源库 qrcodejs(David Shim):
document.addEventListener('DOMContentLoaded', function () {
const input = document.getElementById('qr-input');
const box = document.getElementById('qr-box');
function render() {
const text = input.value.trim();
box.innerHTML = '';
if (!text) { return; }
new QRCode(box, {
text: text,
width: 220,
height: 220,
colorDark: '#111827',
colorLight: '#ffffff',
correctLevel: QRCode.CorrectLevel.M
});
}
input.addEventListener('input', render);
render();
});
步骤 3:给工具页补 300 字以上的真实说明。 包括:工具用途、支持的参数、与其他工具的区别、常见问题。这段内容既是 SEO 主体,也是用户信任来源。WordPress 结构化数据标注方法
步骤 4:把状态同步到 URL hash 而不是 query string。 location.hash 不会被搜索引擎当作不同 URL 抓取,但用户仍能分享带参数的链接:
const params = new URLSearchParams(location.hash.slice(1));
if (params.get('t')) { input.value = params.get('t'); }
input.addEventListener('input', () => {
const next = new URLSearchParams({ t: input.value });
history.replaceState(null, '', '#' + next.toString());
});
步骤 5:处理带参 URL 的 canonical 与 robots。 对未知 GET 参数统一回指干净 URL,避免重复收录:
add_action( 'template_redirect', function () {
if ( is_singular( 'tool' ) && ! empty( $_GET ) ) {
if ( wp_safe_redirect( get_permalink( get_queried_object_id() ), 301 ) ) {
exit;
}
}
} );
add_filter( 'robots_txt', function ( $output ) {
$output .= "Disallow: /*?\n";
return $output;
} );
步骤 6:工具聚合页与内链组织。 建立一个 /tools 列表页做目录,每个工具页底部自带”相关工具”区块(按 tag 取 6 个),形成网状结构。
常见踩坑
- 工具页标题写成”在线工具”,没带上具体功能词,拿不到长尾流量。
- 案例: 某站把所有工具塞进一个页面用 JS 切换,半年后发现外部 UTM/工具备份出现了一百多个
?tab=参数的重复收录链接,站点出现大量低质量重复页面,权重被稀释。 - 页面说明文字完全靠 JS 渲染,Google 抓取的 HTML 里没有实质内容。
- 工具调用了第三方 CDN 上的 JS,源站在国内访问缓慢或失效,工具整体不可用了自己还不知道。
- 未加 canonical,
/tool/json-formatter/与/tool/json-formatter/index.html同时被索引。 - 表单输入没做长度限制,用户贴 20MB 文本导致页面卡死。
- 工具产生了 AI 接口调用,初期免费额度被刷爆产生费用。WordPress CDN 与静态资源优化
总结
工具站的判断标准是:每个工具是否独立地址、是否有真实可抓取的说明、是否有效避免了无意义的参数页。行动清单:CPT 一工具一页 → 计算纯前端 → 补充 300 字说明 → 用 hash 同步状态 → 统一 canonical 与 robots → 做 /tools 目录汇聚权重。工具站不是赢在数量,而是赢在页面组织是否干净。
