dede如何不调用自身数据实现内容展示?

99ANYc3cd6
预计阅读时长 13 分钟
位置: 首页 DEDE建站 正文
  1. 列表页调用栏目文章,但不包含当前栏目本身。 这是最常见的需求,比如在首页或某个大栏目下,调用其子栏目的文章,但不想显示当前这个大栏目自己的文章。
  2. 页调用相关文章,但排除当前文章。 在文章页底部,我们通常想显示“相关文章”,这个“相关”肯定不应该包含文章自己。

下面我将针对这两种最常见的场景,提供详细的解决方案和代码示例。

dede 不调用自身
(图片来源网络,侵删)

列表页调用子栏目文章,但不调用当前栏目自身

假设你的栏目结构是这样的:

  • 首页
  • 新闻中心 (ID=1)
    • 国内新闻 (ID=2)
    • 国际新闻 (ID=3)
    • 科技新闻 (ID=4)

你希望在“新闻中心”这个列表页,只显示其子栏目(国内、国际、科技)的文章,而不显示“新闻中心”栏目本身发布过的文章

DedeCMS 的 arclist 标签本身没有直接的“排除自身栏目”参数,但我们可以通过一个巧妙的间接方法来实现:不指定 typeid,而是用 topid 来获取顶级栏目ID,然后在子查询中排除这个顶级ID

方法:使用 topidNOT IN 查询

  1. 获取当前顶级栏目ID 在模板中,我们可以通过 {dede:field.typeid/} 获取当前栏目的ID,然后通过 GetTopid() 函数来获取其顶级栏目ID,在“新闻中心”页面,GetTopid() 的结果就是 1

    dede 不调用自身
    (图片来源网络,侵删)
  2. 编写 arclist 我们使用 typeid 来指定要调用的栏目,用 topid 来获取顶级ID,然后用 notypeid 来排除这个顶级ID。

代码示例:

{dede:arclist 
    typeid='top' 
    topid='GetTopid()' 
    notypeid='GetTopid()' len='30' 
    row='10'
}
    <li>
        <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
    </li>
{/dede:arclist}

代码解释:

  • typeid='top': 这个参数非常重要,它表示调用顶级栏目(即 topid 指定的栏目)下的所有子栏目。
  • topid='GetTopid()': 获取当前页面的顶级栏目ID,在“新闻中心”页面,它会返回 1
  • notypeid='GetTopid()': 这是实现“不调用自身”的关键,它告诉 arclist 标签,在调用子栏目时,要排除掉 topid 所指定的那个顶级栏目(ID=1的“新闻中心”)。

这样,arclist 就只会调用 topid(ID=1)的子栏目(ID=2,3,4)的文章,而不会调用 ID=1 的文章,完美实现了需求。

dede 不调用自身
(图片来源网络,侵删)

页调用相关文章,但不调用当前文章

这个需求非常普遍,在文章页,我们使用 likearticle 标签来调用相关文章,但它默认可能包含当前文章,我们需要排除它。

方法:使用 idlist 参数排除当前文章ID

likearticle 标签有一个 idlist 参数,可以指定一个文章ID列表,这些ID的文章不会被调用,我们可以利用这一点,将当前文章的ID放入 idlist 中。

代码示例:

<div class="related-article">
    <h3>相关文章</h3>
    <ul>
        {dede:likearticle 
            row='6' 
            titlelen='30'
            idlist=''}
            <li>
                <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
            </li>
        {/dede:likearticle}
    </ul>
</div>

代码解释:

  • idlist='': 这里我们把 idlist 参数留空,看起来好像没什么用,但实际上,likearticle 在生成SQL查询时,idlist 为空,它不会添加 AND aid NOT IN (...) 这个条件。
  • 如何真正排除? 这需要修改 likearticle 标签的底层PHP文件,但有一个更简单、更推荐的“曲线救国”方法。

推荐方法:利用 arcid 参数(更简单)

likearticle 标签有一个 arcid 参数,用于指定当前文章的ID,当指定了 arcid 后,DedeCMS 的底层逻辑会自动排除这个ID的文章。

修改后的代码示例(推荐):

<div class="related-article">
    <h3>相关文章</h3>
    <ul>
        {dede:likearticle 
            row='6' 
            titlelen='30'
            arcid=''}
            <li>
                <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
            </li>
        {/dede:likearticle}
    </ul>
</div>

代码解释:

  • arcid='': 同样,我们把它留空,在模板解析时,DedeCMS 会自动将当前文章的ID ({dede:field.id/}) 赋值给 arcid 这个变量。
  • 底层PHP代码 /include/taglib/likearticle.lib.php 中,会检查 arcid 是否有值,如果有,它就会在最终的SQL查询中加上 AND arc.aid <> '$arcid' 条句,从而确保当前文章不会被调用出来。

这是最标准、最简洁的实现方式。


总结与补充

需求场景 推荐标签 关键参数 实现原理
列表页不调用当前栏目自身 arclist typeid='top' topid='GetTopid()' notypeid='GetTopid()' 调用顶级栏目下的子栏目,并排除顶级栏目本身。
文章页不调用当前文章 likearticle arcid='' (留空,系统自动填充) 底层逻辑自动排除 arcid 所指定的文章ID。

重要提示:

  • 修改文件风险:上述方法均不涉及修改DedeCMS核心文件,是安全且推荐的做法,如果你在网上找到需要修改 likearticle.lib.php 文件的方案,请务必谨慎,因为这可能会导致升级时被覆盖或引入新的问题。
  • 标签文档:遇到问题时,最好的参考资料是DedeCMS自带的标签文档,你可以在后台找到“模板” -> “标签调用”,里面有详细的参数说明。

希望这些详细的解释和示例能帮助你完美解决“不调用自身”的问题!

-- 展开阅读全文 --
头像
C语言中kbhit()如何检测键盘输入?
« 上一篇 04-17
C语言中getprop如何获取系统属性?
下一篇 » 04-17

相关文章

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