织梦列表页如何调用全站文章?

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

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

织梦列表页调用全站文章
(图片来源网络,侵删)

下面我将为您提供几种从简单到复杂的方法,并解释其原理和适用场景。


直接修改底层模板(最直接,但不推荐用于复杂场景)

这种方法最简单,直接修改 list_article.htm,但会使其失去“列表页”的意义,更像一个自定义的聚合页。

操作步骤:

  1. 找到并打开底层模板 登录织梦后台,进入【模板】->【默认模板管理】,找到你当前使用的列表页模板(通常是 list_article.htm),点击后面的【修改】。

    织梦列表页调用全站文章
    (图片来源网络,侵删)
  2. 找到并修改核心调用代码 在模板文件中,找到织梦列表页的核心循环标签,通常是这样的:

    {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}
  3. 替换为 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>
  4. 关键参数解释

    织梦列表页调用全站文章
    (图片来源网络,侵删)
    • 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'}
  5. 保存并更新 保存模板文件,去到任意一个列表页,你就能看到全站的文章了。

优点:

  • 简单粗暴,一步到位。

缺点:

  • 分页失效{dede:list} 标签自带分页功能,而 arclist 在列表页中默认不启用分页,如果文章很多,会一次性全部显示出来,非常影响性能和用户体验。
  • 逻辑混乱:这个页面本质上已经不是一个“栏目列表页”了,而是一个“全站文章聚合页”,如果你希望这个页面仍然保持分页功能,就需要使用更高级的方法。

通过自定义SQL查询实现(推荐,功能强大且灵活)

这是最推荐的方法,它既解决了调用全站文章的问题,又保留了列表页的分页功能,且不影响原有的栏目列表页。

操作步骤:

  1. 找到并打开底层模板 同样,打开 list_article.htm

  2. 找到并修改核心调用代码 找到 {dede:list} ... {/dede:list} 标签对。

  3. 替换为自定义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>
  4. 代码详解

    • {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 参数在特定情况下失效,从而调用全站文章。强烈建议在修改前备份文件!

操作步骤:

  1. 找到并打开PHP文件 通过FTP或服务器文件管理器,找到并打开 /include/arc.listview.class.php 文件。

  2. 修改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的限制。

  3. 创建对应的栏目 在后台创建一个新栏目,网站地图”,设置其栏目ID为100(或者其他你指定的ID),并为其选择一个列表模板(可以是默认的 list_article.htm)。

  4. 访问测试 访问这个“网站地图”栏目的列表页,你就会发现它调用了全站的文章,并且分页功能正常。

优点:

  • 最“原生”:完全利用了织梦自身的列表页逻辑,代码最干净。
  • 使用方便:后台操作,无需修改模板。

缺点:

  • 有风险:修改了核心文件,织梦升级后可能会被覆盖,需要重新修改。
  • 不够灵活:只能为特定的某个栏目实现此功能,无法动态控制。

总结与推荐

方法 优点 缺点 适用场景
改模板为arclist 简单快速 分页失效,性能差 调用少量文章的静态展示,如“最新10篇文章”
自定义sql 功能强大,保留分页,灵活安全 需要懂基础SQL 强烈推荐! 适用于网站地图、文章归档等需要分页的全站文章聚合页
改PHP文件 逻辑原生,后台方便 有风险,升级覆盖 为某个特定栏目永久设置为全站文章列表,且不介意修改核心文件

对于绝大多数用户,我强烈推荐使用【方法二:通过自定义SQL查询实现】,它在功能性、安全性和灵活性之间取得了最好的平衡。

-- 展开阅读全文 --
头像
织梦首页为何无法显示图片?
« 上一篇 前天
UltraEdit编辑C语言,如何高效调试代码?
下一篇 » 前天

相关文章

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