dede arclist如何获取当前文章?

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

这是一个非常常见的需求,比如在文章详情页显示“上一篇”、“下一篇”、“相关文章”等。

dede arclist 当前文章
(图片来源网络,侵删)

核心思路

要实现调用当前文章信息的功能,关键在于理解 {dede:arclist} 标签的几个核心参数:

  1. typeid: 指定要调用的栏目ID,如果留空,默认会调用当前文章所在栏目的文章。
  2. idlist: 指定要调用的文章ID列表,这是实现“上一篇/下一篇”功能的关键。
  3. row: 调用文章的数量。
  4. titlelen: 标题长度。
  5. orderby: 排序方式,常用 id(按文章ID排序)或 pubdate(按发布时间排序)。
  6. innertext: 单条记录的模板,即每篇文章的显示样式。

调用“上一篇”和“下一篇”

这是最经典的应用场景,在文章内容页 (article_article.htm),我们需要获取当前文章ID,然后调用ID比它大(下一篇)或小(上一篇)的文章。

获取当前文章ID

在文章详情页模板中,当前文章的ID可以通过全局变量 $arcID 获取,我们需要把它传递给 {dede:arclist}

实现方法

方法A:使用 idlist 参数(推荐,更灵活)

这种方法通过构造一个包含上一篇和下一篇ID的列表来实现。

dede arclist 当前文章
(图片来源网络,侵删)
<!-- 调用上一篇和下一篇 -->
{dede:arclist row='2' titlelen='30' orderby='id' idlist=''}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
{/dede:arclist}

关键在于如何填充 idlist,这通常需要配合PHP代码来实现,因为织梦模板本身不支持复杂的逻辑运算。

完整模板示例 (article_article.htm):

{dede:include filename="head.htm"/}
<div class="article-content">
    <h1>{dede:field.title/}</h1>
    <div class="article-info">
        发布时间:{dede:field.pubdate function="MyDate('Y-m-d H:i',@me)"/} &nbsp;&nbsp;
        作者:{dede:field.writer/} &nbsp;&nbsp;
        来源:{dede:field.source/}
    </div>
    <div class="article-body">
        {dede:field.body/}
    </div>
</div>
<!-- 上一篇/下一篇 开始 -->
<div class="prenext">
    <ul>
        <!-- PHP代码块,用于获取上一篇和下一篇的ID -->
        {dede:php}
            // 获取当前文章ID
            $arcID = $arcID;
            // 获取上一篇和下一篇的ID
            $preRow = $dsql->GetOne("SELECT id FROM `dede_archives` WHERE id < $arcID ORDER BY id DESC");
            $nextRow = $dsql->GetOne("SELECT id FROM `dede_archives` WHERE id > $arcID ORDER BY id ASC");
            // 将ID存入数组,用于idlist
            $idlist = array();
            if(is_array($preRow)) $idlist[] = $preRow['id'];
            if(is_array($nextRow)) $idlist[] = $nextRow['id'];
            // 将数组用逗号连接成字符串
            $idlistStr = implode(',', $idlist);
            // 将结果赋值给一个模板变量
            $this->Fields['prenext_idlist'] = $idlistStr;
        {/dede:php}
        <!-- 使用PHP传递过来的ID列表 -->
        {dede:arclist row='2' titlelen='30' orderby='id' idlist='[field:prenext_idlist/]'}
            <li>
                <!-- 使用runphp来判断是上一篇还是下一篇,并添加不同的样式 -->
                [field:array runphp='yes']
                    if (@me['id'] < $arcID) {
                        @me = '<span class="pre">上一篇:</span><a href="'.@me['arcurl'].'">'.@me['title'].'</a>';
                    } else {
                        @me = '<span class="next">下一篇:</span><a href="'.@me['arcurl'].'">'.@me['title'].'</a>';
                    }
                [/field:array]
            </li>
        {dede:arclist}
    </ul>
</div>
<!-- 上一篇/下一篇 结束 -->
{dede:include filename="footer.htm"/}

方法B:使用 channelartlist + type + noself (较旧,不推荐)

这种方法比较笨重,需要嵌套标签,且不够灵活,仅适用于简单的上一篇/下一篇调用。

