最简单的筛选(按栏目/分类筛选)
这是织梦自带的、最基础的功能,如果你的筛选需求仅仅是按不同的栏目(一级分类)或子栏目(二级分类)来查看文章,那么直接使用织梦的栏目链接即可。
实现方式:
- 在你的网站导航栏或侧边栏,使用织梦的栏目标签调用出所有一级栏目。
- 点击某个栏目,页面就会自动筛选出该栏目下的所有文章。
示例代码(在模板文件 index.htm 或 list_article.htm 中):
<ul class="channel-list">
<li><a href="{dede:global.cfg_cmsurl/}/">全部文章</a></li>
{dede:channel type='top' row='8'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
type='top'表示只调用顶级栏目。[field:typelink/]是栏目的链接地址。[field:typename/]是栏目的名称。
点击这些链接,就会跳转到对应的列表页,并自动筛选出该栏目的文章。
进阶筛选(按自定义字段筛选)
这是最常用、最灵活的筛选方式,你想筛选“视频教程”、“图文教程”、“源码下载”等不同类型的文章,就需要使用自定义字段。
第一步:添加自定义字段
- 进入织梦后台,点击「核心」 -> 「内容模型管理」。
- 找到并点击你文章所使用的模型(通常是“文章”模型)。
- 在模型管理页面,点击「字段管理」。
- 点击「添加新字段」。
- 字段名:
typeid2(或者你喜欢的名字,如article_type) - 字段类型:
单选框或下拉菜单(推荐,便于筛选) - 字段提示文字:
文章类型(后台表单中显示的文字) - 默认值:
视频教程,图文教程,源码下载(用英文逗号分隔) - 其他选项保持默认即可。
- 字段名:
- 保存后,发布或编辑文章时,就会出现一个“文章类型”的下拉选择框,为每篇文章选择相应的类型。
第二步:修改列表页模板
我们需要在文章列表页(通常是 list_article.htm)添加筛选的HTML表单。
示例代码(在 list_article.htm 中合适的位置添加):
<div class="filter-box">
<form name="search" action="" method="get">
<input type="hidden" name="tid" value="{dede:field.tid/}" /> <!-- 保持当前栏目ID -->
<select name="typeid2" onchange="document.search.submit();">
<option value="">全部类型</option>
{dede:global.option typeid2=''/}
<!--
这里需要手动添加选项,因为织梦默认不提供直接调用字段选项的标签。
你需要根据你在第一步中设置的“默认值”来手动写死。
如果你的默认值是 '视频教程,图文教程,源码下载',那么就写成下面这样:
-->
<option value="视频教程">视频教程</option>
<option value="图文教程">图文教程</option>
<option value="源码下载">源码下载</option>
</select>
</form>
</div>
第三步:修改列表页PHP文件
这是最关键的一步,需要修改PHP文件来处理筛选条件。
- 找到并打开
/include/arc.listview.class.php文件。 - 在这个文件中搜索
this->addSql函数(或者类似的SQL拼接函数)。 - 在
this->addSql函数内部,找到处理tid(栏目ID)的代码段,在其后面添加处理我们自定义字段typeid2的逻辑。
修改示例(在 arc.listview.class.php 中):
// 找到类似这样的代码(位置可能略有不同)
if($this->TypeID > 0) {
$this->addSql .= " And arc.typeid IN ($this->TypeID) ";
}
// 在其后面添加如下代码:
// 处理自定义字段 typeid2 的筛选
if (isset($_GET['typeid2']) && $_GET['typeid2'] != '') {
$this->addSql .= " And arc.typeid2 = '" . addslashes($_GET['typeid2']) . "' ";
}
isset($_GET['typeid2'])检查URL中是否存在typeid2这个参数。addslashes()用于防止SQL注入,这是一个好习惯。arc.typeid2是数据库中存储该字段值的字段名。
完成!
当你在列表页选择“视频教程”并提交时,URL会变成 .../list.php?tid=XX&typeid2=视频教程,PHP文件会接收到这个参数,并将筛选条件添加到SQL查询中,最终只显示“视频教程”类型的文章。
高级筛选(多条件组合筛选)
如果你需要同时根据多个条件(如“文章类型”和“发布日期范围”)进行筛选,需要对方法二进行扩展。
第一步:添加更多自定义字段
除了 typeid2,你可能还需要添加:
- 一个日期范围字段(类型为
日期时间)。 - 一个作者字段(类型为
文本)。
第二步:修改列表页模板
在表单中添加更多的筛选控件。
示例代码:
<div class="filter-box">
<form name="search" action="" method="get">
<input type="hidden" name="tid" value="{dede:field.tid/}" />
<!-- 文章类型筛选 -->
<select name="typeid2" onchange="document.search.submit();">
<option value="">全部类型</option>
<option value="视频教程" {dede:if request('typeid2')=='视频教程'}selected{/dede:if}>视频教程</option>
<option value="图文教程" {dede:if request('typeid2')=='图文教程'}selected{/dede:if}>图文教程</option>
</select>
<!-- 日期范围筛选 -->
<input type="text" name="starttime" placeholder="开始日期" value="{dede:global name='starttime' /}" />
<span>至</span>
<input type="text" name="endtime" placeholder="结束日期" value="{dede:global name='endtime' /}" />
<!-- 作者筛选 -->
<input type="text" name="author" placeholder="作者" value="{dede:global name='author' /}" />
<button type="submit">筛选</button>
</form>
</div>
{dede:if request('typeid2')=='视频教程'}selected{/dede:if}这句代码可以实当下拉框选项与URL参数匹配时,自动选中该项,提升用户体验。
第三步:修改列表页PHP文件
在 arc.listview.class.php 中添加对其他参数的处理。
修改示例:
// ... 之前的代码 ...
// 处理自定义字段 typeid2 的筛选
if (isset($_GET['typeid2']) && $_GET['typeid2'] != '') {
$this->addSql .= " And arc.typeid2 = '" . addslashes($_GET['typeid2']) . "' ";
}
// 处理开始日期筛选
if (isset($_GET['starttime']) && $_GET['starttime'] != '') {
$this->addSql .= " And arc.senddate >= '" . strtotime($_GET['starttime']) . "' ";
}
// 处理结束日期筛选
if (isset($_GET['endtime']) && $_GET['endtime'] != '') {
// 注意:结束日期需要加上一天,因为 `senddate < '某天'` 会排除掉那天的数据
$this->addSql .= " And arc.senddate < '" . (strtotime($_GET['endtime']) + 86400) . "' ";
}
// 处理作者筛选
if (isset($_GET['author']) && $_GET['author'] != '') {
$this->addSql .= " And arc.writer = '" . addslashes($_GET['author']) . "' ";
}
strtotime()函数将日期字符串转换为Unix时间戳,这是数据库中senddate字段的存储格式。- 结束日期的
+ 86400(一天的秒数)是为了确保包含所选结束日期当天的所有文章。
总结与注意事项
- 备份数据:在修改
arc.listview.class.php这样的核心文件之前,务必备份你的网站和数据库,以防出错。 - SEO考虑:筛选后的页面URL结构可能会变得复杂(如
?tid=1&typeid2=视频教程&author=张三),如果对SEO要求很高,可以考虑使用伪静态规则来美化URL,但这会增加实现的复杂度。 - 性能:当筛选条件非常多或数据量巨大时,复杂的SQL查询可能会影响页面加载速度,请确保你的数据库表有适当的索引(如
typeid,typeid2,senddate等)。 - 模板标签:在模板中调用筛选后的文章列表,仍然使用
{dede:list}标签,PHP文件的修改已经保证了它获取的是经过筛选的数据。
希望以上详细的步骤能帮助你成功为织梦文章模块添加筛选功能!
