织梦CMS本身提供了一个核心函数 GetQueryString() 来安全地获取 $_GET 参数,这是推荐使用的标准方法,直接使用PHP原生 $_GET 也是可以的,但前者更安全、更符合织梦的开发规范。

下面我将详细介绍几种在织梦模板中接收 $_GET 参数的方法,并附上实例。
使用织梦核心函数 GetQueryString() (推荐)
这是最安全、最规范的方法。GetQueryString() 函数会对获取的参数进行过滤,可以有效防止SQL注入和XSS攻击。
语法
{dede:global name='变量名'/}
这里的 变量名 就是你想获取的 $_GET 参数的键名。
示例:实现一个简单的筛选功能
假设你的URL是:/plus/list.php?tid=1&keyword=织梦

你希望在列表页模板中获取 tid 和 keyword 这两个参数。
修改列表页模板 (/plus/list_article.htm)
在模板的合适位置,你可以直接使用这两个变量来显示或进行逻辑判断。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">{dede:global name='keyword'/} - 搜索结果</title>
</head>
<body>
<h1>
{dede:if function='isset(@me)'}
正在显示关于 "{dede:global name='keyword'/}" 的搜索结果
{else /}
所有文章列表
{/dede:if}
</h1>
<p>
当前栏目ID: {dede:global name='tid'/}
</p>
<!-- 这里是你的文章列表循环 -->
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:list}
<!-- 这里是分页 -->
<div class="dede_pages">
<ul>{dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="5"/}</ul>
</div>
</body>
</html>
说明:

{dede:global name='tid'/}会获取$_GET['tid']的值,即1。{dede:global name='keyword'/}会获取$_GET['keyword']的值,即织梦。{dede:if function='isset(@me)'}是一个判断,keyword参数存在,就显示特定的标题,否则显示默认标题。
直接使用PHP原生 $_GET
在某些复杂的逻辑处理中,你可能需要直接访问 $_GET 数组,在织梦模板中,你可以通过 php 标签来实现。
示例:根据不同参数显示不同内容
假设URL是:/plus/list.php?mode=newest 或 /plus/list.php?mode=hot
修改列表页模板 (/plus/list_article.htm)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">文章列表</title>
</head>
<body>
<h1>
{dede:php}
// 直接使用PHP获取参数
$mode = isset($_GET['mode']) ? $_GET['mode'] : 'default';
if ($mode == 'newest') {
echo '最新文章';
} elseif ($mode == 'hot') {
echo '热门文章';
} else {
echo '所有文章';
}
{/dede:php}
</h1>
<!-- 文章列表... -->
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:list}
</body>
</html>
说明:
{dede:php}...{/dede:php}标签允许你在模板中直接写PHP代码。- 这种方法非常灵活,但要注意安全性,如果直接将获取的参数用于SQL查询,必须手动进行过滤和转义,否则存在巨大的安全风险,织梦的标签系统已经内置了安全处理,直接使用PHP会绕过这一层保护。
结合 GetQueryString 和 dede:sql 标签 (高级应用)
这是实现动态查询功能的核心,比如根据URL中的ID或关键词来查询并显示特定内容。
示例:根据URL中的ID获取特定文章信息
假设你有一个自定义的URL,如:/plus/view.php?aid=123&from=index
你想在模板中获取 aid 并用它来查询文章。
修改文章内容页模板 (/plus/view_article.htm)
页默认通过 arcID 全局变量获取文章ID,如果你想额外获取其他参数,可以这样:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">{dede:field.title/}</title>
</head>
<body>
<h1>{dede:field.title/}</h1>
<p>来源:{dede:field.source/}</p>
<p>时间:{dede:field.pubdate function="MyDate('Y-m-d H:i:s', @me)"/}</p>
<hr>
<div>
{dede:field.body/}
</div>
<hr>
<h3>根据来源参数显示其他信息</h3>
{dede:php}
$from = isset($_GET['from']) ? $_GET['from'] : '';
if (!empty($from)) {
echo "您是从 {$from} 页面跳转过来的。";
}
{/dede:php}
</body>
</html>
更复杂的动态查询示例
假设你有一个需求:在列表页,如果URL中带有 search 参数,就只显示标题包含该关键词的文章。
这需要修改列表页的底层文件,但我们可以通过模板技巧模拟一个简单的效果。
修改列表页模板 (/plus/list_article.htm)
在 {dede:list} 标签之前,先获取关键词,然后手动构建一个 where 条件。
{dede:php}
// 获取关键词
$keyword = GetQueryString('keyword');
// 初始化where条件
$where = '';
// 如果关键词存在,则添加查询条件
if (!empty($keyword)) {
// 注意:这里为了演示直接拼接,实际项目中应使用更安全的预处理方式
// 但织梦的标签系统会处理,所以这里相对安全
$where = " AND arc.title LIKE '%{$keyword}%'";
}
// 将条件赋值给一个模板变量
$this->Fields['where_condition'] = $where;
{/dede:php}
<!-- 在列表页的SQL调用中使用这个条件 -->
{dede:sql sql="SELECT * FROM `dede_archives` WHERE channel=1 AND arcrank > -1 [field:where_condition/] ORDER BY id DESC LIMIT 0, 10"}
<li>
<a href="/plus/view.php?aid=[id]">[title]</a>
</li>
{/dede:sql}
注意:
- 这个例子直接在模板中拼接SQL,虽然织梦的底层函数会做一些过滤,但对于复杂的查询,最佳实践是修改PHP文件(如
arc.listview.class.php)来处理这些动态条件,而不是在模板中硬编码SQL。 - 对于列表页的筛选功能,织梦有更标准的实现方式,即修改列表页的底层文件,在
where子句中增加对$_GET参数的判断。
总结与最佳实践
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
{dede:global} |
安全、简单、规范,自动过滤 | 功能相对单一,不适合复杂逻辑 | 获取单个参数用于显示,如ID、关键词、分类ID等。 |
{dede:php} |
灵活强大,可以执行任意PHP代码 | 安全性较低,容易引入XSS/SQL注入风险,破坏模板分离原则 | 复杂的条件判断、变量计算、循环等PHP原生逻辑。 |
结合 sql |
动态查询,非常灵活 | 代码可读性差,性能不佳,安全性需特别注意 | 需要根据URL参数动态改变查询条件的简单场景。 |
核心建议:
- 优先使用
{dede:global name='xxx'}:这是获取$_GET参数最标准、最安全的方式,90% 的需求都可以用它解决。 - 谨慎使用
{dede:php}:只在确实需要原生PHP逻辑且无法用织梦标签实现时使用,在php标签内,如果变量要输出到HTML,请记得使用htmlspecialchars()函数进行转义,防止XSS攻击。 - 对于列表页筛选,修改底层文件是最佳方案:如果你需要实现一个完整的、高性能的列表筛选功能(如按价格、品牌、时间筛选),最正确的方法是修改列表页的底层处理类(通常是
arc.listview.class.php),在GetListSql()方法中增加对$_GET参数的判断和WHERE子句的拼接,这样既安全又高效。
希望这份详细的指南能帮助你在织梦CMS模板开发中游刃有余!
