最新文章列表里想让标题前面带栏目名,不用动文章标题本身,改模板输出那一段最稳。很多网站的文章表里存的是category_id,栏目表里存id和name,最新文章查询时把栏目名一起取出来,循环里先输出栏目名再输出标题就行。这样后台编辑文章还是原来的标题,前台展示多一个栏目前缀,搜索、SEO标题、编辑习惯都不受影响。
先看数据怎么来。假设文章表articles有id、title、category_id、status、updated_at,栏目表categories有id、name。最新文章查询用LEFT JOIN,一次把栏目名带出来:
```php
$sql = "SELECT a.id, a.title, a.category_id, c.name AS category_name
FROM articles a
LEFT JOIN categories c ON c.id = a.category_id
WHERE a.status = 1
ORDER BY a.updated_at DESC
LIMIT 10";
$rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
$catName = $row[''category_name''] ?: ''未分类'';
echo ''
这段代码的关键是`$catName`在标题链接前面输出。栏目名最好做HTML转义,标题也要转义,文章id强制转整数。如果栏目名要能点进栏目页,把span换成a,链接带上category_id:

```php
$catUrl = ''/category.php?id='' . (int)$row[''category_id''];
echo '''' . htmlspecialchars($catName, ENT_QUOTES, ''UTF-8'') . '''';
```
有些老代码不是一次JOIN,而是先查最新文章,再在循环里根据category_id查栏目名。文章少的时候看不出问题,最新文章一多就容易变成循环查库。更稳的做法是先把栏目表读成映射,循环里直接取:
```php
$cats = [];
$catRows = $pdo->query("SELECT id, name FROM categories")->fetchAll(PDO::FETCH_ASSOC);
foreach ($catRows as $c) {
$cats[$c[''id'']] = $c[''name''];
}
foreach ($rows as $row) {
$catName = $cats[$row[''category_id'']] ?? ''未分类'';
echo '''' . htmlspecialchars($catName, ENT_QUOTES, ''UTF-8'') . '''';
echo '''' . htmlspecialchars($row[''title''], ENT_QUOTES, ''UTF-8'') . '''';
}
```
WordPress站点更简单,最新文章循环里用get_the_category取分类,取第一个分类名放在the_title前面:
```php
$cats = get_the_category();
$catName = !empty($cats) ? $cats[0]->name : ''未分类'';
$catLink = !empty($cats) ? get_category_link($cats[0]->term_id) : ''#'';
echo '''' . esc_html($catName) . '''';
the_title(''
如果是在文章详情页正文开头加栏目名,不要改文章内容字段,在single模板里输出就行:
```php
$cats = get_the_category();
if (!empty($cats)) {
echo ''
样式上给栏目名一点区分,读者一眼能看出这是栏目不是标题的一部分:
```css
.cat-name {
display: inline-block;
margin-right: 8px;
padding: 2px 6px;
background: #f2f2f2;
color: #666;
font-size: 13px;
border-radius: 3px;
text-decoration: none;
}
.article-item {
line-height: 1.8;
}
```
几个容易踩的坑。文章没有分类时要给默认值,不然标题前面空一块或者报错。一篇文章绑了多个栏目时,最新文章列表最好只取主栏目,别把一串栏目名都堆在标题前。栏目名输出前要转义,后台栏目名里带引号或尖括号也不会把页面结构弄乱。栏目名做成链接对SEO更友好,但链接地址要用category_id生成,别直接拿栏目名拼URL。还有,别为了省事把栏目名直接写进文章title字段,短期看着能用,后面改栏目、做搜索、导出数据都会乱。
找到你网站输出最新文章的那个模板,常见是index.php、sidebar.php或者latest-posts.php,搜`the_title`或者`$row[''title'']`,在它前面加栏目名输出,基本就改完了。