BLOG
PHP后台做SEO管理要存哪些信息
PHP后台做SEO管理时,至少要能维护标题、描述、关键词、canonical、robots和站点地图开关。
SEO信息在PHP后台里怎么存,直接决定了前台页面能不能灵活输出、运营能不能自己改、以及后续加功能时要不要动核心代码。很多后台把标题和描述写死在模板里,或者只在文章表里加两个字段,短期够用,等页面类型一多就乱。更常见的做法是单独建一张SEO元信息表,跟内容模型做关联,这样固定页面、文章、分类都能共用一套维护入口。
先想清楚要存哪些字段
一个页面真正会被搜索引擎和社交平台读取的SEO信息,通常包括以下几类:
- title:页面标题,也是搜索结果里的大标题。长度没有绝对标准,但一般控制在30个中文字以内比较稳妥,超出部分容易被截断。
- description:页面描述,出现在搜索结果标题下方。它不直接影响排名,但影响点击率,所以要写成能概括页面内容的一句话,而不是堆关键词。
- keywords:这个字段的权重早已下降,很多搜索引擎明确表示不参考它。但后台保留这个字段仍有意义,一是部分旧系统或内部搜索还在用,二是可以给运营人员一个填写核心词的位置,辅助内容策划。
- canonical:当同一内容有多个URL可访问时(比如带参数和不带参数的地址),用canonical告诉搜索引擎哪个是标准地址,避免权重分散。
- robots:控制搜索引擎是否抓取和索引当前页面。常见的值包括
index,follow、noindex,nofollow,后台最好用下拉选择而不是让用户手输,避免拼写错误。 - sitemap开关:标记这个页面是否要进入站点地图。草稿、测试页、隐私政策这类页面通常不需要被索引,但有些页面需要被索引却不适合出现在导航里,所以这个开关要独立存在。
除了这些,还要考虑og标签(社交分享时的标题、描述、图片)和结构化数据(如文章发布时间、作者、评分),这些不是所有后台都必须做,但如果网站依赖社交传播,og信息值得预留字段。
表结构怎么设计
推荐单独建一张seo_meta表,而不是在每个内容表里重复加列。这样做的原因是:文章、产品、分类、标签页都需要SEO信息,如果每个表都加一遍,字段重复且维护分散;单独建表后,新增一种内容类型时不需要改表结构。
表的核心字段可以这样设计:
```php
CREATE TABLE seo_meta (
id INT PRIMARY KEY AUTO_INCREMENT,
page_type VARCHAR(50) NOT NULL COMMENT '页面类型,如article、category、page',
page_id INT NOT NULL COMMENT '对应内容的主键ID',
title VARCHAR(255) DEFAULT NULL,
description VARCHAR(500) DEFAULT NULL,
keywords VARCHAR(255) DEFAULT NULL,
canonical_url VARCHAR(255) DEFAULT NULL,
robots VARCHAR(50) DEFAULT 'index,follow',
in_sitemap TINYINT(1) DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_type_id (page_type, page_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
page_type加page_id的组合唯一索引很关键,它保证一篇文章只有一条SEO记录,不会因为重复提交而出现多条数据。page_type用字符串而不是数字,是为了让开发者一眼看出这条记录属于哪个模块,不需要查字典表。
后台读取和保存的逻辑
后台保存SEO信息时,控制器接收表单提交后先做基础校验,再执行插入或更新。用ON DUPLICATE KEY UPDATE可以避免先查再判断的重复代码:
```php
public function saveSeo(int $pageId, string $pageType, array $data): bool
{
$stmt = $this->db->prepare(
'INSERT INTO seo_meta
(page_type, page_id, title, description, keywords, canonical_url, robots, in_sitemap)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
title = VALUES(title),
description = VALUES(description),
keywords = VALUES(keywords),
canonical_url = VALUES(canonical_url),
robots = VALUES(robots),
in_sitemap = VALUES(in_sitemap)'
);
return $stmt->execute([
$pageType,
$pageId,
$data['title'] ?? null,
$data['description'] ?? null,
$data['keywords'] ?? null,
$data['canonical_url'] ?? null,
$data['robots'] ?? 'index,follow',
isset($data['in_sitemap']) ? 1 : 0
]);
}
```
前台输出时,控制器根据当前路由确定page_type和page_id,查出SEO记录后覆盖默认值。如果查不到记录,就使用系统预设的默认标题和描述,保证页面不会出现空的<title>标签。
容易出错的地方
字段为空时的兜底逻辑。如果运营人员没有填写某个页面的SEO信息,前台不能输出空的<meta name="description" content="">,这会被搜索引擎视为质量问题。正确做法是:优先取SEO表里的值,为空则取内容表里的摘要或标题作为默认值。
草稿和已发布内容的区分。如果文章有草稿状态,SEO信息应该跟着正式版本走,而不是编辑保存草稿时就更新线上页面的meta标签。一个简单的处理方式:只在文章状态变为“已发布”时才读取SEO记录,草稿预览时使用独立的预览逻辑。
robots和sitemap的一致性。如果某页面设置了noindex,但它仍然出现在sitemap.xml里,搜索引擎会感到矛盾。生成sitemap时要过滤掉robots包含noindex的记录,同时过滤掉in_sitemap为0的页面。
canonical容易写错。常见错误是canonical指向了带跟踪参数的URL,或者指向了HTTP和HTTPS混用的地址。后台填写时最好给出当前页面的标准URL作为默认值,运营人员只需确认而不是从零输入。
修改历史缺失。SEO标题和描述经常需要A/B测试或复盘,如果改完就覆盖,后面想对比哪个版本效果好就没有依据。有条件的后台可以增加一个seo_log表记录每次修改前后的值,或者至少在更新时把旧值写入日志文件。
检查清单
后台开发完成后,可以按下面几个方向验证:
- 新建一篇文章,不填SEO信息,前台页面标题是否回退到默认规则(如“文章标题-网站名”)?
- 填写SEO信息并保存,刷新前台页面,查看HTML源码中
<title>和<meta name="description">是否与后台一致? - 将文章设为草稿,sitemap.xml中是否不再出现该文章?
- 将某页面的robots设为
noindex,该页面是否仍被sitemap引用? - 修改SEO信息后,数据库中的
updated_at是否自动更新? - 同一篇文章重复提交SEO表单,是否只产生一条记录?
SEO管理在PHP后台中不是一个独立功能,而是内容管理的一部分。把字段设计清楚、读写逻辑统一、边界情况处理好,运营人员就能在不接触代码的情况下维护每个页面的搜索表现,开发者也不用在每次新增内容类型时重复造轮子。
评论
登录后可发表评论。