修改列表页的底层模板(list_article.htm),使其不受当前栏目ID的限制,直接查询全站的数据。

下面我将为您提供几种从简单到复杂的方法,并解释其原理和适用场景。
直接修改底层模板(最直接,但不推荐用于复杂场景)
这种方法最简单,直接修改 list_article.htm,但会使其失去“列表页”的意义,更像一个自定义的聚合页。
操作步骤:
-
找到并打开底层模板 登录织梦后台,进入【模板】->【默认模板管理】,找到你当前使用的列表页模板(通常是
list_article.htm),点击后面的【修改】。
(图片来源网络,侵删) -
找到并修改核心调用代码 在模板文件中,找到织梦列表页的核心循环标签,通常是这样的:
{dede:list pagesize='20'} <li> <a href="[field:arcurl/]">[field:title/]</a> <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span> </li> {/dede:list} -
替换为
arclist 将{dede:list}...{/dede:list}这一对标签,替换为{dede:arclist}...{/dede:arclist}。arclist是一个更通用的文章列表标签,可以不受栏目限制。修改后的代码示例:
<h2>全站最新文章</h2> <ul> {dede:arclist titlelen='60' row='20' orderby='pubdate' typeid='0'} <li> <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a> <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span> </li> {/dede:arclist} </ul> -
关键参数解释
(图片来源网络,侵删)typeid='0':这是最关键的参数!typeid=0表示调用所有栏目的文章,即全站文章。row='20':表示调用20篇文章。titlelen='60'长度,限制为60个字符。orderby='pubdate':排序方式,按发布时间倒序排列,你也可以使用id(按文章ID)、click(按点击量)、rand(随机)等。subday='30':可以添加此参数,表示调用30天内发布的文章,调用最近一个月的文章:{dede:arclist typeid='0' subday='30'}
-
保存并更新 保存模板文件,去到任意一个列表页,你就能看到全站的文章了。
优点:
- 简单粗暴,一步到位。
缺点:
- 分页失效:
{dede:list}标签自带分页功能,而arclist在列表页中默认不启用分页,如果文章很多,会一次性全部显示出来,非常影响性能和用户体验。 - 逻辑混乱:这个页面本质上已经不是一个“栏目列表页”了,而是一个“全站文章聚合页”,如果你希望这个页面仍然保持分页功能,就需要使用更高级的方法。
通过自定义SQL查询实现(推荐,功能强大且灵活)
这是最推荐的方法,它既解决了调用全站文章的问题,又保留了列表页的分页功能,且不影响原有的栏目列表页。
操作步骤:
-
找到并打开底层模板 同样,打开
list_article.htm。 -
找到并修改核心调用代码 找到
{dede:list}...{/dede:list}标签对。 -
替换为自定义SQL标签 将其替换为
{dede:sql}标签,通过编写SQL语句来查询全站数据。修改后的代码示例:
<h2>全站文章归档</h2> <ul> {dede:sql sql="SELECT a.id, a.title, a.pubdate, a.typeid, t.typename FROM dede_archives a LEFT JOIN dede_arctype t ON a.typeid = t.id ORDER BY a.pubdate DESC LIMIT 0, 20"} <li> <!-- [field:arcurl/] 在sql标签中无法直接使用,需要手动拼接 --> <a href="[field:global name='cfg_cmspath'/]/plus/view.php?aid=[field:id/]" title="[field:title/]">[field:title/]</a> <span>[field:pubdate function="MyDate('Y-m-d',@me)"/] - ([field:typename/])</span> </li> {/dede:sql} </ul> -
代码详解
{dede:sql sql="..."}:执行自定义的SQL查询。SELECT a.id, a.title, a.pubdate, a.typeid, t.typename:从archives(文章表) 和arctype(栏目表) 中查询所需字段。FROM dede_archives a LEFT JOIN dede_arctype t ON a.typeid = t.id:关联文章表和栏目表,以便获取文章所属的栏目名typename。注意:你的表前缀可能是dede_,如果不是,请自行修改。ORDER BY a.pubdate DESC:按发布时间倒序排列。LIMIT 0, 20:从第0条记录开始,获取20条数据,这里的0就是分页的关键,它会由织梦系统自动替换为0, 20(第一页),20, 20(第二页),40, 20(第三页) 等。[field:id/]和[field:typename/]:在sql标签中,可以直接使用查询出的字段。[field:global name='cfg_cmspath'/]:获取网站根目录,用于拼接文章链接。[field:arcurl/]在sql标签中无法直接使用,因为织梦无法动态获取文章的URL规则,所以我们需要手动拼接plus/view.php?aid=文章ID这种通用链接格式。
优点:
- 保留分页:完美保留了织梦列表页的分页功能。
- 性能可控:通过
LIMIT可以精确控制每页显示的文章数量。 - 逻辑清晰:不影响其他栏目列表页,可以专门创建一个“网站地图”或“文章归档”栏目,使用此模板。
缺点:
- 需要懂一点基础的SQL语句。
通过修改PHP文件实现(最彻底,但有一定风险)
这种方法通过修改织梦的核心文件,让列表页的 typeid 参数在特定情况下失效,从而调用全站文章。强烈建议在修改前备份文件!
操作步骤:
-
找到并打开PHP文件 通过FTP或服务器文件管理器,找到并打开
/include/arc.listview.class.php文件。 -
修改SQL查询语句 在文件中搜索
$this->dsql->SetQuery,你会找到构建SQL查询的核心代码,找到类似下面这一行:// 通常是第570行左右,版本不同可能略有差异 $this->dsql->SetQuery("Select id,typename,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath From `dede_arctype` WHERE $typeidid ORDER BY sortrank ASC");这里的
$typeidid变量决定了查询的栏目范围,我们需要修改它,使其在调用全站文章时变为1=1(一个永远为真的条件)。修改思路:在文件开头或SQL构建逻辑之前,增加一个判断,如果当前栏目ID是你指定的“全站文章”栏目ID,就让
$typeidid变成'1=1'。修改示例(假设全站文章栏目的ID是 100):
// 在 arc.listview.class.php 文件中查找并修改下面的代码块 // ... 其他代码 ... $typeidid = ""; if($this->TypeID>0) { $typeidid = " And (tpid=0 And id='".$this->TypeID."' Or reid='".$this->TypeID."') "; } // ====== 在这里增加判断 ====== // 如果当前栏目ID是100,则查询全站文章 if ($this->TypeID == 100) { $typeidid = " And 1=1 "; // 1=1 会匹配所有文章 } // ========================= $this->dsql->SetQuery("Select id,typename,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath From `dede_arctype` WHERE $typeidid ORDER BY sortrank ASC"); // ... 其他代码 ...这段代码的意思是:如果列表页正在显示的栏目ID是100,
$typeidid的值就不再是限制栏目的条件,而是And 1=1,这样在后续查询文章时,就不会再受栏目ID的限制。 -
创建对应的栏目 在后台创建一个新栏目,网站地图”,设置其栏目ID为100(或者其他你指定的ID),并为其选择一个列表模板(可以是默认的
list_article.htm)。 -
访问测试 访问这个“网站地图”栏目的列表页,你就会发现它调用了全站的文章,并且分页功能正常。
优点:
- 最“原生”:完全利用了织梦自身的列表页逻辑,代码最干净。
- 使用方便:后台操作,无需修改模板。
缺点:
- 有风险:修改了核心文件,织梦升级后可能会被覆盖,需要重新修改。
- 不够灵活:只能为特定的某个栏目实现此功能,无法动态控制。
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
改模板为arclist |
简单快速 | 分页失效,性能差 | 调用少量文章的静态展示,如“最新10篇文章” |
自定义sql |
功能强大,保留分页,灵活安全 | 需要懂基础SQL | 强烈推荐! 适用于网站地图、文章归档等需要分页的全站文章聚合页 |
| 改PHP文件 | 逻辑原生,后台方便 | 有风险,升级覆盖 | 为某个特定栏目永久设置为全站文章列表,且不介意修改核心文件 |
对于绝大多数用户,我强烈推荐使用【方法二:通过自定义SQL查询实现】,它在功能性、安全性和灵活性之间取得了最好的平衡。
