dede_fieldshash 是什么?
dede_fieldshash 是一个在DedeCMS 列表页(list*.html)和内容页(article*.html) 模板中可用的PHP数组变量。

它的核心作用是:在页面加载时,获取并存储当前文档(文章)的所有自定义字段及其值。
它就像一个“数据容器”,把你在后台为这篇文章添加的所有自定义字段(如“作者简介”、“产品规格”、“视频链接”等)的“字段名”和“字段值”都存了进去,方便你在模板中直接调用。
dede_fieldshash 的核心作用与优势
在 dede_fieldshash 出现之前,调用自定义字段需要使用 {dede:field.字段名/} 这种方式,但这种方式存在两个主要问题:
- 效率低下:每调用一个自定义字段,系统就需要执行一次数据库查询,如果一篇文章有10个自定义字段,列表页显示10篇文章,那么就需要执行
10 * 10 = 100次额外的数据库查询,这对网站性能是巨大的负担。 - 灵活性差:模板写死,无法动态处理,你无法在模板里写一个循环来遍历所有自定义字段并显示出来。
dede_fieldshash 的出现完美解决了这两个问题:

- 性能优化:它只在页面加载时一次性查询并缓存所有自定义字段的数据,之后在模板中无论调用多少次,都只是从这个内存数组中读取,无需再访问数据库,极大地提升了页面加载速度。
- 灵活调用:因为它是一个标准的PHP数组,你可以在模板中结合PHP代码(使用
{dede:php}...{/dede:php}标签)进行各种复杂的操作,如遍历、判断、格式化输出等。
如何使用 dede_fieldshash?
dede_fieldshash 的使用分为两种情况:列表页 和 内容页。
在列表页模板 (list_*.html) 中使用
在列表页,{dede:list} 标签的底层会循环生成每一篇文章,在循环内部,field 变量代表当前文章的常规字段(如标题、ID、发布时间等),而 fields 变量则代表当前文章的自定义字段集合。
重要提示:在列表页,自定义字段的数组变量名是 fields,而不是 fieldshash。fieldshash 通常在内容页或通过PHP代码中指代这个概念。
示例:调用文章的“产品价格”这个自定义字段

假设你在后台模型中添加了一个名为 price 的自定义字段。
{dede:list pagesize='10'}
<li>
<!-- 调用常规字段 -->
<a href="[field:arcurl/]">[field:title/]</a>
<!-- 调用自定义字段 "price" -->
<!-- 方法一:直接调用(推荐) -->
价格:[field:price/]
<!-- 方法二:通过PHP代码调用(更灵活) -->
{dede:php}
if(isset($fields['price']) && !empty($fields['price'])) {
echo "价格(PHP方式):" . $fields['price'];
}
{/dede:php}
</li>
{/dede:list}
遍历并显示所有自定义字段(高级用法)
如果你想显示一篇文章的所有自定义字段,而不是一个个写死,可以这样:
{dede:list pagesize='10'}
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<div class="custom-fields">
{dede:php}
// 遍历 $fields 数组
foreach ($fields as $fieldname => $fieldvalue) {
// 过滤掉一些系统内置的或不需要显示的字段
if (!in_array($fieldname, array('id', 'typeid', 'arcrank', 'channel', 'senddate', 'mid'))) {
// 自定义字段的配置信息通常存储在 @me 中
$fieldInfo = $GLOBALS['fields_array'][$fieldname];
if ($fieldInfo) {
echo "<p><strong>" . $fieldInfo['itemname'] . ":</strong> " . $fieldvalue . "</p>";
}
}
}
{/dede:php}
</div>
{/dede:list}
注意:$GLOBALS['fields_array'] 存储了所有自定义字段的配置信息,如字段名、字段别名、字段说明等。
页模板 (article_*.html) 中使用
页,系统已经将当前文章的所有数据(包括常规字段和自定义字段)加载到了 this 对象中。dede_fieldshash 在这里通常以 this->Fields 的形式存在,并且它是一个包含了所有字段的大数组。
示例:调用文章的“作者简介”和“视频链接”
假设自定义字段名为 author_intro 和 video_url。
<h1>{dede:field.title/}</h1>
<div class="content">
{dede:field.body/}
</div>
<div class="additional-info">
<!-- 方法一:直接调用(最常用) -->
<h3>作者简介</h3>
<p>{dede:field.author_intro/}</p>
<h3>相关视频</h3>
<video src="{dede:field.video_url/}" controls width="100%"></video>
</div>
<!-- 方法二:通过PHP代码遍历所有自定义字段 -->
{dede:php}
if (isset($this->Fields) && is_array($this->Fields)) {
echo "<h3>所有自定义字段信息:</h3><ul>";
foreach ($this->Fields as $key => $value) {
// 通常我们不希望显示一些系统字段
if (!in_array($key, array('id', 'typeid', 'sortrank', 'ismake', 'channel', 'arcrank', 'click', 'money', 'title'))) {
echo "<li><strong>" . $key . ":</strong> " . $value . "</li>";
}
}
echo "</ul>";
}
{/dede:php}
总结与最佳实践
| 特性 | 说明 |
|---|---|
| 变量本质 | 一个PHP数组,存储了当前文档的自定义字段名和值。 |
| 核心优势 | 性能优化:一次查询,多次调用,避免数据库冗余访问。 |
| 列表页使用 | 变量名为 fields,在 {dede:list} 循环内部使用。 |
| 调用方式 | 首选:{dede:field.字段名/} 备选:在 {dede:php} 标签内通过 $fields['字段名'] 或 $this->Fields['字段名'] 调用。 |
| 适用场景 | 所有需要调用自定义字段的列表页和内容页模板。 |
最佳实践建议:
- 优先使用简写:在模板中,直接使用
{dede:field.字段名/}是最简洁、最高效的方式,DedeCMS底层会自动从fields或this->Fields数组中取值。 - 复杂逻辑用PHP:当你需要对自定义字段进行判断、循环、拼接等复杂操作时,务必使用
{dede:php}...{/dede:php}标签,利用PHP的强大功能来实现。 - 保持命名规范:在后台添加自定义字段时,使用有意义的英文字段名(如
product_price,author_intro),方便在模板中记忆和调用。
掌握 dede_fieldshash(及其在列表页的体现 fields)的使用,是提升DedeCMS模板制作效率和网站性能的关键一步。