dede arclist 当前文章
(图片来源网络,侵删)
<!-- 上一篇 -->
{dede:prenext get='pre'/}
<!-- 下一篇 -->
{dede:prenext get='next'/}

{dede:prenext} 是一个专门的标签,专门用来实现这个功能,非常简单,但自定义样式比较麻烦。


调用“相关文章”

相关文章通常指与当前文章在同一个栏目下的其他文章。

方法

只需要设置 typeid 为当前栏目ID,并排除当前文章即可。

{dede:arclist row='8' titlelen='30' typeid='' orderby='pubdate'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
{/dede:arclist}

这里 typeid='' 是关键,它会自动获取当前文章所在的栏目ID。row='8' 表示调用8篇相关文章。

进阶:排除当前文章

如果不想让当前文章出现在相关文章列表中,可以使用 notypeid 参数(这个参数是排除栏目ID的,不适用),或者更通用的方法是利用 idlist

{dede:arclist row='8' titlelen='30' typeid='' idlist='[field:id/],'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
{/dede:arclist}

错误示范! idlist 需要一个ID列表,而不是单个ID,正确的做法是结合PHP,构造一个不包含当前ID的列表,或者使用 innertext 进行判断。

推荐做法(结合PHP排除当前ID):

{dede:arclist row='8' titlelen='30' typeid='' orderby='rand'}
    [field:array runphp='yes']
        // $arcID 是全局变量,代表当前文章ID
        if (@me['id'] == $arcID) {
            // 如果是当前文章,则输出空
            @me = '';
        } else {
            // 如果不是当前文章,则正常输出
            @me = '<li><a href="'.@me['arcurl'].'">'.@me['title'].'</a></li>';
        }
    [/field:array]
{/dede:arclist}

这种方法通过 orderby='rand' 随机调用文章,然后在 innertext(这里是 [field:array])里用PHP判断并过滤掉当前文章。


调用当前文章本身的信息

虽然 {dede:arclist} 主要用于列表,但通过一些技巧,也可以用它来获取当前文章的单条信息,比如文章的缩略图。

需求:在文章页调用当前文章的缩略图。 页 (article_article.htm) 默认没有 {dede:field.litpic/} 这个变量,因为织梦默认不在文章内容页显示缩略图,但我们可以通过 {dede:arclist} 来“曲线救国”。

<!-- 调用当前文章的缩略图 -->
{dede:arclist row='1' idlist='[field:id/]'}
    <img src="[field:litpic/]" alt="[field:title/]" />
{/dede:arclist}

解释:

  • row='1': 只调用一篇文章。
  • idlist='[field:id/]': 将当前文章的ID作为调用列表。[field:id/] 在这个上下文中,会解析为当前文章的ID。
  • [field:litpic/]: 在 {dede:arclist} 循环体内,[field:litpic/] 就能正确获取到当前文章的缩略图路径。

总结与最佳实践

需求 推荐标签/方法 关键参数/代码
上一篇/下一篇 {dede:arclist} + PHP构造 idlist idlist, orderby='id', row='2'
相关文章 {dede:arclist} typeid='', row
排除当前文章 {dede:arclist} + PHP innertext 判断 innertext 内使用 runphp='yes'
获取当前文章单条信息(如缩略图) {dede:arclist} row='1', idlist='[field:id/]'

核心要点:

  1. 利用上下文变量:在文章详情页,$arcID (或 [field:id/]) 是获取当前文章ID的钥匙。
  2. 灵活运用 idlist:通过构造ID列表,可以精确控制要调用的文章范围,是实现“上一篇/下一篇”和“排除当前文章”的核心。
  3. PHP增强模板:当织梦模板标签无法满足复杂逻辑时,使用 {dede:php}{field:array runphp='yes'} 可以在模板中直接执行PHP代码,实现强大的功能。
  4. typeid='' 的妙用:在列表标签中,将 typeid 设为空字符串,通常会让标签自动获取当前栏目ID,非常方便。

希望这份详细的解析能帮助你完全掌握在DedeCMS中使用 {dede:arclist} 调用当前文章相关内容的方法!

-- 展开阅读全文 --
头像
织梦bootstrap模板哪里下载?
« 上一篇 今天
织梦marquee在IE中如何实现换行?
下一篇 » 今天

相关文章

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