使用 {dede:arclist} 标签(最常用、最推荐)
{dede:arclist} 是织梦最核心、最强大的列表标签之一,它本身就支持按随机顺序调用文章。

(图片来源网络,侵删)
标签语法
{dede:arclist flag='h' orderby='rand' titlelen='30' row='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:arclist}
参数详解
orderby='rand': 这是实现随机功能的核心参数,它告诉织梦按随机顺序获取文章。row='10': 设置调用文章的数量,这里调用10篇。titlelen='30': 设置文章标题的长度,最多显示30个字符(一个汉字算2个字符)。flag='h': 可选参数,用于指定文章属性。h: 推荐c: 幻灯片(首页焦点图)p: 图片s: 跳转 如果不设置,则调用所有符合条件的文章。
typeid: 可选参数,指定调用哪个栏目下的文章。typeid='1,2,3'表示调用栏目ID为1、2、3下的文章,不设置则调用全站文章。channelid: 可选参数,指定调用哪个模型的文章。channelid='1'表示调用文章模型。
完整示例
假设你想在首页的侧边栏随机调用10篇“技术分享”栏目(假设栏目ID为3)的文章,标题长度限制在25个字符。
<div class="sidebar-widget">
<h3>随机技术文章</h3>
<ul>
{dede:arclist typeid='3' orderby='rand' titlelen='25' row='10'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
</li>
{dede:arclist}
</ul>
</div>
使用 {dede:sql} 标签(更灵活,适合复杂场景)
当 {dede:arclist} 无法满足你的需求时(需要联合多表查询进行随机筛选),可以使用 {dede:sql} 标签直接执行SQL语句。
标签语法
{dede:sql sql="SELECT id, title, arcurl FROM dede_archives WHERE channel=1 AND arcrank > -1 ORDER BY RAND() LIMIT 0, 10"}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:sql}
参数详解
sql="...": 这是核心参数,填写你需要执行的SQL查询语句。SELECT id, title, arcurl FROM dede_archives: 从文章主表dede_archives中查询文章ID、标题和链接地址。注意: 文章链接(arcurl)在dede_archives表中不存在,需要通过{dede:field name='arcurl'/}这样的全局函数来获取,或者使用更复杂的JOIN查询,上面的例子为了简化,直接使用了[field:arcurl/],这在实际中可能无法正常工作,更稳妥的方式是只获取ID,然后通过ID来生成链接。WHERE channel=1 AND arcrank > -1: 查询条件。channel=1表示文章模型,arcrank > -1表示排除所有被审核状态为“待审核”或“回收站”的文章。ORDER BY RAND(): MySQL的随机排序函数,与orderby='rand'效果相同。LIMIT 0, 10: 从第0条记录开始,获取10条记录,即获取10篇文章。
更健壮的 sql 示例
这个例子先获取ID,再利用织梦的全局函数 GetArcUrl() 来生成链接,这样更可靠。
{dede:sql sql="SELECT id FROM dede_archives WHERE channel=1 AND arcrank > -1 ORDER BY RAND() LIMIT 0, 10"}
<li>
<a href='{dede:field name='id' function="GetArcUrl(@me)"/}'>[field:id function="GetTitle(@me)"/]</a>
</li>
{/dede:sql}
[field:id function="GetArcUrl(@me)"]: 获取当前记录的id字段,并将其作为参数传递给GetArcUrl()函数,函数会返回该ID对应的文章URL。[field:id function="GetTitle(@me)"]: 同样,通过ID获取文章标题。
使用自定义函数(高级用法,性能最优)
如果你的网站对性能要求非常高,并且需要频繁调用随机文章,可以使用PHP自定义函数的方式,这种方式将查询逻辑放在PHP文件中,比模板标签执行效率更高。

(图片来源网络,侵删)
步骤 1:创建PHP函数文件
在 include/extend.func.php 文件中(如果此文件不存在,请自行创建)添加以下PHP函数:
/**
* 调用随机文章
* @param int $num 调用数量
* @param string $typeid 栏目ID,多个用逗号隔开
* @param string $channelid 模型ID
* @return string 返回HTML列表
*/
function GetRandomArticles($num = 10, $typeid = '', $channelid = '1') {
global $dsql;
// 构建SQL查询
$sql = "SELECT id, title FROM dede_archives WHERE channel = {$channelid} AND arcrank > -1 ";
if (!empty($typeid)) {
$sql .= " AND typeid IN ({$typeid}) ";
}
$sql .= " ORDER BY RAND() LIMIT 0, {$num}";
$items = '';
$dsql->SetQuery($sql);
$dsql->Execute();
while ($row = $dsql->GetArray()) {
// 使用织梦的全局函数获取URL和格式化标题
$arcurl = GetArcUrl($row['id']);
$title = cn_substr($row['title'], 30); // 截取30个字符
$items .= "<li><a href='{$arcurl}' title='{$row['title']}'>{$title}</a></li>";
}
return $items;
}
步骤 2:在模板中调用
在任意需要显示随机文章的模板文件(如 index.htm)中,直接调用这个函数即可。
<div class="random-articles">
<h3>编辑推荐</h3>
<ul>
{dede:getrandomarticles num='8' typeid='4,5' channelid='1'/}
</ul>
</div>
模板标签说明:
- 这个
{dede:getrandomarticles/}是我们自定义的标签,它会被include/extend.func.php中的函数解析。 num='8': 调用8篇文章。typeid='4,5': 只调用栏目ID为4和5下的文章。channelid='1': 只调用文章模型。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
{dede:arclist} |
简单、高效、官方支持,参数丰富,是首选方案。 | 在某些极特殊、复杂的查询条件下可能不够灵活。 | 90%以上的随机文章调用需求,特别是按栏目、按属性筛选时。 |
{dede:sql} |
极其灵活,可以执行任何自定义SQL,不受标签限制。 | 需要一定的SQL基础,写错SQL可能导致网站出错。 | 需要联合多表查询、或者有非常特殊筛选条件的复杂随机调用。 |
| 自定义函数 | 性能最高,逻辑清晰,可复用性强。 | 需要修改PHP文件,对新手有一定门槛。 | 大型网站,或某个位置需要高频调用随机文章,对页面加载速度有极致要求时。 |
对于绝大多数用户来说,强烈推荐使用方法一 {dede:arclist},它已经足够强大且易用。

(图片来源网络,侵删)
