使用Dede自带的 arclist 标签(推荐,最简单)
这是最直接、最简单的方法,特别适合在列表页调用,它通过两次 arclist 标签分别获取最低价和最高价。

(图片来源网络,侵删)
核心思路:
- 使用一个
arclist标签,配合orderby='price'和orderway='asc'(升序),取第一条记录的价格,即为最低价。 - 再使用一个
arclist标签,配合orderby='price'和orderway='desc'(降序),取第一条记录的价格,即为最高价。
代码示例:
将以下代码放在你需要显示价格区间的模板文件中(list_article.htm)。
<p>
价格区间:
<!-- 获取最低价 -->
<strong>
[field:array name='min_price']
[field:price/]
[/field:array]
</strong>
元 至
<!-- 获取最高价 -->
<strong>
[field:array name='max_price']
[field:price/]
[/field:array]
</strong>
元
</p>
代码解释:

(图片来源网络,侵删)
[field:array name='min_price']...[/field:array]和[field:array name='max_price']...[/field:array]是arclist标签的特殊用法,用于获取指定条件的单条数据。orderby='price'表示按price字段排序。orderway='asc'表示升序排序(从小到大),第一条就是最低价。orderway='desc'表示降序排序(从大到小),第一条就是最高价。[field:price/]用于输出获取到的价格值。
优点:
- 简单直接,无需修改任何PHP文件。
- 效率较高,Dede对
arclist标签做了很好的优化。
缺点:
- 如果该分类下没有商品,可能会显示错误或空白。
使用自定义函数(更灵活,推荐用于复杂逻辑)
如果你的需求更复杂,或者想在其他地方调用,创建一个自定义函数是更好的选择。
核心思路:

(图片来源网络,侵删)
- 在
include/extend.func.php文件中添加一个PHP函数,用于查询指定栏目下的最低价和最高价。 - 在模板中调用这个自定义函数。
第一步:添加自定义函数
打开 include/extend.func.php 文件,在文件末尾添加以下PHP代码:
/**
* 获取指定栏目ID下的商品价格区间
* @param int $typeid 栏目ID
* @return string 返回格式为 "最低价-最高价" 的字符串,如果无数据则返回 "暂无"
*/
function GetPriceRange($typeid = 0) {
if (empty($typeid)) {
return '暂无';
}
global $dsql;
// 构建SQL查询,获取最低价和最高价
$query = "SELECT MIN(price) AS min_price, MAX(price) AS max_price FROM `#@__arctiny` a
LEFT JOIN `#@__addonshop` s ON a.id = aid
WHERE a.typeid = $typeid AND a.arcrank > -1";
$row = $dsql->GetOne($query);
if (empty($row['min_price'])) {
return '暂无';
}
return $row['min_price'] . '-' . $row['max_price'];
}
代码解释:
GetPriceRange($typeid)函数接收一个栏目ID作为参数。- 使用
MIN(price)和MAX(price)聚合函数一次性查询出最低价和最高价,效率比方法一更高。 #@__arctiny是Dede的文章(商品)主表,#@__addonshop是Dede商城的附加表,price字段通常在附加表中。a.typeid = $typeid用于限定查询的栏目。a.arcrank > -1用于过滤掉被删除或审核未通过的文章。
第二步:在模板中调用
在模板文件中,使用 {dede:} 标签来调用这个函数。
<p>
价格区间:
<strong>
{dede:getprice range='min' typeid='栏目ID'/}
</strong>
元 至
<strong>
{dede:getprice range='max' typeid='栏目ID'/}
</strong>
元
</p>
或者,如果你想让函数直接返回区间字符串(推荐):
修改你的函数,让它直接返回区间字符串,然后在模板中直接调用。
修改后的函数:
function GetPriceRange($typeid = 0) {
// ... (函数内部代码同上)
return $row['min_price'] . '-' . $row['max_price'];
}
模板调用方式:
<p>
价格区间:
<strong>
{dede:global.name function='GetPriceRange(@me)'/}
</strong>
元
</p>
- 这种方式更简洁,但需要确保
typeid能正确传递,通常在列表页,@me可以代表当前栏目ID,或者使用{dede:field name='typeid'/}来获取。
修改 arclist 标签源码(不推荐,仅作了解)
这种方法功能最强大,可以让你直接使用 [field:minprice/] 和 [field:maxprice/],但需要修改Dede核心文件,升级时可能会被覆盖,不推荐新手使用。
核心思路:
修改 include/taglib/arclist.lib.php 文件,在查询数据时,增加一个子查询来获取当前栏目下的价格区间,并将结果附加到每条记录中。
操作步骤(简述):
- 打开
include/taglib/arclist.lib.php。 - 找到生成
$query的SQL语句。 - 修改这个SQL,使用
JOIN和一个子查询来为每条记录附加min_price和max_price字段。 - 在模板中就可以直接使用
[field:minprice/]和[field:maxprice/]。
由于此方法涉及修改核心文件,且代码逻辑较为复杂,容易出错,因此强烈建议优先使用方法一和方法二。
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
arclist |
简单、无需修改文件、效率高 | 需要写两个标签,无商品时可能空白 | 绝大多数情况下的首选,特别是列表页。 |
| 自定义函数 | 灵活、效率高(一次查询)、可复用 | 需要修改 extend.func.php 文件 |
需要在多处调用,或逻辑较复杂时。 |
| 修改源码 | 功能强大,标签简洁 | 危险(覆盖核心文件)、升级麻烦、不易维护 | 不推荐,除非你有特殊需求且非常熟悉Dede。 |
给你的最终建议:
- 如果你只是想在商品列表页显示价格区间,直接使用方法一,它最简单也最可靠。
- 如果你想在多个页面(如首页、栏目页)都使用这个功能,或者想对价格进行更复杂的处理(如格式化),那么使用方法二创建自定义函数是最佳选择。
