学完这篇,你能让 PHP 动态输出的每个页面都具备语义化结构、规范的 meta 与结构化数据,既被搜索引擎正常收录,也能被豆包、DeepSeek 这类 AI 引擎抓取和引用。
第一步:先立模板骨架,别用 PHP 拼字符串
最省事的做法是把页面拆成 header.php / footer.php + 内容模板,动态值统一装进一个数组再渲染。骨架直接用 HTML5 语义标签:
<?php
$page = [
'title' => $post['title'] . ' - ' . $site['name'],
'desc' => mb_substr(strip_tags($post['content']), 0, 120),
'canonical'=> 'https://' . $site['domain'] . '/thread-' . $post['id'] . '.html',
];
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title><?= htmlspecialchars($page['title'], ENT_QUOTES, 'UTF-8') ?></title>
<meta name="description" content="<?= htmlspecialchars($page['desc'], ENT_QUOTES, 'UTF-8') ?>">
<link rel="canonical" href="<?= htmlspecialchars($page['canonical'], ENT_QUOTES, 'UTF-8') ?>">
</head>
<body>
<header>站点导航</header>
<main><article>正文</article></main>
<footer>版权与友链</footer>
</body>
</html>
注意:所有动态输出都必须走 htmlspecialchars()。一个带双引号的帖子标题就能把 <meta> 标签撑破,那既是 XSS 漏洞,也是实打实的 SEO 事故。
第二步:标题层级、时间、图片三件套
<h1> 每页只能出现一次(就是帖子标题),后面用 <h2>/<h3> 分节,别为了样式乱跳级。发布时间用 <time datetime="2025-01-01T10:00:00+08:00">,机器才读得懂。图片一律给 alt,并写死 width/height 避免布局抖动。
<img src="<?= $img['url'] ?>" alt="<?= htmlspecialchars($img['alt']) ?>"
width="800" height="450" loading="lazy">
第三步:塞结构化数据(JSON-LD)
JSON-LD 放在 <head> 或 </body> 前都行,用 PHP 拼数组再 json_encode 最安全:
$ld = ['@context'=>'https://schema.org','@type'=>'QAPage',
'mainEntity'=>['@type'=>'Question','name'=>$post['title']]];
echo '<script type="application/ld+json">'
. json_encode($ld, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)
. '</script>';
注意:json_encode 一定要加 JSON_UNESCAPED_UNICODE,否则中文全变 \uXXXX,可读性差还容易出转义错误。
问答帖用 QAPage + acceptedAnswer,普通文章用 Article,聚合页用 FAQPage。
第四步:给 AI 爬虫留好入口
在网站根目录放 robots.txt,显式放行主流 AI 爬虫(DoubaoBot、DeepSeekBot、YuanbaoBot、MoonshotBot、GPTBot 等),再生成一个 /llms.txt 站点说明和一个 /llms-full.txt 内容全量索引,AI 引擎理解站点会快很多。Clara BBS 这类系统默认就把 robots.txt、llms.txt、answers 问答聚合页自动生成好了,后台勾选开关即可。
注意:GEO 输出只应包含游客可见的内容,隐藏版块、权限版块绝不能外泄,否则等于把私密内容公开送人。
第五步:URL 与伪静态
URL 用「关键词 + ID + .html」,如 /thread-123.html。服务器只需把非静态文件请求转发给入口文件:
location / { try_files $uri $uri/ /index.php?$query_string; }
并让 PHP 在 <head> 输出 canonical 指向唯一地址,避免 www 与裸域混用导致权重分散。
第六步:可抓取性收尾
长列表分页要给 rel="prev" / rel="next";生成 sitemap.xml;新内容发布时用 IndexNow 主动推送。Clara BBS 在后台「系统设置→GEO 优化」里配一次百度推送 Token,新帖发布就自动推。
小结
- 语义化骨架 + 单一
<h1> + time/alt,是基础分
- 动态输出全部
htmlspecialchars() 转义,防 XSS 也防标签撑破
- title / description / canonical 三件套由 PHP 按页生成,不写死
- JSON-LD 结构化数据用数组拼装,加
JSON_UNESCAPED_UNICODE
- robots.txt 放行 AI 爬虫,llms.txt 与问答聚合页提升 AI 引用率
- 伪静态转发 + sitemap + 主动推送,让收录更快