织梦文章模块加筛选

99ANYc3cd6
预计阅读时长 23 分钟
位置: 首页 织梦建站 正文

最简单的筛选(按栏目/分类筛选)

这是织梦自带的、最基础的功能,如果你的筛选需求仅仅是按不同的栏目(一级分类)或子栏目(二级分类)来查看文章,那么直接使用织梦的栏目链接即可。

实现方式:

  1. 在你的网站导航栏或侧边栏,使用织梦的栏目标签调用出所有一级栏目。
  2. 点击某个栏目,页面就会自动筛选出该栏目下的所有文章。

示例代码(在模板文件 index.htmlist_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/] 是栏目的名称。

点击这些链接,就会跳转到对应的列表页,并自动筛选出该栏目的文章。


进阶筛选(按自定义字段筛选)

这是最常用、最灵活的筛选方式,你想筛选“视频教程”、“图文教程”、“源码下载”等不同类型的文章,就需要使用自定义字段。

第一步:添加自定义字段

  1. 进入织梦后台,点击「核心」 -> 「内容模型管理」。
  2. 找到并点击你文章所使用的模型(通常是“文章”模型)。
  3. 在模型管理页面,点击「字段管理」。
  4. 点击「添加新字段」。
    • 字段名typeid2 (或者你喜欢的名字,如 article_type)
    • 字段类型单选框下拉菜单 (推荐,便于筛选)
    • 字段提示文字文章类型 (后台表单中显示的文字)
    • 默认值视频教程,图文教程,源码下载 (用英文逗号分隔)
    • 其他选项保持默认即可。
  5. 保存后,发布或编辑文章时,就会出现一个“文章类型”的下拉选择框,为每篇文章选择相应的类型。

第二步:修改列表页模板

我们需要在文章列表页(通常是 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文件来处理筛选条件。

  1. 找到并打开 /include/arc.listview.class.php 文件。
  2. 在这个文件中搜索 this->addSql 函数(或者类似的SQL拼接函数)。
  3. 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(一天的秒数)是为了确保包含所选结束日期当天的所有文章。

总结与注意事项

  1. 备份数据:在修改 arc.listview.class.php 这样的核心文件之前,务必备份你的网站和数据库,以防出错。
  2. SEO考虑:筛选后的页面URL结构可能会变得复杂(如 ?tid=1&typeid2=视频教程&author=张三),如果对SEO要求很高,可以考虑使用伪静态规则来美化URL,但这会增加实现的复杂度。
  3. 性能:当筛选条件非常多或数据量巨大时,复杂的SQL查询可能会影响页面加载速度,请确保你的数据库表有适当的索引(如 typeid, typeid2, senddate 等)。
  4. 模板标签:在模板中调用筛选后的文章列表,仍然使用 {dede:list} 标签,PHP文件的修改已经保证了它获取的是经过筛选的数据。

希望以上详细的步骤能帮助你成功为织梦文章模块添加筛选功能!

-- 展开阅读全文 --
头像
织梦首页刷新为何超级慢?
« 上一篇 今天
织梦文章页标签如何调用?
下一篇 » 48分钟前

相关文章

取消
微信二维码
支付宝二维码

目录[+]