使用官方提供的 {dede:php} 标签 (最推荐、最规范)
这是 DedeCMS 官方支持且最灵活的方法,通过在模板中嵌入 PHP 代码来实现逻辑判断,它不会修改核心文件,升级网站时也不会丢失。

(图片来源网络,侵删)
适用场景:当你想为某个特定的页面(比如文章详情页 article_article.htm 或栏目列表页 list_category.htm)添加登录判断时。
操作步骤:
-
准备一个提示页面:
- 在你的模板目录(通常是
/templets/你的模板名/)下,创建一个新的 HTML 文件,login_tip.htm。 - 在这个文件里,你可以自定义提示内容和样式,
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>提示 - {dede:global.cfg_webname/}</title> <style> body { font-family: Arial, sans-serif; text-align: center; padding-top: 100px; } .tip-box { border: 1px solid #ddd; padding: 20px; border-radius: 5px; display: inline-block; } .tip-box h2 { color: #e74c3c; } .tip-box a { color: #3498db; text-decoration: none; } </style> </head> <body> <div class="tip-box"> <h2>访问受限</h2> <p>您需要先登录才能查看此内容。</p> <p><a href="/member/index.php">点击此处登录</a></p> </div> </body> </html>
- 在你的模板目录(通常是
-
在目标模板文件中添加判断逻辑:
(图片来源网络,侵删)- 打开你想要设置登录限制的模板文件(
article_article.htm)。 - 显示的核心位置(
{dede:field.body/}标签之前或之后),添加以下代码:
{dede:php} // 检查用户是否已登录 // $cuserLogin 是 DedeCMS 的全局登录对象,如果用户已登录,它会是用户对象,否则为 false if (empty($cuserLogin) || $cuserLogin->getUserID() <= 0) { // 用户未登录,执行跳转或包含提示页面 // 方法A: 使用 header 跳转 (简单粗暴) // header("location:/member/index.php?jumpurl=".urlencode($cfg_phpurl."/".basename(__FILE__))); // exit(); // 方法B: 包含我们准备好的提示页面 (更友好,能保持页面样式) // $this 是当前模板的对象,我们可以用它来解析和包含另一个模板 $this->LoadTemplate($GLOBALS['cfg_basedir'].$GLOBALS['cfg_templets_dir'].'/你的模板名/login_tip.htm'); exit(); // 停止执行当前模板的其余部分 } {/dede:php} - 打开你想要设置登录限制的模板文件(
代码解释:
{dede:php}...{/dede:php}:这是 DedeCMS 的 PHP 代码执行标签。$cuserLogin:这是 DedeCMS 中一个非常重要的全局变量,代表了当前登录的用户,如果用户未登录,它的值是false或者userID为 0。$this->LoadTemplate(...):这是加载并解析另一个模板文件的方法,你需要确保路径正确,指向你刚刚创建的login_tip.htm。exit():在显示提示页面后,必须调用exit()来停止当前页面的继续渲染,否则原始页面的内容(如文章标题、页脚等)还是会显示出来。
修改 PHP 源文件 (功能级控制)
如果你想对整个栏目或特定模型都进行登录控制,修改 PHP 源文件是更直接的方法。
适用场景:一个“付费文章”栏目,里面的所有文章都必须登录后才能查看。
操作步骤:

(图片来源网络,侵删)
-
找到并打开 PHP 文件:
- 根据你要控制的页面类型,找到对应的 PHP 文件,通常它们位于
/include/目录下。- 页:
/include/helpers/archive.helper.php - 列表页:
/include/helpers/list.helper.php - 频道页/封面页:
/include/helpers/channel.helper.php
- 页:
- 根据你要控制的页面类型,找到对应的 PHP 文件,通常它们位于
-
在文件开头添加登录判断:
- 以
archive.helper.php为例,这个文件处理文章的显示逻辑,在它的开头部分(<?php之后),添加如下代码:
<?php // ... 文件顶部可能已经有其他代码 ... // 引入用户登录检测函数 // 如果没有引入,需要手动引入 // require_once(DEDEINC.'/memberlogin.class.php'); // 检查用户是否登录 if (empty($cuserLogin) || $cuserLogin->getUserID() <= 0) { // 用户未登录,跳转到登录页面 // 可以带上当前页面的地址,登录后可以跳转回来 $gourl = $_SERVER['PHP_SELF'] . "?" . $_SERVER['QUERY_STRING']; $loginUrl = "/member/index.php?gourl=" . urlencode($gourl); header("Location:{$loginUrl}"); exit(); } // ... 文件原有的其他代码 ... ?> - 以
代码解释:
- 这种方法是在服务器端进行判断,在页面内容生成之前就进行拦截。
$_SERVER['PHP_SELF'] . "?" . $_SERVER['QUERY_STRING']:可以获取当前页面的完整 URL,用于登录后跳转回来,用户体验更好。- 注意:修改核心文件后,如果未来升级 DedeCMS,这些修改可能会被覆盖,需要重新进行修改。
使用自定义模型字段 + 前端判断 (灵活但复杂)
这种方法非常灵活,可以给每篇文章单独设置是否需要登录查看,但实现起来也最复杂。
适用场景:网站中只有少数几篇文章需要登录查看,大部分文章公开。
操作思路:
-
后台创建模型字段:
- 进入“核心” -> “内容模型管理”,选择你的文章模型(如“文章系统”)。
- 点击“字段管理”,添加一个新字段,
- 字段名:
need_login - 字段类型:“单选框”
- 选项值:
是,否 - 默认值:
否
- 字段名:
-
发布文章时设置:
在后台发布或编辑文章时,就会出现一个“是否需要登录”的选项,你可以根据需要勾选。
-
修改模板文件:
- 在
article_article.htm中,使用 DedeCMS 的条件标签{dede:if}来判断这个字段。
{dede:field.need_login runphp='yes'} if(@me == '是') { @me = '<div class="login-required">此内容需要登录后查看。</div>'; } else { @me = ''; // 如果不需要登录,显示空内容 } {/dede:field.need_login} {dede:php} // 如果需要登录,且用户未登录,则显示提示并停止渲染 if (strpos(@me, 'login-required') !== false && (empty($cuserLogin) || $cuserLogin->getUserID() <= 0)) { // 这里可以复用方法一的提示页面 $this->LoadTemplate($GLOBALS['cfg_basedir'].$GLOBALS['cfg_templets_dir'].'/你的模板名/login_tip.htm'); exit(); } {/dede:php} <!-- 正常的文章内容 --> {dede:field.body/} - 在
这种方法结合了模型字段和后端逻辑,虽然步骤多,但可控性最强。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
{dede:php} |
规范、安全、不修改核心文件、升级无忧 | 需要懂一点 PHP,路径要写对 | ⭐⭐⭐⭐⭐ (强烈推荐) |
| 修改 PHP 源文件 | 控制力强,适合批量操作(如整个栏目) | 修改核心文件,升级后可能丢失 | ⭐⭐⭐ (适用于特定需求) |
| 自定义字段 | 灵活性极高,可精细化控制每篇内容 | 实现复杂,需要后台和前端配合 | ⭐⭐ (适用于特殊需求) |
对于绝大多数情况,强烈推荐使用方法一,它既实现了功能,又保持了 DedeCMS 模块的整洁性和可维护性。
