dede arclist如何排除当前文章?

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

使用 arcid 参数 (最推荐)

这是最直接、最简洁、效率最高的方法。arcid 参数用于指定一个或多个文章 ID 的列表,系统在调用时会排除这些 ID。

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

语法: arcid='这里填要排除的文章ID'

示例: 假设当前文章的 ID 是 15,你想要调用除了这篇文章之外的其他文章。

{dede:arclist row='10' titlelen='30' arcid='15'}
    <li>
        <a href='[field:arcurl/]'>[field:title/]</a>
    </li>
{/dede:arclist}

如何动态获取当前文章 ID? 在实际使用中,你不可能手动去填写 ID,你需要动态获取当前页面的文章 ID,可以通过 DedeCMS 的全局变量 $arcid 来实现。

{dede:arclist row='10' titlelen='30' arcid=''}
    <li>
        <a href='[field:arcurl/]'>[field:title/]</a>
    </li>
{/dede:arclist}
<script type="text/javascript">
    // 使用 JavaScript 获取当前文章 ID 并赋值给 arcid 参数
    document.addEventListener('DOMContentLoaded', function() {
        // DedeCMS 在文章详情页会定义全局变量 arcid
        if(typeof(arcid) != 'undefined') {
            // 找到 arclist 标签,并为其添加 arcid 属性
            var arclistTags = document.getElementsByTagName('dede:arclist');
            for(var i=0; i<arclistTags.length; i++) {
                // 注意:直接修改标签属性在JS中可能无效,这里推荐使用JS动态生成或使用后端PHP处理
                // 更好的方式是在模板里直接使用PHP变量
            }
        }
    });
</script>

更简单、更推荐的动态写法 (PHP 模板语法): 在模板文件中,你可以直接使用 PHP 代码来动态生成 arcid 的值,这是最稳妥的方法。

dede arclist 排除当前文章
(图片来源网络,侵删)
{dede:arclist row='10' titlelen='30' arcid=''}
    <li>
        <a href='[field:arcurl/]'>[field:title/]</a>
    </li>
{/dede:arclist}
<script type="text/javascript">
    // 将当前文章ID通过JS变量传递给模板
    document.addEventListener('DOMContentLoaded', function() {
        var currentArcid = '{dede:field.id/}';
        // 找到arclist标签的容器(给它一个id)
        var arclistContainer = document.getElementById('related-articles');
        if(arclistContainer) {
            // 这里需要配合JS模板引擎或者重新请求API来实现,比较复杂。
            // 最简单的方法还是直接在模板里写PHP。
        }
    });
</script>

最佳实践 (直接在模板中使用PHP): 如果你的模板支持直接写 PHP 代码(通常是 .htm 文件,但 DedeCMS 会解析其中的 PHP),这是最完美的方案。

{dede:arclist row='10' titlelen='30' arcid=''}
    <li>
        <a href='[field:arcurl/]'>[field:title/]</a>
    </li>
{/dede:arclist}
<!-- 更优雅的写法,直接在标签内使用PHP变量 -->
{dede:arclist row='10' titlelen='30' arcid=''}
    <li>
        <a href='[field:arcurl/]'>[field:title/]</a>
    </li>
{/dede:arclist}

注意:直接在模板中写 <?php ?> 在某些 DedeCMS 版本或配置下可能被禁用,如果上面的代码不生效,请尝试下面的方法。


使用 idlist 参数的反向逻辑

idlist 参数用于指定一个只包含的文章 ID 列表,它的逻辑和 arcid 相反,我们可以利用这个特性。

思路:

dede arclist 排除当前文章
(图片来源网络,侵删)
  1. 先获取当前栏目的所有文章 ID 列表。
  2. 从这个列表中移除当前文章的 ID。
  3. 将处理后的 ID 列表传给 idlist 参数。

示例:

{dede:arclist 
    row='10' len='30'
    idlist=''
}
    <li>
        <a href='[field:arcurl/]'>[field:title/]</a>
    </li>
{/dede:arclist}

说明: 这种方法同样需要动态生成 ID 列表,实现起来比 arcid 更复杂,因为你需要先获取一个列表再进行过滤。不推荐作为首选方案,除非你有特殊需求。


使用 notin 条件 (SQL 排除)

notinarclist 标签的一个底层查询条件,它允许你直接在 SQL 查询的 WHERE 子句中添加 NOT IN 条件,这种方法非常灵活,但需要你了解一点 SQL 语法。

语法: notin="字段名, '要排除的ID1,要排除的ID2, ...'"

示例: 排除当前 ID 为 15 的文章。

{dede:arclist row='10' titlelen='30' notin='id, 15'}
    <li>
        <a href='[field:arcurl/]'>[field:title/]</a>
    </li>
{/dede:arclist}

动态实现: 同样,为了动态获取 ID,你需要结合 PHP。

{dede:arclist row='10' titlelen='30' notin='id, '}
    <li>
        <a href='[field:arcurl/]'>[field:title/]</a>
    </li>
{/dede:arclist}

注意notin 参数虽然强大,但在某些 DedeCMS 版本中,如果参数处理不当,可能会存在安全隐患(SQL注入),确保传入的 ID 是数字类型至关重要。arcid 参数在底层已经被 DedeCMS 做了安全处理,所以更安全。


总结与推荐

方法 优点 缺点 推荐度
arcid 参数 语法最简单,最直观,性能最好,官方推荐 需要动态获取 ID ★★★★★
notin 条件 灵活,可用于排除其他字段 语法稍复杂,有潜在安全风险,非官方首选 ★★★☆☆
idlist 参数 逻辑清晰(白名单) 实现复杂,需要先获取列表再过滤 ★★☆☆☆

最终结论:

请优先使用 arcid 参数。

对于动态排除当前文章,最可靠的实现方式是在模板文件中直接使用 PHP 代码来设置 arcid 的值。

<!-- 假设这是在文章详情页 article.htm -->
{dede:arclist 
    row='10' len='30' 
    typeid='当前栏目ID' 
    channelid='-1' 
    flag='c' 
    arcid=''
}
    <li>
        <a href="[field:arcurl/]">[field:title function='cn_substr(@me,30)'/]</a>
    </li>
{/dede:arclist}

如何让上面的代码生效?

  1. 打开你的文章详情页模板文件(通常是 /templets/default/article_article.htm)。
  2. 找到你想放置“相关文章”的位置。
  3. 将上面的代码粘贴进去。
  4. DedeCMS 在解析这个模板时,{dede:field.id/} 会被替换成当前文章的实际 ID,从而 arcid 就被动态设置为当前文章 ID,实现了排除自身的功能。

如果直接写 PHP 不生效怎么办? 如果你的服务器禁用了模板中的 PHP 执行,你需要修改 DedeCMS 的核心文件 /include/taglib/arclist.lib.php,找到生成 SQL 查询的地方,在 $addsql 条件中增加对 arcid 的处理,但这属于二次开发,有一定风险,不推荐普通用户尝试。

首先尝试使用 arcid='' 这种写法,它通常在 DedeCMS 的默认环境下是有效的

-- 展开阅读全文 --
头像
C语言字符串长度函数是什么?
« 上一篇 12-06
织梦cms的pagelist标签如何自定义排序?
下一篇 » 12-06

相关文章

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

目录[+]