苹果 CMS 自带的”年份”标签是后台写死的枚举,不会跨年度,模板前端页面显示的时候,会将配置的所有年份逐个显示出来,年份过多时,前端页面会显示大量年份信息堆叠。
一、实现功能
本文主要是放弃系统内置实现逻辑,用模板里 {php} 算年份 + 后端 Vod.php 改 SQL 条件。这套改造最实在的收益,就是让年份标签「跨年自动续期」——到了 2027 年、2028年,筛选面板里自动出现新的年份选项,不用你动一行代码。每年跨年夜不用再惦记着「去后台加年份」这件事了,这是相比系统默认方案最值钱的地方。
二、效果预览
![图片[1] - 苹果cms视频年份筛选:近10个年份单独列出+按年代筛选 - 迅维博客网](https://image-1301450403.cos.ap-nanjing.myqcloud.com/2026/07/26/ft3Gy0Gs.png)
三、实现思路
用户访问 /vodlist/1---2026--.html
↓
ThinkPHP 路由 → vodlist/show
↓
调用 Vod::listSearch() (application/common/model/Vod.php)
↓
if (!empty($param['year'])) {
if (4 位数字) → $year = intval(2026)
elseif (9 位 "2024-2026") → $year = "2024,2025,2026"
elseif (XX年代 / 更早) → $year = "10年代" (原样传)
}
↓
where 拼装 (重点改这里)
4 位数字 → WHERE vod_year IN (...)
XX年代 → WHERE (vod_year BETWEEN 2010 AND 2019)
更早 → WHERE vod_year <= 1969
↓
模板 type.html 渲染筛选面板
{php} 计算近 10 年 + 10 年段 + 更早 {/php}
{maccms:foreach} 循环渲染标签
核心就 2 个改动点:
- 模板:动态算年份标签 + 渲染
- 后端模型:识别新格式(
XX年代/更早)+ 翻译成对应 SQL
四、操作步骤
4.1 模板:动态生成年份标签
文件:template/ds3/name/vod/type.html(筛选面板主体),我用的是短视主题做的测试,具体文件请参考自己使用的模板文件。
在「年份」那个 nav-swiper 块里,把写死的 maccms:foreach 替换成下面的逻辑:
<div class="nav-swiper rel">
<div class="filter-text bj cor5"><span>年份</span></div>
<ul class="swiper-wrapper">
<!-- 全部 -->
<li data-type="year" data-val=""
class="swiper-slide{if$param['year']==''} nav-dt{/if}">
<a href="javascript:" rel="nofollow">全部</a>
</li>
{php}
$current_year = intval(date('Y'));
// 近 10 年逐年
$year_list = [];
for ($i = 0; $i < 10; $i++) {
$year_list[] = $current_year - $i;
}
// 10 年段:当前年所在段 → 70 年代(步长 10)
$decade_list = [];
$decade_start = intval(floor($current_year / 10) * 10);
for ($d = $decade_start; $d >= 1970; $d -= 10) {
$decade_list[] = sprintf('%02d年代', $d % 100);
}
{/php}
<!-- 近 10 年逐年 -->
{maccms:foreach name=":$year_list" id="vo2" key="key2"}
<li data-type="year" data-val="{$vo2}"
class="swiper-slide{if$param['year']==$vo2} nav-dt{/if}">
<a href="javascript:" rel="nofollow">{$vo2}</a>
</li>
{/maccms:foreach}
<!-- 10 年段分组 -->
{maccms:foreach name=":$decade_list" id="vo2" key="key2"}
<li data-type="year" data-val="{$vo2}"
class="swiper-slide{if$param['year']==$vo2} nav-dt{/if}">
<a href="javascript:" rel="nofollow">{$vo2}</a>
</li>
{/maccms:foreach}
<!-- 更早兜底 -->
<li data-type="year" data-val="更早"
class="swiper-slide{if$param['year']=='更早'} nav-dt{/if}">
<a href="javascript:" rel="nofollow">更早</a>
</li>
</ul>
</div>
三个关键点:
{php} ... {/php}模板里跑 PHP:用date('Y')取当前年,向前数 10 个年度,然后从当前年所在的段(2020 年代)开始,每 10 年一段直到 70 年代。data-val="{$vo2}"传给前端 JS:点哪个就把哪个值塞 URL,不是写死 href,靠 JS 改地址栏。{$param['year']==$vo2}判高亮:模板渲染时直接判选中态,不用 JS 后处理。
为什么用
data-val而不是<a href="...">?因为筛选面板要走”多维度联动”——你选了「电影 + 2026 + 中国」,下次选「10 年代」时要把 URL 改成/vodlist/1--10年代---中国--.html,参数位置要保持原样。用data-val让 JS 接管 URL 拼接最灵活。
4.2 后端:识别 XX年代 和 更早 转 SQL
文件:application/common/model/Vod.php
第一步:解析参数时支持新格式(约 240 行):
第二步:where 条件改写(约 350 行,这是关键改动):
五、和系统默认方案的差异
| 维度 | 系统默认 | 改造后 |
|---|---|---|
| 年份标签来源 | 后台「模板参数」枚举 | 模板 {php} 实时算 |
| 跨年自动续期 | ❌ 要手动加 | ✅ 自动 |
9 位区间 2024-2026 | ✅ 支持 | ✅ 保留 |
4 位年份 2026 | ✅ 支持 | ✅ 保留 |
10 年段 10年代 | ❌ 不支持 | ✅ 新增 |
| 更早兜底 | ❌ 不支持 | ✅ 新增 |
| 模板改动 | 0 | 1 个文件 |
| 后端改动 | 0 | 1 个文件(Vod.php) |
| SEO 友好 | ✅ 服务端渲染 | ✅ 保留服务端渲染 |
具体差异体现在几处:
年份标签怎么来:系统默认是从后台「模板参数」里的枚举里读,写死的,改一年得动一次;改造后是模板里用 {php} 实时算出来的,永远跟着服务器当前年份走。
能识别哪些格式:4 位具体年份(比如 2026)和 9 位区间(比如 2024-2026)原本就支持,改造后保留;新加了 10 年段(比如「10 年代」)和「更早」兜底两个能力,原本系统是识别不了这种值的。
改动成本:前端模板动一个文件(type.html)、后端动一个文件(Vod.php),共两个,不多不少。
对 SEO 的影响:页面依旧走服务端渲染,百度蜘蛛该抓到的内容一个不落,SEO 这条线不受影响。
所以整套改造的本质是:用一次性的少量代码改动,换取永久性的「跨年不失效 + 新增 10 年段 + 更早兜底」三件能力,后续基本零维护。













暂无评论内容